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

Android应用开启strict shrink mode时如何避免运行时异常?

针对Nok Nok库资源混淆导致运行时异常的解决方案

1. 定位库依赖的具体资源

不想全量保留raw资源的话,得先搞清楚Nok Nok到底在调用哪些资源:

  • 开启R8详细日志:在gradle.properties里添加两行配置:
    android.enableR8.fullMode=true
    android.enableR8.logging=true
    
    构建release包后,查看R8输出日志或build/outputs/mapping/release/mapping.txt,找Nok Nok相关类关联的资源ID对应的资源名。
  • 反编译混淆后的APK:用Apktool解包,直接查看Nok Nok的代码逻辑,定位它动态引用的资源名称(这类库一般会硬编码资源名,比如"noknok_config"这类字符串)。

2. 精准添加资源保留规则

找到具体资源后,在keep_rules.xml里精准补充,比如发现库依赖@raw/noknok_config和@raw/noknok_data,修改后的配置如下:

<resources xmlns:tools="http://schemas.android.com/tools"
    tools:shrinkMode="strict"
    tools:keep="@raw/gateway_placement_video, @string/*, @raw/video_call_ringtone, @drawable/ic_avatar_*, @drawable/ic_woman_avatar_*, @raw/noknok_config, @raw/noknok_data"/>

3. 给库添加类混淆保留规则

报错是Gson类型转换问题,大概率是库的类被混淆导致的,在proguard-rules.pro里添加:

# 保留Nok Nok库所有类不被混淆(替换成实际包名)
-keep class com.noknok.** { *; }
# 保留Gson相关类及必要属性,避免解析异常
-keep class com.google.gson.** { *; }
-keepattributes Signature, InnerClasses

如果不知道库的包名,反编译APK后找到Nok Nok相关类的包路径替换即可。

4. 缩小范围保留库专属资源

实在找不到具体资源的话,别全量保留raw,改成只保留Nok Nok前缀的资源,在build.gradle的release构建类型里配置:

android {
    buildTypes {
        release {
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 只保留Nok Nok专属的资源,根据实际前缀调整
            keepResources += ['**/noknok_*.raw', '**/noknok_*.drawable']
        }
    }
}

5. 联系官方获取配置

如果以上方法都无效,直接给Nok Nok库的官方提需求,正规第三方库应该提供集成所需的混淆和资源保留规则,这是他们的责任。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:37:48