使 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 完全忽略包的主要内容,如果未能解决你的问题,请参考以下文章