web-dev-qa-db-ja.com

Android Proguardがすべてのログメッセージを削除しない

難読化されたAndroidアプリケーションを作成したい。そのためにProGuardを使用している。すべてのLog。*メッセージを自動的に削除したい。どうすればよいですか? this 投稿しますが、それでも取得できます(デコンパイラーを使用して難読化を確認します)。
proguard-project.txtは次のとおりです。

-injars       libs/In.jar
-outjars      libs/Out.jar
#-libraryjars  <Java.home>/lib/rt.jar
-libraryjars C:/Users/thomas/Android-sdks/platforms/Android-7/Android.jar

-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class * {
    public protected *;
}

-keepclassmembernames class * {
    Java.lang.Class class$(Java.lang.String);
    Java.lang.Class class$(Java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

-keepclassmembers class * implements Java.io.Serializable {
    static final long serialVersionUID;
    private static final Java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(Java.io.ObjectOutputStream);
    private void readObject(Java.io.ObjectInputStream);
    Java.lang.Object writeReplace();
    Java.lang.Object readResolve();
}
-assumenosideeffects class Android.util.Log {
    public static *** d(...);
    public static *** e(...);
}

どんな助けでもいただければ幸いです。
ありがとう。

23
Thomas Kaliakos

これにより、すべてのデバッグLog.d(TAG, "...");およびエラーLog.e(TAG, "...")呼び出しのみが削除されます。

-assumenosideeffects class Android.util.Log {
    public static *** d(...);
    public static *** e(...);
}

すべてのログ呼び出しを削除するには、次を使用します。

-assumenosideeffects class Android.util.Log { *; }
40
yorkw

デフォルトのAndroid Proguard構成は最適化を無効にします。これを有効にするには、プロジェクトのproject.propertiesファイルでproguard-Android.txtの代わりにproguard-Android-optimize.txtを使用します

18
Gallal

プロガードに頭を包むことができないように見える人のために、あなたはあなたが2つのことをすることを確認しなければなりません。

1:@yorkwから

-assumenosideeffects class Android.util.Log { *; }

2:@Gallalから

プロジェクトのproject.propertiesファイルで次を使用します。

proguard.config=${sdk.dir}/tools/proguard/proguard-Android-optimize.txt:proguard-project.txt

の代わりに

proguard.config=${sdk.dir}/tools/proguard/proguard-Android.txt:proguard-project.txt

これは、SDKに含まれているため、「すぐに使用できる」2つのプロガードオプションがあるためです。

Android-adk > tools > proguard

これには2つのファイルが含まれています。

proguard-Android.txt
proguard-Android-optimize.txt

それが他の誰かの助けになることを願っています。

12
user2676468

Android Studioを使用している場合は、メインアプリケーションのbuild.gradleを変更する必要があります。

Gradleファイルで、デフォルトファイルとしてproguard-Android-optimize.txtの使用法を指定する必要があります。

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'

        // With the file below, it does not work!
        //proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
    }
}

実際、デフォルトのproguard-Android.txtファイルでは、次の2つのフラグで最適化が無効になっています。

-dontoptimize
-dontpreverify

proguard-Android-optimize.txtファイルはこれらの行を追加しないため、assumenosideeffectsが機能するようになりました。

次に、Eclipseなどの他の回答で述べたように、メインのプロガードファイルに次の行を追加する必要があります。

-assumenosideeffects class Android.util.Log {
    public static *** d(...);
    public static *** e(...);
}
10