minSdkVersion: app运行要求的手机最低安卓版本。比如安卓手机版本是19(安卓4.4),minSdkVersion是21(安卓5.0)。那么编译出来的apk将无法安装到该手机上
compileSdkVersion :参与编译的sdk版本。比如想要使用安卓10的5g,需要将compileSdkVersion改为>=29(安卓10),否则无法在代码当中找到相关api
targetSdkVersion:目标版本,兼容旧版本的api。虽然由compileSdkVersion编译通过了,但是最终运行到手机上的运行效果(表现形式)由targetSdkVersion决定
targetSdkVersion详解
- 何时生效?
targetSdkVersion>=xx(安卓手机系统版本)
比如新系统要用andriod6.0的动态权限,要想该部分api生效,那么目标版本targetSdkVersion也需要大于6.0。
-
为何要引入targetSdkVersion?
如果goole在高版本中修改了api,同一方法有了新的代码逻辑,执行该方法依照原来的条件会报错,那么如何避免呢?
如果有个参数targetSdkVersion,大于执行新代码逻辑否则执行旧代码逻辑。可以想象下andirod里面sdk的伪代码:
if( getApplicationInfo().targetSdkVersion>26){//26为安卓版本号
//新的API逻辑
}else {
//旧的API逻辑
}
如果开发者要用新版本里的方法(需要对新版本api做适配),则更新targetSdkVerison,这样运行时就走新版本api的逻辑,如不需要则可用原targetSdkVerison。
-
举例:
app使用了透明的activity且固定了方向,在Android 8.0版本以下运行正常,当运行在Android 8.0/8.1系统上,直接crash。(Android 8.0/8.1 系统规定了透明的ativity 不能固定方向,否则抛出异常)。
如果使用者,更新了手机系统,使用了8.0/8.1以上的,如何避免更新手机系统后app报错呢?
通过引入目标版本targetSdkVersion来区分同一api在不同系统上的行为,如果目标版本大于8.0那么走新的逻辑,小于走原来逻辑。开发者要使用8.0/8.1该版本的新特性,就需要修改targetSdkVersion,并且做适配避免报错。
三者联系
- compileSdkVersion>=targetSdkVersion>minSdkVersion
- 最佳compileSdkVersion=targetSdkVersion>minSdkVersion
参考
https://www.jianshu.com/p/12e42558378a