【问题标题】:Android: Proguard configuration to obfuscate class names and methodsAndroid:混淆类名和方法的 Proguard 配置
【发布时间】:2016-08-05 15:12:05
【问题描述】:

据我所知,有些类不应该被混淆,而且它们的名称必须像“活动”一样持久化。但是我希望我的代码中的其他类和包被重命名。 这是应用程序文件夹内的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'
}

我将这个 proguard 配置用于我的应用程序 (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>(...);
}

它进行了优化,但是当我在 classes.dex 中检查时,所有类名都保持不变。所以我想知道我在配置文件中遗漏了哪些没有混淆类/方法名称的内容?

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

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

【问题讨论】:

  • 发布你的 gradle 构建文件
  • 在哪里查看混淆结果?我不是 100% 确定,但我认为在我的项目中,混淆的 .dex 文件位于 build/intermediates/transforms/dex/** 中,build/** 中的任何其他类/dex 看起来像是混淆前构建步骤的输出。最终生成的.apk/.aar 应该被混淆,所以如果你解压缩那个,并且类没有被混淆,那么某些东西就不会按预期工作。
  • @Ped7g 我使用 dex2jar 将我的 apk 中的 dex 转换为 jar 文件。然后,我使用jd-gui 反编译 jar 文件,并检查我的代码中没有名称混淆。所有类和包都保持相同的名称。
  • @Ped7g 我尝试使用旧版本的 jd-gui!新版本正确显示混淆代码。似乎一切都很好!感谢您的通知。
  • 哦,我帮忙了吗? :D LOL,很好...(我在文本编辑器中检查结果,通常是对于小的.dex 文件,您可以通过 30-50 秒的时间判断内容是否被混淆,符号位于更靠近末尾.dex/.class)。也许是 jd-gui 的一个特性,如果它在其他地方找到未混淆的 .class/.dex 或 .map 文件,可以解密混淆的字符串?

标签: android obfuscation android-proguard


【解决方案1】:

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

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

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

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

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

同时使用详细选项手动运行 gradle proguard 任务可能有助于确定 proguard 是否已运行以及在哪些文件上运行。

【讨论】:

  • 检查地图文件的petey建议要好得多,只要确保它是新鲜的(修改日期时间== cca.build),您可以轻松检查所有混淆符号(并搜索“敏感”符号来验证它们是否被混淆,正如预期的那样)。无需任何其他工具即可获得混淆成功的详细概述。 (我的二进制方法可以用来验证 .apk 是否真的包含预期的结果,正如地图文件所暗示的那样......如果你真的很偏执)。
【解决方案2】:

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

要快速确认您的应用混淆了您的类,请在进行发布构建时检查生成的 mapping.txt 文件。该文件“提供了原始和混淆的类、方法和字段名称之间的转换。”

这是一个混淆 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

可以在此处的“缩小代码和资源”文章中找到更多信息:https://developer.android.com/studio/build/shrink-code.html

【讨论】:

    【解决方案3】:

    你已经改变了吗

    minifyEnabled=true
    

    应用内部 -> build.gradle?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多