使用Gradle Kotlin脚本配置yGuard混淆Kotlin公共库JAR时,如何保留指定类和方法不被混淆?
Gradle Kotlin脚本配置yGuard混淆Kotlin公共库JAR时,如何保留指定类和方法不被混淆?
看起来你遇到的问题核心是yGuard的保留规则签名不匹配,导致它没能识别出你想要保留的类和方法,所以才把所有内容都混淆了。我帮你梳理下问题,然后给出调整后的配置:
1. 问题根源:签名不匹配
你当前配置里的方法签名写的是boolean doProcess(),但实际你的Kotlin方法doProcess是:
- 无返回值(Kotlin的
Unit对应Java编译后的void) - 带有一个
paramX: Object参数
yGuard是基于Java字节码的签名来匹配规则的,签名不匹配的话,它就不会保留目标方法,自然整个类都会被混淆。
2. 调整yGuard的保留规则
你需要在keep块里同时保留类本身和对应的方法(包括构造方法,如果外部需要实例化的话),修改后的rename块配置如下:
"rename"("logfile" to "${projectDir}/build/${rootProject.name}_renamelog.xml") { // Obfuscation settings "keep" { // 保留ProcessUtil类的完整类名与包路径 "class"("name" to "my.x.y.ProcessUtil") // 保留doProcess方法,严格匹配Java字节码签名:void doProcess(java.lang.Object) "method"( "name" to "void doProcess(java.lang.Object)", "class" to "my.x.y.ProcessUtil" ) // 如果外部需要实例化这个类,必须保留构造方法(字节码中构造方法名称为<init>) "method"( "name" to "void <init>(java.lang.Object, java.lang.Object)", "class" to "my.x.y.ProcessUtil" ) } }
3. 关键细节说明
- 类的保留:
"class"元素确保my.x.y.ProcessUtil的类名和包路径不会被混淆,外部调用方才能正确找到这个类。 - 方法签名:必须严格对应Java字节码的格式,Kotlin的
Unit会编译成void,参数类型要写完整的Java类名(比如java.lang.Object)。 - 构造方法:如果你的库用户需要通过
ProcessUtil(param1, param2)实例化类,一定要保留构造方法,它在字节码中的固定名称是<init>。
4. 关于shrink功能(可选)
如果之后你要启用shrink块移除未使用的代码,同样需要把这些保留规则复制到shrink的keep块里,避免yGuard误删你需要公开的类和方法。
备注:内容来源于stack exchange,提问作者Alex1024
相关产品推荐
相关产品推荐

