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

如何用R8配置规则仅暴露Android Kotlin库的公共方法?

解决Kotlin Object类仅暴露公共方法/字段的R8配置问题

首先,你的问题核心在于Kotlin object类编译后的Java字节码结构和普通类不同,会默认生成不少内部成员(比如INSTANCE静态字段、构造方法、Jacoco相关方法等),加上当前的ProGuard规则没有精准过滤非公共成员,导致客户端仍能看到私有/内部方法。

修正后的R8规则(proguard-rules.pro)

# 保留UserManager类的完整类名,避免被混淆或删除
-keep class com.comp.sdk.UserManager

# 精准保留公共方法、公共字段,以及Kotlin Object必须的INSTANCE静态字段
-keepclassmembers class com.comp.sdk.UserManager {
    public <methods>;
    public <fields>;
    public static final com.comp.sdk.UserManager INSTANCE;
}

# 强制移除所有非公共的方法和字段,包括Kotlin自动生成的内部私有成员
-assumenosideeffects class com.comp.sdk.UserManager {
    private <methods>;
    private <fields>;
    private void <init>();
    private static void $jacocoInit();
}

规则说明

  1. -keep class com.comp.sdk.UserManager:确保类本身不被R8删除或混淆类名,客户端能正常引用这个类。
  2. -keepclassmembers 块:
    • public <methods>;:仅保留类中的所有公共方法
    • public <fields>;:仅保留类中的所有公共字段
    • public static final com.comp.sdk.UserManager INSTANCE;:Kotlin object的实例通过这个静态字段暴露,必须保留,否则客户端无法访问该单例对象。
  3. -assumenosideeffects 块:告诉R8这些私有成员没有外部副作用,可以安全地从最终的AAR中移除,彻底避免客户端看到这些内容。

补充Gradle配置优化

你当前的Gradle配置缺少默认的R8优化规则,建议补充上,确保R8能执行完整的代码缩减:

buildTypes {
    release {
        minifyEnabled true
        // 加入默认的Android优化规则,再叠加自定义规则
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

验证方法

构建release版AAR后,用反编译工具(比如JD-GUI)打开AAR中的classes.jar,查看com.comp.sdk.UserManager类,应该只能看到公共方法、公共字段和INSTANCE静态字段,私有/内部成员会被完全移除。

内容的提问来源于stack exchange,提问作者Matrix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:40:48