升级compileSdkVersion至31后lint检测出现SparseArray调用需API level S报错
报错原因
- 你调用的
android.util.SparseArray#set是Android 12(API 31,代号S)才新增的系统API,而你项目的minSdkVersion配置为23,需要兼容API 23及以上的设备,低于31的Android系统不存在该方法,直接调用会触发运行时崩溃,lint的NewApi检查规则就是用于提前识别这类不兼容的API调用。 - 升级
compileSdkVersion到31才触发报错的原因是:compileSdkVersion决定了编译时使用的Android SDK版本,低于31的SDK版本中SparseArray没有set()方法的声明,lint无法识别该API的版本要求;升级到31后lint才能读取到该方法的API等级标注,进而抛出错误。
修复方案
- 方案1(最推荐):直接替换为全版本兼容的
put()方法。SparseArray.set()和SparseArray.put()的功能实现完全一致,把所有调用set()的位置替换为put()即可,无需额外适配。 - 方案2:添加版本分支判断,仅在API 31及以上设备调用
set()方法:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { yourSparseArray.set(key, value); } else { yourSparseArray.put(key, value); }
- 方案3(不推荐):临时屏蔽lint检查,可在调用
set()的方法上添加@SuppressLint("NewApi")注解,或在模块lint配置文件中禁用NewApi规则,该方案会引入低版本设备崩溃风险,请谨慎使用。
内容的提问来源于stack exchange,提问作者aherman
相关产品推荐
相关产品推荐

