web-dev-qa-db-ja.com

Android St​​udioでProGuardを使用する方法は?

これはAndroid St​​udioでの私の最初のプロジェクトであり、アプリのコードは難読化されていません。 build.gradleファイルでこの構成を使用しています: enter image description here

[ビルド]> [署名済みAPKの生成...]を使用し、[Proguardの実行]をオンにします。そして、Apk_OneClick.v4.2を使用してテストしたとき、私のコードは非常に読みやすくなっています。

enter image description here

私を助けてください。 :(

96

おそらく、実際には署名ウィザードを使用してAPKのリリースビルドに署名しているわけではありません。次のコマンドを使用して、コマンドラインからリリースAPKをビルドできます。

./gradlew assembleRelease

または、以下からリリースバリアントを選択できます。 ビルドバリアント GUIから表示してビルドします。

IDE main window showing Build Variants

70
Scott Barta

Proguard実装用にbuild.gradleファイルを構成できます。モジュールレベルでもプロジェクトレベルでもかまいません。

 buildTypes {

    debug {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'

    }

}

表示される構成はデバッグレベル用ですが、buildTypes内に以下に示すような独自のビルドフレーバーを記述できます。

    myproductionbuild{
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
    }

minifyEnabled falseとproductionbuildおよび他のビルドをminifyEnabled trueとしてデバッグする方が良いでしょう。

モジュールまたはプロジェクトフォルダーのルートにあるproguard-rules.txtファイルを次のようにコピーします。

$YOUR_PROJECT_DIR\YoutProject\yourmodule\proguard-rules.txt

必要に応じてファイルの名前を変更できます。構成後、buildTypeに従ってビルドを生成するために使用可能な3つのオプションのいずれかを使用します

  1. 右側のパネルでgradleタスクに移動し、モジュールタスクの下でassembleRelease/assemble(#your_defined_buildtype)を検索します

  2. 左パネルのビルドバリアントに移動し、ドロップダウンからビルドを選択します

  3. エクスプローラーでプロジェクトのルートディレクトリに移動し、cmd/terminalを開いて実行します

Linux ./gradlew assembleRelease or assemble(#your_defined_buildtype)

Windows gradlew assembleRelease or assemble(#your_defined_buildtype)

Apkはmodule/buildディレクトリにあります。

構成およびプロガードファイルの場所の詳細については、リンクを参照してください。

http://tools.Android.com/tech-docs/new-build-system/user-guide#TOC-Running-ProGuard

50
pyus13

注:今ではなく

runProguard false

あなたが使用する必要があります

minifyEnabled false
39
ViliusK

「proguard-rules.txt」ファイルの名前を「proguard-Android.txt」に変更し、gradleファイル内の「proguard-rules.txt」への参照を削除してください。 getDefaultProguardFile(...)呼び出しは、プロジェクト内ではなくGoogleが提供する別のデフォルトのproguardファイルを参照します。したがって、これも削除して、ここでgradleファイルを読み取ります:

buildTypes {
    release {
        runProguard true
        proguardFile 'proguard-Android.txt'
    }
}
1
SK9

Android Sutdioのproguard-rules.proファイルに追加する必要がある最も一般的なProguardルールの一部を次に示します。

バターナイフ

 -keep class butterknife.** { *; }
 -dontwarn butterknife.internal.**
 -keep class **$$ViewBinder { *; }
 -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
  }
 -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
  }

レトロフィット

 -dontwarn retrofit.**
 -keep class retrofit.** { *; }
 -keepattributes Signature
 -keepattributes Exceptions

OkHttp

 -keepattributes Signature
 -keepattributes *Annotation*
 -keep class okhttp3.** { *; }
 -keep interface okhttp3.** { *; }
 -dontwarn okhttp3.** 
 -keep class Sun.misc.Unsafe { *; }
 -dontwarn Java.nio.file.*
 -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 

Gson

 -keep class Sun.misc.Unsafe { *; }
 -keep class com.google.gson.stream.** { *; }

コードの難読化

-keepclassmembers class com.yourname.models** { <fields>; }
0
Bhavik Nathani

ここでの他の回答は、proguardの使用に関する優れたリファレンスです。しかし、私がそれに遭遇したことを議論した問題は、心のベンダーではありませんでした。署名付きリリース.apkを生成すると、アプリの/releaseフォルダーに配置されますが、私のアプリには/releaseフォルダーにないapkがありました。したがって、間違ったapkを逆コンパイルするのに何時間も費やしましたが、なぜプロガードの変更が影響を与えなかったのでしょうか。これが誰かを助けることを願っています!

0
user4757074