compileSdkVersion
- 设置之后对应版本的 android.jar 就会加入到工程里面来,所有代码都将基于此 sdk 进行开发
此项设置仅仅只会影响到编译期的行为,功能类似于 c/c++ dll 的头文件和 lib 文件,作用主要有以下几点
- Intellisense
- 一些要抛弃的 API 接口可以提前预警(规则注释的作用)
- 保证顺利编译
android 保证了向前兼容,那么用新的 sdk 编译出来的程序肯定能在老设备上运行,就好比在 c/c++ dll 里,虽然头文件和 lib 文件更新,但只要保证了向前兼容和不使用新加入的接口,编译出来的程序照样可以使用老的 dll 进行运行
- 新的 sdk 肯定有新的 api 加入,如何保证这些新的 api 不能被误编译到老平台上(因为老的安卓设备上没有这些api),这就是 minSdkVersion 的作用。
- 此项设置对应于 SDK_PATH/platform/ 目录下的文件,这些文件只是编译时候用的,运行时跟这些文件无关。
- 此项设置总是应该选择最新的
- 此项设置是编译期相关
buildToolsVersion
- 这是 android 编译工具的版本
- 就好比用 vc2010 还是用 vc2015 来开发 windows 程序的区别,用新的编译工具版本总是能编译老的 sdk,新的编译工具还能支持新的编译语法等,就好比新的 vc 版本支持更多的 c++11 特性
- 此项设置对应于 SDK_PATH/build-tools 目录下的文件
- 此项设置总是应该选择最新的
- 此项设置是编译期相关
minSdkVersion
此项设置是保证编译出来的程序能在最低是什么版本的安卓设备上运行,他通过以下途径来达到目的
- 编译期的时候会检查当前的代码,如果引用了新的 sdk 所引入的 api 接口,则会编译失败并提示(类似于 win32 开发时,目标最低平台是 xp 时,不能使用 win 10 的 api,c/c++ 开发里是通过 #ifdef 来屏蔽新接口)
- 安装的时候低版本的设备不让安装
此项设置保证了程序能向前兼容
- 此项设置是编译期和安装期相关
targetSdkVersion
- 此项设置的目的是为了高版本的设备能正常运行使用低版本 sdk 编译出来的程序
- 一些 api 在高版本的运行环境里进行了功能修改,调用相同的 api 接口,在高版本的设备和低版本的设备里功能不同、结果不同,举个伪例子,setSystemTime 在 API 1 中是立即写入,在 API 2 中是延迟写入。原先开发都是基于 API 1 开发的,而且设备也是 API 1,运行很正常。如果没有 targetSdkVersion,程序安装到了 API 2 的设备上,那么表现就不一样了,可能会出现 bug。
- 继续上面的伪例子,targetSdkVersion 的作用就是让 API 2 的设备能继续运行 API 1 开发的程序,他的实现原理是,在 API 2 的运行时库里,setSystemTime 有两份逻辑,一份是 API 1 的逻辑,一份是 API 2 的新逻辑,程序运行过程中,运行时库会通过 getApplicationInfo().targetSdkVersion 方法获取该程序当时开发时所用的目标设备的 sdk 版本是什么,如果是 API 1 的话,就按老的 API 1 的逻辑来运行。
- 与 win32 c/c++ 开发相比的话,windows 使用在传参结构体里放置 cbsize 来达到与此项设置类似的目的。
- 此项设置保证了程序能向后兼容
- 此项设置的选择依据是:一定要与开发设备(或者测试设备)的版本保持一致,保证所有功能都能覆盖测试到,这样就能保证高版本(通过 targetSdkVersion 选择正确的分支)和低版本的设备(总是走最新的分支)都能正常运行。此外,尽量选用新版本的开发设备,这样才能反过来提高 targetSdkVersion 的版本,高的 targetSdkVersion 版本会减少新版本的设备为兼容老接口而付出的代价。
- 此项设置是运行期相关的