关于android:Proguard混淆不起作用

Proguard obfuscating does not work

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

我在gradle文件中使用此构建配置:

1
2
3
4
5
6
7
8
buildTypes {
    debug {
        versionNameSuffix"-Development"
        debuggable true
        runProguard true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    #...

这是我的保护文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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

我正在使用以下命令转储所有已删除的类:

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

如果我只是对" qqq "进行grep命令,我仍然会看到所有完整的软件包名称,但我没有得到任何结果,因此似乎规则repackageclassesflattenpackagehierarchy似乎都被忽略了(我还测试过仅使用一个该行)。知道我错过了什么吗?


哇,这花了很长时间才能解决。刀刀规则打破了一切。我的解决方案是在首页中复制该代码,以及一切如何按预期进行。

以下是固定规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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

对于库模块,似乎构建系统默认情况下会添加"-keeppackagenames ",这将导致软件包名称不被混淆。

您可以尝试使用此替代方法:

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

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