关于Target SDK Version

Introduction

在AS的build.gradle中,会有compileSdkVersionminSdkVersion以及targetSdkVersion的设定,一般我们直接选择最低,然后其他默认。但是在默认情况下,其实是会有适配问题。

Meaning

关于compileSdkVersionminSdkVersion的含义很好理解,compileSdkVersion表示编译的SDK版本,而minSdkVersion则表示应用兼容的最低版本。相比而言,targetSdkVersion则会更让人有歧义。

Target SDK Version

targetSdkVersion is the main way Android provides forward compatibility by not applying behavior changes unless the targetSdkVersion is updated. This allows you to use new APIs (as you did update your compileSdkVersion right?) prior to working through the behavior changes.

Android系统升级,伴随API升级,而Target SDK Version则是针对应用提供了向前兼容的能力,即针对Target SDK Version没有更新之前,系用不会应用新的行为变化。

举个栗子:大家都知道在6.0之后,Android升级了其权限管理,应用了运行时权限模型。那么如果升级了Android系统到6.0之后,旧的应用是否都无法使用了?

答案自然是否定,这时Target SDK Version就发挥作用了,系统会读取应用的Target SDK Version,来决定接下来的行为,如果是旧的应用,则其Target SDK Version小于23(6.0),Android则不会应用新的运行时权限模型进行检查。

自然,你可以根据原文提供的AlarmManager的set()setRepeat()接口例子来进行验证(即在KITKAT之后在原有精确唤醒基础上,为了省电加入对齐唤醒机制)。应该可以看到源码对应用的target sdk version进行判断:

1
2
3
4
5
6
AlarmManager(IAlarmManager service, Context ctx) {  
mService = service;

final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT);
}

硬编码方式自然不好,不过好在我们可以有个Check List可以查看。

Conclusion

Compile SDK Version

用哪个版本来编译你的应用,正常来说,随你心情,但是最好还是使用最新发布版本。

使用最新版本

  1. 会产生新的编译警告和编译错误(包括弃用的API等),正常需要针对这些警告和错误进行修正。
  2. 使用Support Library时,需要注意使用最新的SDK进行编译,一般会随着系统升级而升级,提供新的API和新特性的兼容。

Min SDK Version

最低兼容版本,每个应用需求不同,目前普遍已经15了。

  1. Lint检查时,会帮助检查是否使用了min sdk version的接口
  2. 使用Support Library或者Google Play Services时,他们有自身min sdk version,自然, 你可以使用tools:overrideLibrary来强制使用,但是需要测试-测试-测试

Target SDK Version

最后这个Version,至关重要,如果设置错误,会导致应用在高版本机器上崩溃。如果没有兼容新的权限模型,建议设置为1822即可降低为不兼容新权限模型,但是经过测试,<uses-permission android:name="android.permission.WRITE_SETTINGS" />权限,在18以上都会雪崩,如果要使用此权限,降低为18)。

所以:minSdkVersion <= targetSdkVersion <= compileSdkVersion,理想上为:minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)用较低的minSdkVersion覆盖更多的人群,用最新的SDK设置Target和Compile版本来获得最好的支持。

Refs

Picking your compileSdkVersion, minSdkVersion, targetSdkVersion — Google Developers
如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion