Android:用于混淆 class 名称和方法的 Proguard 配置

Android: Proguard configuration to obfuscate class names and methods

据我所知,有些 class 不应混淆,而且它们的名称必须像 'Activities' 一样保留。但是我希望重命名代码中的其他 classes 和包。 这是 app 文件夹中的 build.gradle: 应用插件:'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "apt.eve.good.morning"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
}

我在我的应用程序中使用此混淆器配置 (app\proguard-rules.pro):

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-useuniqueclassmembernames
-verbose

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}
-allowobfuscations class *
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep

-keep @android.support.annotation.Keep class * {*;}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <methods>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}

它进行了优化,但当我检查我的 classses.dex 内部时,所有 class 名称都保持不变。所以我想知道我在我的配置文件中遗漏了什么没有混淆 class/method 名称?

P.S.1 我已经搜索了几个问题,但我无法想象这里出了什么问题。

P.S.2 我已经正确配置了我的 android studio,proguard 配置的更改适用于我发布的 .apk 文件,没有任何问题。

你已经改变了吗

minifyEnabled=true

应用程序内部 -> build.gradle?

 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    } 

确保检查经过混淆处理的 .dex 文件。

使用常见的 gradle 构建脚本,build/** 文件夹可能包含多个未混淆版本的 .dex/.class 文件。

最终生成的 .apk/.aar 应该被混淆,所以如果你正在解压缩那个,并且 classes 没有被混淆,那么某些东西不会按预期工作。

如 OP 所述,验证您的 [反汇编] 工具是否正常工作也很重要。

从 .apk 查看 .dex 的二进制形式通常足以发现 [un] 混淆的符号(尝试使用未混淆的 .class,即使在文本编辑器中,这些符号也很容易阅读,在混淆的 .dex 中"aa"、"ab"、...等符号链通常也很明显。

此外,运行手动启用 gradle proguard 任务并启用详细选项可能有助于确定 proguard 是否 运行 以及基于哪些文件。

基于您的 gradle 文件 (minifyEnabled=true) 和 proguard 配置。你看起来已经很好了。

要快速确认您的应用混淆了您的 类,请在发布版本时检查生成的 mapping.txt 文件。此文件 "provides a translation between the original and obfuscated class, method, and field names."

这是一个混淆 hockeyapp 库的 mapping.txt 示例:

net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a:
    java.util.Queue queue -> a
    boolean downloadRunning -> b
    67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a

可以在此处的 "Shrink Your Code and Resources" 文章中找到更多信息:https://developer.android.com/studio/build/shrink-code.html