Android应用开启strict shrink mode时如何避免运行时异常?
针对Nok Nok库资源混淆导致运行时异常的解决方案
1. 定位库依赖的具体资源
不想全量保留raw资源的话,得先搞清楚Nok Nok到底在调用哪些资源:
- 开启R8详细日志:在
gradle.properties里添加两行配置:
构建release包后,查看R8输出日志或android.enableR8.fullMode=true android.enableR8.logging=truebuild/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
相关产品推荐
相关产品推荐

