我们在使用AS开发中,会经常看到module的gradle会有如下的配置
android {
**(1) compileSdkVersion 25**
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.test.unittestapplication"
**(2) minSdkVersion 16**
**(3) targetSdkVersion 25**
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
android {
useLibrary 'org.apache.http.legacy'
}
}
这种司空见惯的配置,仔细想来还是耐人寻味的,上面的标注(1)(2)(3)代表的到底是什么含义呢?你是否可以快速无误的打出来呢,我想大部分人心里都会迟疑的,或者无法快速确定的给出一个肯定的答案,接下来就会一一解析它们的含义.
在了解之前先看下api级别与手机系统版本的对应关系,下图是摘抄自官网API Guides
(1).compileSdkVersion 25:表示在AS本地开发环境中的编译版本,一般新建一个项目时都会默认使用最新的sdk版本设置compileSdkVersion.(目前最新的API级别是25,系统版本是Android 7.1.1 (Nougat),官网上图中还未更新).
(2) minSdkVersion 16:用来指定可运行应用最低的API级别,如果不加指定该值,默认值是1,表示支持所有手机终端系统上面,如果你开发的应用并不支持所有的手机系统,请务必设置它的值,这里指定minSdkVersion为16,对照上面的图表允许其安装在Android4.1及Android4.1.1系统上面,如果安装在Android3.2上面会失败。
(3) targetSdkVersion 25:用来指定应用目标API级别,如果不设置,默认与minSdkVersion值一样。
targetSdkVersion is the main way Android provides forward compatibility。
官网这句话翻译过来就是:targetSdkVersion 是 Android 系统提供向前兼容的主要手段。随着android 系统的升级,某个系统的API或者模块的行为会发生改变,但是为了保证老APK的行为与之前一致兼容,只要apk中的targetSdkVersion不变,即使这个APK安装到新的系统上,其行为还是保持老的系统上的。它是怎么实现的呢?具体是新系统的API源码上做了兼容性处理,举个例子,下面是ContextImpl中获取SharePreference实例的源码,里面首先获取了targetSdkVersion的版本,然后根据这个版本做特殊的处理,这样的例子源码中有很多,就是为了保证程序的向前兼容性处理。
@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
// At least one application in the world actually passes in a null
// name. This happened to work because when we generated the file name
// we would stringify it to "null.xml". Nice.
if (mPackageInfo.getApplicationInfo().targetSdkVersion <
Build.VERSION_CODES.KITKAT) {
if (name == null) {
name = "null";
}
}
File file;
synchronized (ContextImpl.class) {
if (mSharedPrefsPaths == null) {
mSharedPrefsPaths = new ArrayMap<>();
}
file = mSharedPrefsPaths.get(name);
if (file == null) {
file = getSharedPreferencesPath(name);
mSharedPrefsPaths.put(name, file);
}
}
return getSharedPreferences(file, mode);
}
感兴趣的同学可以看看类似的源码,另外还有一个maxSdkVersion它是与minSdkVersion相反的含义,一般不对其进行设置,这里就不再赘述了。