【问题标题】:Proguard obfuscating does not workProguard 混淆不起作用
【发布时间】:2014-06-26 07:07:39
【问题描述】:

我正在尝试混淆我的包名,包括我用过的库之一。

我在我的 gradle 文件中使用这个构建配置:

buildTypes {
    debug {
        versionNameSuffix "-Development"
        debuggable true
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    #...

这是我的 proguard 文件:

# Butterknife
-dontwarn butterknife.internal.**
-keep class **$$ViewInjector { *; }
-keepnames class * { @butterknife.InjectView *;}

# OrmLite uses reflection
-keepclassmembers class com.j256.** { *; }
-keep class my.package.name.database.** { *; }
-keep class com.j256.**

#test
-repackageclasses 'qqq1'
-flattenpackagehierarchy 'qqq2'
-allowaccessmodification
-forceprocessing

我正在使用此命令转储所有 dexed 类:

7z x -aoa my.apk classes.dex && dexdump classes.dex | grep "Class desc" | less

如果我只是 grep for "qqq",我仍然会看到所有完整的包名称我没有得到任何结果,所以似乎 repackageclassesflattenpackagehierarchy 这两个规则似乎都被忽略了(我也测试只使用其中一条线)。知道我错过了什么吗?

【问题讨论】:

  • (我删除了我原来的问题并重新表述了一点):你能告诉我们你在转储中找到的一个最小示例类的来源,你会期望它的包应该更改为qqq1还是qqq2?
  • 这太简单了,所以我不会编辑我的问题。例如。一个简单的类,如视图持有者,它只包含一些引用而不扩展 View 或 Activity 等。该类应该从 com.example.android.utils.ViewHolderExample 重命名为 qqq1.A,如果我将 'qqq1' 替换为 '' 和以防万一对于某些即使a.b.c.d.A 也无法实现的限制,我唯一期望的是不再有“com.example”的痕迹。
  • 有些类不能被混淆,因为它们的名字是在 AndroidManifest.xml 中指定的(例如活动)。

标签: android obfuscation proguard


【解决方案1】:

对于库模块,构建系统似乎默认添加了“-keeppackagenames”,这将导致包名不会被混淆。

您可以尝试使用此解决方法:

Add "-keeppackagenames !**" to disable -keeppackagenames being injected by the build system.

通过:https://code.google.com/p/android/issues/detail?id=67587

【讨论】:

    【解决方案2】:

    哇,这需要很长时间才能解决。黄油刀规则打破了一切。我的解决方案是从主页上 grep 那个,以及一切如何按预期工作。

    以下是固定规则:

    # Butterknife
    -keep class butterknife.** { *; }
    -dontwarn butterknife.internal.**
    -keep class **$$ViewBinder { *; }
    
    -keepclasseswithmembernames class * {
        @butterknife.* <fields>;
    }
    
    -keepclasseswithmembernames class * {
        @butterknife.* <methods>;
    }
    
    # OrmLite uses reflection
    -keepclassmembers class com.j256.** { *; }
    -keep class my.package.name.database.** { *; }
    -keep class com.j256.**
    
    #test
    -repackageclasses 'qqq1'
    -flattenpackagehierarchy 'qqq2'
    -allowaccessmodification
    -forceprocessing
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多