我们在使用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

compileSdk 34对应哪个版本的gradle_API


(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相反的含义,一般不对其进行设置,这里就不再赘述了。