启用ProGuard后Android应用因Bubble-Picker依赖出现空指针异常
解决启用ProGuard后Bubble-Picker引发的NullPointerException问题
这问题我碰到过好多次,基本可以确定是ProGuard混淆/压缩时误处理了Bubble-Picker依赖库的核心代码,导致运行时找不到对应的类或方法,触发空指针异常。给你几个针对性的解决办法:
1. 添加Bubble-Picker专属的ProGuard规则
ProGuard默认会处理所有依赖包的代码,而Bubble-Picker内部依赖的Box2D物理库(错误日志里的org.a.d.*就是它混淆后的包名)没有被正确保留,所以得手动添加规则避免混淆:
在你的proguard-rules.pro文件中加入以下内容:
# 保留Bubble-Picker自身的所有类和接口 -keep class com.github.igalata.bubblepicker.** { *; } -keep interface com.github.igalata.bubblepicker.listener.** { *; } # 保留其依赖的Box2D物理库代码(对应错误日志中的org.a.d包) -keep class org.a.d.** { *; }
2. 检查资源压缩设置
如果你的项目开启了shrinkResources true(资源压缩),可能会误删Bubble-Picker用到的资源文件,也会引发异常。可以先尝试关闭资源压缩,或者添加资源保留规则:
# 保留Bubble-Picker用到的气泡相关资源(根据实际用到的资源调整) -keepresources drawable/bubble_* -keepresources raw/*
3. 先关闭ProGuard验证问题根源
为了确认确实是ProGuard的问题,可以临时修改你的build.gradle(Module级别):
buildTypes { release { minifyEnabled false // 临时关闭混淆 shrinkResources false // 临时关闭资源压缩 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
重新打包运行,如果空指针消失,就说明问题确实出在ProGuard规则上,再回到第一步优化规则即可。
额外建议
- 尝试把Bubble-Picker库更新到最新版本,新版本可能已经自带了适配ProGuard的规则;
- 确保你的项目和库的依赖环境兼容(比如是否使用AndroidX,库是否支持)。
内容的提问来源于stack exchange,提问作者Binil Surendran
相关产品推荐
相关产品推荐

