Android
ProGuard - コードの難読化と縮小
サーチ…
広く使われているライブラリのいくつかのルール
現在、以下のライブラリの規則が含まれています:
- バターナイフ
- RxJava
- Androidサポートライブラリ
- Androidデザインサポートライブラリ
- 改装
- GsonとJackson
- オットー
- Crashlitycs
- ピカソ
- ボレー
- OkHttp3
- パーセルブル
#Butterknife
-keep class butterknife.** { *; }
-keepnames class * { @butterknife.Bind *;}
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
@butterknife.* <methods>;
}
# rxjava
-keep class rx.schedulers.Schedulers {
public static <methods>;
}
-keep class rx.schedulers.ImmediateScheduler {
public <methods>;
}
-keep class rx.schedulers.TestScheduler {
public <methods>;
}
-keep class rx.schedulers.Schedulers {
public static ** test();
}
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
# Support library
-dontwarn android.support.**
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.** { *; }
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
# support design
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }
# retrofit
-dontwarn okio.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**
-dontwarn rx.**
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>;
}
-keep class sun.misc.Unsafe { *; }
#your package path where your gson models are stored
-keep class com.abc.model.** { *; }
# Keep these for GSON and Jackson
-keepattributes Signature
-keepattributes *Annotation*
-keepattributes EnclosingMethod
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
#keep otto
-keepattributes *Annotation*
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
# Crashlitycs 2.+
-keep class com.crashlytics.** { *; }
-keep class com.crashlytics.android.**
-keepattributes SourceFile, LineNumberTable, *Annotation*
# If you are using custom exceptions, add this line so that custom exception types are skipped during obfuscation:
-keep public class * extends java.lang.Exception
# For Fabric to properly de-obfuscate your crash reports, you need to remove this line from your ProGuard config:
# -printmapping mapping.txt
# Picasso
-dontwarn com.squareup.okhttp.**
# Volley
-keep class com.android.volley.toolbox.ImageLoader { *; }
# OkHttp3
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-dontwarn okhttp3.**
# Needed for Parcelable/SafeParcelable Creators to not get stripped
-keepnames class * implements android.os.Parcelable {
public static final ** CREATOR;
}
ビルドにProGuardを有効にする
アプリケーションのProGuard
構成を有効にするには、モジュールレベルのグラデルファイルで有効にする必要があります。 minifyEnabled true
の値をminifyEnabled true
に設定する必要がありminifyEnabled true
。
また、有効にすることができshrinkResources true
リソースが削除されますProGuard
未使用としてフラッグスを。
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
上記のコードは、リリースされたapkにproguard-rules.pro
(Eclipseの "proguard-project.txt")に含まれるProGuardの設定を適用します。
後でスタックトレースで例外が発生した行を特定できるようにするには、 "proguard-rules.pro"に次の行を含める必要があります。
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
EclipseでProguardを有効にするには、 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
を「project.properties」に追加しproguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
。
ビルド時にトレースログ(およびその他の)ステートメントを削除する
特定のメソッドへの呼び出しを削除したい場合、voidを返し、副作用がないものと仮定すると(システムの値、参照引数、静的な値などは変更されません)、ProGuardにビルドが完了した後に出力されます。
たとえば、これはデバッグに役立つデバッグ/冗長ロギングステートメントを削除するのに便利ですが、実動ではそれらのための文字列を生成する必要はありません。
# Remove the debug and verbose level Logging statements.
# That means the code to generate the arguments to these methods will also not be called.
# ONLY WORKS IF -dontoptimize IS _NOT_ USED in any ProGuard configs
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
注:ProGuardの設定で-dontoptimize
を使用して未使用コードを縮小/削除していない場合は、ステートメントが削除されません。 (しかし、誰が未使用のコードを削除したくないでしょうか?)
注2:この呼び出しはlogの呼び出しを削除しますが、コードは保護されません。ストリングは実際に生成されたAPKに残ります。 この記事の続きを読む
ハッカーからコードを保護する
難読化は、コードがハッカーによって解凍された場合に理解しにくくすることで、コード保護の魔法の解決策とみなされます。
しかし、 Log.x(..)
削除すると実際にハッカーが必要とする情報が削除されると思っているなら、厄介な驚きがあります。
すべてのログ通話を削除するには:
-assumenosideeffects class android.util.Log {
public static *** d(...);
...etc
}
実際にログ呼び出し自体は削除されますが、通常はStringには入れません 。
たとえば、ログ呼び出しの中で、次のような共通のログメッセージを入力しますLog.d(MyTag,"Score="+score);
コンパイラは、Log呼び出しの外で+
を '新しいStringBuilder()'に変換します。 ProGuardはこの新しいオブジェクトを変更しません。
あなたのコンパイルされていないコードには、引き続き"Score="
StringBuilder
があり、 score
変数の難読化されたバージョンが追加されています(これをb
に変換したとしましょう)。
今、ハッカーはb
が何であるかを知り、コードを理解します。
あなたのコードからこれらの残差を実際に削除するための良い習慣は、最初にそれらを置く(文字列フォーマッタを使用し、それらを削除するためのproguardルールを使用する)か、 Log
呼び出しを次のようにラップすることです。
if (BuildConfig.DEBUG) {
Log.d(TAG,".."+var);
}
先端:
難読化されたコードがあなた自身でコンパイルされていることでどれくらいうまく保護されているかをテストしてください!
カスタム難読化設定ファイルでProGuardを有効にする
ProGuardは、開発者がコードを難読化し、縮小し、最適化することを可能にします。
#1この手順の最初のステップは、ビルド時にproguardを有効にすることです。
これは、あなたの望むビルドで'minifyEnabled'コマンドをtrueに設定することによって行うことができます
#2第2のステップは、指定されたビルドに対してどのProguardファイルを使用するかを指定することです
これは、適切なファイル名で 'proguardFiles'行を設定することによって行うことができます
buildTypes {
debug {
minifyEnabled false
}
testRelease {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro'
}
productionRelease {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-tests.pro', 'proguard-rules-release.pro'
}
}
#3開発者は、彼が望む規則でプロゴアードファイルを編集することができます。
これはファイルを編集すること(例えば 'proguard-rules-tests.pro')と望ましい制約を加えることによって行うことができます。 次のファイルは、プロガードファイルの例です
// default & basic optimization configurations
-optimizationpasses 5
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-verbose
-dump obfuscation/class_files.txt
-printseeds obfuscation/seeds.txt
-printusage obfuscation/unused.txt // unused classes that are stripped out in the process
-printmapping obfuscation/mapping.txt // mapping file that shows the obfuscated names of the classes after proguad is applied
// the developer can specify keywords for the obfuscation (I myself use fruits for obfuscation names once in a while :-) )
-obfuscationdictionary obfuscation/keywords.txt
-classobfuscationdictionary obfuscation/keywords.txt
-packageobfuscationdictionary obfuscation/keywords.txt
最後に、開発者が新しい.APKファイルを実行および/または生成するたびに、カスタムプロアード構成が適用され、要件を満たします。