2016-12-21 8 views
0

ProGuardをコマンドラインから実行する方法を知りたいと思います。ProGuardをAndroidスタジオなしで使用する

私はIonicフレームワークでCordovaを使用してハイブリッドアプリを構築しました。私の推奨事項の1つは、ProGuardを使用してJavaコードを難読化し、ログ呼び出しを削除することでした。

私は現在AndroidスタジオまたはEclipseを使用していません。私は、Ionic FrameworkとAngular 1.Xでプロジェクトを構築し、デバイス上の機能に必要なCordovaプラグインを使用しています。私はJenkinsにコマンドラインから私のリリースをビルドさせる。

私はここにレイアウトされた手順に従ってみました: https://developer.android.com/studio/build/shrink-code.html#keep-code 、ここで: Disable LogCat Output COMPLETELY in release Android app?

と同様に適用可能なビットを見つけるために、様々な質問/回答を通じてコーミング。

私のbuild.gradleは./vendorディレクトリに保存され、Ionicから自動生成された/ default build.gradleを上書きするためにコピーされます。 これは、ProGuardのを可能にするためにこれを持っている:

buildTypes { 
     debug { 
      debuggable true 
      minifyEnabled false 
     } 

     release { 
      signingConfig signingConfigs.release 
      debuggable false 
      minifyEnabled true 
      runProguard true 
      proguardFile 'customProGuard.txt' 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
       'proguard-android.txt' 
     } 
    } 

私も私のproject.propertiesファイルに次の行のさまざまなバージョンを試してみた:それは何もされていないよう proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txtまたはproguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt

。私はapkのファイルサイズが一点で変わったと思っていましたが、JD-GUIのクラスを見ると、私はまだ事をはっきりと識別することができます。だから私はそれが実行されているとは思わない。どんな助けもありがとう。

ジェンキンスさんは、次のコマンドを実行します:

cp -R vendor/build.gradle platforms/android/build.gradle 
ionic resources 
ionic prepare android 
ionic build android --release 
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore $KEYSTORE platforms/android/build/outputs/apk/android-release-unsigned.apk 
-keypass $KEY_PASSWORD -storepass $KEYSTORE_PASSWORD $ALIAS && \ ./zipalign -v 4 platforms/android/build/outputs/apk/android-release-unsigned.apk "build/appNameHere.apk" 

「イオンビルドアンドロイド--releaseは」最終的にビルドを参照する複数の行を持つ./platforms/android/cordova/lib/builders/GradleBuilder.jsを呼び出している間。 Gradleでは、私はメインの最も重要な一つは、それがGradleBuilder.buildで使用するファイルを読み込んでいるvar buildGradle = fs.readFileSync(path.join(this.root, 'build.gradle'), 'utf8');ていると思う:

GradleBuilder.prototype.build = function(opts) { 
    var wrapper = path.join(this.root, 'gradlew'); 
    var args = this.getArgs(opts.buildType == 'debug' ? 'debug' : 'release', opts); 
    return Q().then(function() { 
     return spawn(wrapper, args, {stdio: 'inherit'}); 
    }); 
}; 
+0

ジェンキンスが実行しているgradleコマンドと出力の一部を入力してください。 –

+0

@StefanCrain:Jenkinsが使用するコマンドと、Gradleとの関係をどのように信じているかを追加しました。アウトプットが出る限り、私は何が関係しているか分からなかった。 'JAVA_HOME =/Library/Java/JavaVirtualMachines/jdk1.7.0_79。JDK /コンテンツ/ホーム :事前に作成 :preReleaseBuild :checkReleaseManifest :CordovaLib:compileLint :CordovaLib:CordovaLib:UP-TO-DATE copyReleaseLint mergeReleaseProguardFiles UP-TO-DATE'等... 'SUCCESSFUL を構築合計時間:12.435秒 次のapkをビルドしました: 'できれば' jarが署名されました。 build/appNameHere.apk(4)のアラインメントの確認... 50 META-INF/MANIFEST.MF(OK-compressed) ' –

答えて

0

多くの試行錯誤の後に、その答えは、私はこのブロックを必要とすることをあることが判明しました別のsegmeに配置されるコードの私のbuild.gradleファイルのNT。

release { 
     signingConfig signingConfigs.release 
     debuggable false 
     minifyEnabled true 
     proguardFile 'customProGuard.txt' 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 
      'proguard-android.txt' 
    } 

これは決して達成されませんでした。ブロックをandroid { }ブロックに置くことで、他の関数やif文には入れませんが、一貫して実行され、期待どおりに動作します。

残念ながら、Ionicがリフレクションを使用する方法のために、私はそれから多くの難読化の使用を得ることができません(Apache Jira Bug)。 ProGuardを使用して上記のリンクされた記事に従ってコンソールログを削除することは可能です。

関連する問題