开启minifyEnabled true后Android应用运行时崩溃问题求助
解决开启R8混淆后java.text.Normalizer.normalize触发NullPointerException的问题
问题背景
使用Android Studio 2023.1.1 Canary 10开发的应用,开启minifyEnabled true和shrinkResources true优化体积后,编译正常但运行时触发java.text.Normalizer.normalize处的NullPointerException,关闭混淆则无异常。通过添加-dontobfuscate已定位到错误点并修复NPE,以下是针对该问题的通用解决流程:
解决步骤
定位空指针根源
在proguard-rules.pro中添加-dontobfuscate关闭代码混淆,重新编译运行后,通过崩溃日志找到调用Normalizer.normalize的具体代码位置,检查传入该方法的字符串参数是否存在为null的情况。
修复时直接给参数加非空判断,示例代码:String targetStr = // 你的字符串来源 if (targetStr != null) { String normalizedStr = Normalizer.normalize(targetStr, Normalizer.Form.NFC); // 后续业务逻辑 } else { // 处理null场景,比如赋值空串或跳过该逻辑 }添加ProGuard规则防止R8误优化
如果确认代码本身无null问题,但R8仍对Normalizer相关代码进行了不合理裁剪/混淆,在proguard-rules.pro中添加保护规则:-keep class java.text.Normalizer { public static java.lang.String normalize(java.lang.CharSequence, java.text.Normalizer$Form); } -keep class java.text.Normalizer$Form { *; }这条规则确保R8不会移除Normalizer类的normalize方法,也不会混淆内部的Form枚举类,避免因类/方法缺失导致的异常。
验证修复效果
恢复minifyEnabled true和shrinkResources true,移除-dontobfuscate(若无需再定位问题),重新编译APK/App Bundle并运行,确认NullPointerException不再触发。
内容的提问来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

