前言
关于build.gradle文件中的这三个配置参数网上也有很多文章,我此前也看过一些解释,最后也是一知半解。最近正巧碰到华为全面屏手机无法全屏显示的问题,查阅资料后发现有一个解决的方法是将targetSdkVersion设置为>=26就可以了(测试发现>=24就可以,不知道是不是手机的原因,这不是本文重点),借此机会想把这几个版本相关的配置的参数彻底弄清楚。
1.minSdkVersion
这个参数是最好理解的,表示当前应用支持的最低安卓版本,比如配置minSdkVersion为23,对应Android6.0,那么该应用只能安装到Android6.0及其以上系统的手机中。
需要注意的是,如果项目中使用了高于minSdkVersion版本的API,Android Studio会提示错误Call requires API level xx (current min is xx),虽然可以照常运行,不过强迫症总归看着不爽,这时候有两种解决方法:
1.在相关代码外加上@TargetApi注解,比如API是在AndroidO才引入的,可以添加如下代码
@TargetApi(Build.VERSION_CODES.O)
private void fun() {
...
具体逻辑
...
}
2.添加if判断
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
...
具体逻辑
...
}
2.compileSdkVersion
顾名思义,compileSdkVersion表示项目编译所用的SDK版本,并不会涉及到运行时行为,如果我们想要使用新添加的API,就需要指定对应的compileSdkVersion。简单来说就是项目中使用API对应的版本,我们平时点击查看的源码版本就是对应compileSdkVersion指定的版本。
3.targetSdkVersion
我个人认为targetSdkVersion是三个参数中最不好理解的,很多文章中都将targetSdkVersion的作用解释为提供应用的向前兼容,表示你在该目标版本上已经做过了充分测试,系统会为应用启用一些最新的特性和功能。与compileSdkVersion不同的是,targetSdkVersion决定了应用的运行时行为,什么是运行时行为呢,我举两个例子就清楚了。
示例1 Android6.0引入的运行时权限
targetSdkVersion<23,在所有手机中都会默认会允许所有权限,包括危险权限。
targetSdkVersion>=23,在Android6.0以下手机中会默认允许所有权限,在Android6.0及其以上手机中针对危险权限,需要在代码中进行动态申请。
示例2 Android8.0引入的通知渠道
我们此前创建通知都是通过如下代码
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("标题")
.setContentText("内容")
.build();
如果我们项目中指定的targetSdkVersion为26,那么我们会发现该方法已经被废弃了,需要多传一个渠道参数,这里具体怎么做我就不解释了,这时就涉及到targetSdkVersion了。
targetSdkVersion<26,在所有手机中都会能够正常显示通知。
targetSdkVersion>=26,在Android8.0以下手机中会可以正常显示通知,针对Android8.0及其以上手机需要在代码中传入通知渠道参数,否则无法显示通知。
从以上两个示例中,我们应该能够对运行时行为有了清楚认识,对于targetSdkVersion,它决定了运行行为,为此我们要及时了解每个版本的行为变更,做好适配工作。
后记
关于这三个参数,我可能有理解不对的地方,欢迎大家多交流。
我自己也是头一次写博客,希望可以坚持下去,不求每篇文章内容多么丰富,只是为了能够记录自己学习中遇到的点滴。