You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:13:09