サーチ…


広く使われているライブラリのいくつかのルール

現在、以下のライブラリの規則が含まれています:

  1. バターナイフ
  2. RxJava
  3. Androidサポートライブラリ
  4. Androidデザインサポートライブラリ
  5. 改装
  6. GsonとJackson
  7. オットー
  8. Crashlitycs
  9. ピカソ
  10. ボレー
  11. OkHttp3
  12. パーセルブル
#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);
    }

先端:

難読化されたコードがあなた自身でコンパイルされていることでどれくらいうまく保護されているかをテストしてください!

  1. dex2jar - apkをjar ファイルに変換する
  2. jd - jar ファイルをデコンパイルし、GUIエディタで開きます

カスタム難読化設定ファイルで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ファイルを実行および/または生成するたびに、カスタムプロアード構成が適用され、要件を満たします。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow