使 Proguard 完全忽略包

Posted

技术标签:

【中文标题】使 Proguard 完全忽略包【英文标题】:Make Proguard completely ignore package 【发布时间】:2015-09-16 15:49:24 【问题描述】:

是否可以启用 Proguard 但保持某些类完全不受 Proguard 影响?我的 proguard 配置文件中有以下几行:

-keep class com.heyzap.**  *; 

但正如我所见,Heyzap 包中的类在 Proguard 通过后实际上已经发生了变化(它们与我最初在 Heyzap jar 文件中的不同)。

我不知道 Proguard 究竟对 Heyzap SDK 做了什么,但是在此构建过程失败后,将 jar 文件转换为 dex 格式并出现错误:

EXCEPTION FROM SIMULATION: com.android.dx.rop.cst.CstInterfaceMethodRef cannot be cast to com.android.dx.rop.cst.CstMethodRef

我还在我的配置中启用了 -dontoptimize 选项。

Heyzap 建议使用这一行来保持他们的 SDK 不受影响:

-libraryjars libs/heyzap-ads-sdk.jar 

但 Android Studio 无法编译添加此行的项目,因为 heyzap-ads-sdk.jar 已自动添加到 -injars 列表中(它会抛出 '同一个输入jar被指定了两次。'错误)。

【问题讨论】:

【参考方案1】:

要让 ProGuard 完全忽略你可以使用的包:

-keepclasseswithmembers class com.my.package.** *;

但是,你得到的错误意味着别的东西,你应该尝试从你的 ProGuard 文件中删除 -libraryjars libs/heyzap-ads-sdk.jar,因为这个库可能正在被添加在你的 build.gradle 文件中的其他地方,可能是这一行:

compile fileTree(dir: 'libs', include: ['*.jar'])

【讨论】:

我尝试了“keepclasseswithmembers”,但我的课程仍然被修改。是的,当然我不能使用“libraryjars”选项,因为 Heyzap jar 是从我的 build.gradle 添加的。但我需要让 proguard 远离它,就像使用“libraryjars”一样。

以上是关于使 Proguard 完全忽略包的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能告诉 proguard 假设一个包没有被使用?

运行具有 AQuery 库的 ProGuard

proguard 不会忽略引用的库

使用 Android proguard 忽略外部库

Android Studio - Proguard“保留”规则被忽略?

Ant 似乎在打包 apk 时忽略了 Proguard 生成的 jar