• compileSdkVersion:编译工程代码的Android SDK版本。
    也就是在Android Studio中External Libraries中看到的Android API Platform版本。
    image.png
    compileSdkVersion仅仅指定了编译工程源码的Android SDK环境,并不会打包到APK中,打包后的APK被安装在设备上之后,就将在设备对应的Android SDK环境中运行。
  • minSdkVersion:应用兼容的最低版本。
    例如应用的代码中使用了某个API,而这个API是在AIP Level 21中才开始增加的,那么,如果要保证应用能够在所有设备上都能正常运行,可以采取两种方案:
  1. 在代码中对当前设备版本进行判断,只有在满足Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP的条件下才调用API,或者使用@RequiresApi(Build.VERSION_CODES.LOLLIPOP)对调用API的地方进行标注,只有Android版本为5.0及以上版本才会执行API的调用。
  2. 指明minSdkVersion为21,这样只有设备的Android SDK版本大于或等于minSdkVersion时,才能安装应用。
  • targetSdkVersion:指明应用表现行为的Android SDK版本。
    Android不管是出于提升用户体验,还是出于对安全的考虑,每一次重大升级或多或少都会带来一些行为的变更,例如Android 6.0为增强用户隐私安全开始增加的运行时权限,Android 7.0为限制应用间访问文件带来的FileProvider等等。如果我们要让应用使用这些新行为,那么就需要将targetSdkVersion设置为新行为对应的版本或更高的版本,如果不更新targetSdkVersion版本,则应用表现出来的行为将依然是旧版本的行为。
    这三个版本怎么设置比较好呢?一般来讲:
  1. 为了更好检查编译问题,例如提升代码规范,检测编译警告,建议compileSdkVersion设置为最新的API Level;
  2. minSdkVersion则根据业务场景及用户群体情况等因素进行设置,一般力求兼容到更低的版本,因为minSdkVersion越低就表示能够使用应用的设备页就越多;
  3. 为了追求更好的用户体验、使用到最新的优秀特性,targetSdkVersion也尽可能设置为最新的API Level,但是当targetSdkVersion更新后,我们需要做的第一件是就是对照着官方的“用户行为变更说明”适配这些新特性,如果不经过适配,那么就很可能会有BUG;
  4. 目前,Google要求targetSdkVersion至少在26及以上版本;
  5. 一般地,三个版本之间的关系是:compileSdkVersion>=targetSdkVersion>=minSdkVersion

Q.E.D.


学而时习之,不亦说乎? 有朋自远方来,不亦乐乎?