Android Billing版本切换后遇NonNull缺失及空指针异常问题
问题1:Billing 4.0.0编译时找不到
androidx.annotation.NonNull 现象
使用Billing 6.0.0时,导入androidx.annotation.NonNull编译正常;降级到4.0.0后,编译报错:
error: cannot find symbol import androidx.annotation.NonNull; ^ symbol: class NonNull location: package androidx.annotation
已添加implementation "androidx.annotation:annotation:1.6.0"依赖,且gradle.properties配置了:
android.useAndroidX=true android.enableJetifier=true
解决方案
- 调整依赖作用域:将
implementation改为api,确保依赖能传递到所有模块:api "androidx.annotation:annotation:1.6.0" - 清理Gradle缓存并重构:
在终端执行命令:./gradlew clean build --refresh-dependencies - 排查依赖冲突:
执行命令查看依赖树,确认androidx.annotation:annotation是否被其他依赖排除:
若发现排除规则,强制引入依赖:./gradlew app:dependenciesimplementation "androidx.annotation:annotation:1.6.0" { force = true } - 确认修改的是模块级
build.gradle(而非项目根目录的),同步Gradle后重新编译。
问题2:Billing v6运行时出现空指针异常
现象
使用Billing v6时,抛出系统进程空指针异常:
Exception Process: com.android.settings, PID: 20342 java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.android.settingslib.media.MediaDevice.isConnected()' on a null object reference at com.android.settingslib.media.MediaDevice.compareTo (MediaDevice.java:325) at com.android.settingslib.media.MediaDevice.compareTo (MediaDevice.java:56) at java.util.Comparators$NaturalOrderComparator.compare (Comparators.java:52) at java.util.Comparators$NaturalOrderComparator.compare (Comparators.java:47) at java.util.TimSort.countRunAndMakeAscending (TimSort.java:355) at java.util.TimSort.sort (TimSort.java:220) at java.util.Arrays.sort (Arrays.java:1492) at java.util.ArrayList.sort (ArrayList.java:1470) at java.util.Collections.sort (Collections.java:206) at com.android.settingslib.media.LocalMediaManager$MediaDeviceCallback.onDeviceListAdded (LocalMediaManager.java:484) at com.android.settingslib.media.MediaManager.dispatchDeviceListAdded (MediaManager.java:91) at com.android.settingslib.media.InfoMediaManager.refreshDevices (InfoMediaManager.java:407) at com.android.settingslib.media.InfoMediaManager.access$000 (InfoMediaManager.java:61) at com.android.settingslib.media.InfoMediaManager$RouterManagerCallback.onRoutesAdded (InfoMediaManager.java:514) at android.media.MediaRouter2Manager.lambda$notifyRoutesAdded$0 (MediaRouter2Manager.java:671) at android.media.MediaRouter2Manager$$ExternalSyntheticLambda6.run at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641) at java.lang.Thread.run (Thread.java:920)
解决方案
该异常来自系统设置的媒体设备排序逻辑,并非Billing SDK直接导致,但可能由Billing v6的间接行为触发系统bug:
- 升级Billing SDK至最新稳定版:如6.1.0及以上,官方可能修复了相关系统交互问题;
- 检查应用媒体相关代码:若应用注册了媒体设备监听回调,在处理设备列表前对每个
MediaDevice对象判空,避免系统传递空对象引发崩溃; - 系统版本兼容处理:若仅在特定Android版本出现,通过版本判断跳过相关排序逻辑;
- 临时异常捕获(治标方案):若异常来自系统或第三方代码,添加全局异常捕获避免应用崩溃,但建议优先从根源修复。
内容的提问来源于stack exchange,提问作者Alexey Starinsky
相关产品推荐
相关产品推荐

