如何快速定位Android低版本适配中的API调用错误?
兄弟我太懂这种崩溃的糟心了!明明编译好好的,一跑老设备就闪退,还得一个个找高API调用,确实头疼。给你几个亲测有效的方法,帮你快速揪出所有这类问题:
用Android Studio的Lint强力排查
这是最省心的办法,Android Studio自带的Lint工具专门管这类版本适配问题。操作步骤很简单:顶部菜单栏点Analyze->Inspect Code,然后在弹出的窗口里选整个项目或者你要检查的模块,确认后等Lint跑完。
重点看Android Lint下的NewApi检查项,所有调用了高于minSdk版本API的地方都会被标出来,连具体需要的API等级都给你列得清清楚楚。
想要从根源上解决,还能让Lint在编译时直接报错,而不是只给警告,这样就不会漏过了。在你的build.gradle(Module级)里加这段配置:android { lintOptions { abortOnError true // 发现错误就终止编译 check 'NewApi' // 只检查NewApi相关问题,也可以留空检查所有Lint项 } }替换高API方法为兼容实现
像你遇到的List#sort()(API24+),其实有现成的低版本替代方案:Java里用Collections.sort(yourList)(这个从API1就支持),Kotlin的话可以用yourList.sorted()或者Collections.sort(yourList),效果完全一样,却能兼容所有低版本。
遇到其他高API方法时,先查一下Android官方文档,大部分都有对应的兼容写法,或者可以用AndroidX库提供的兼容方法(比如androidx.core.util里的工具类)。正确利用
@RequiresApi注解
你加了@RequiresApi(N)却没生效,大概率是Lint没开启相关检查,或者这个注解加的位置不对。这个注解的作用是告诉Lint:“这个方法需要API N才能调用”,如果其他地方调用它时没有做版本判断(比如if (Build.VERSION.SDK_INT >= N)),Lint就会给你提示。
确保你的Lint配置里NewApi检查是开启的,这样注解才能发挥作用。另外,如果你自己封装了高API方法,一定要加上这个注解,方便团队其他成员也能被Lint提醒。封装版本适配工具类
要是项目里有很多地方用到高API方法,不如自己写个工具类,把所有需要版本判断的逻辑都封装进去,比如针对List排序的工具方法:public class ListCompatUtils { public static <T extends Comparable<? super T>> void sort(List<T> list) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { list.sort(null); } else { Collections.sort(list); } } }以后项目里统一调用这个工具方法,就不用每次都写版本判断,也能避免漏写导致的崩溃。
备注:内容来源于stack exchange,提问作者Luca

