これはAndroid Studioでの私の最初のプロジェクトであり、アプリのコードは難読化されていません。 build.gradleファイルでこの構成を使用しています:
[ビルド]> [署名済みAPKの生成...]を使用し、[Proguardの実行]をオンにします。そして、Apk_OneClick.v4.2を使用してテストしたとき、私のコードは非常に読みやすくなっています。
私を助けてください。 :(
おそらく、実際には署名ウィザードを使用してAPKのリリースビルドに署名しているわけではありません。次のコマンドを使用して、コマンドラインからリリースAPKをビルドできます。
./gradlew assembleRelease
または、以下からリリースバリアントを選択できます。 ビルドバリアント GUIから表示してビルドします。
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つのオプションのいずれかを使用します
右側のパネルでgradleタスクに移動し、モジュールタスクの下でassembleRelease/assemble(#your_defined_buildtype)
を検索します
左パネルのビルドバリアントに移動し、ドロップダウンからビルドを選択します
エクスプローラーでプロジェクトのルートディレクトリに移動し、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
注:今ではなく
runProguard false
あなたが使用する必要があります
minifyEnabled false
「proguard-rules.txt」ファイルの名前を「proguard-Android.txt」に変更し、gradleファイル内の「proguard-rules.txt」への参照を削除してください。 getDefaultProguardFile(...)
呼び出しは、プロジェクト内ではなくGoogleが提供する別のデフォルトのproguardファイルを参照します。したがって、これも削除して、ここでgradleファイルを読み取ります:
buildTypes {
release {
runProguard true
proguardFile 'proguard-Android.txt'
}
}
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>; }
ここでの他の回答は、proguardの使用に関する優れたリファレンスです。しかし、私がそれに遭遇したことを議論した問題は、心のベンダーではありませんでした。署名付きリリース.apkを生成すると、アプリの/release
フォルダーに配置されますが、私のアプリには/release
フォルダーにないapkがありました。したがって、間違ったapkを逆コンパイルするのに何時間も費やしましたが、なぜプロガードの変更が影響を与えなかったのでしょうか。これが誰かを助けることを願っています!