使用方法
<uses-sdk android:minSdkVersion="integer"
android:targetSdkVersion="integer"
android:maxSdkVersion="integer" />
minSdkVersion
指明APP能够安装的系统API的最低版本。如果系统API版本小于这个值,APP将无法安装。
这个值必须声明。
注意:如果没有声明这个值,系统将会指定默认值 1.这就意味着APP将兼容所有平台的Android设备。如果你的APP用到了一些在后期版本在引入的APIs,但是有没有声明合适的minSdkVersion,如果安装在API < 3的系统上,运行到不可用的APIs的时候就会Crash。
android:targetSdkVersion
Introduced in: API Level 4
指明APP最适合运行的系统API版本。如果没有设置,默认值是minSdkVersion。
最适合运行的意思是,开发者在这个系统本版上运行和测试,并且APP在这个版本上表现最好。在这个系统版本上,系统不会开启任何兼容模式(向前兼容/向后兼容)去保证APP的运行效果。
因为Android每一个新版本都会在系统行为和外观上有变化。所以如果系统API版本 > targetSdkVersion。系统会开启兼容模式,保证APP保持开发者预期的的行为。
Android有很多中兼容模式,这些都定义在不同系统版本里,可以参考Build.VERSION_CODES。
注意:这个属性Android推荐使用,为了在每一代Android发布的时候维护你的APP,开发者应该持续的增加targetSdkVersion保证匹配最新的system API。保证APP运行效果最佳。
android:maxSdkVersion
Introduced in: API Level 4
指明APP最高支持的Android系统版本
在Android 1.5, 1.6, 2.0, 和2.0.1, 系统安装的时候会检查这个属性,当系统升级的时候,会重新验证,如果升级之后的系统版本 > maxSdkVersion。那么系统不允许安装,这样就会导致,系统安装之后,这个APP就被系统移出了。
Android 2.0.1以后的版本不会检查并且重新验证。但是Google Play还是会将这个属性作为筛选条件。> maxSdkVersion 的设备系统是不能够下载的
举例说明:
当APP声明maxSdkVersion=”5”并且发布到Google Play之后,系统版本Android 1.6 (API Level 4)的设备下载使用,一段时间后,设备系统版版本升级到Android 2.0 (API Level 5),这个时候,APP还是可以继续使用。再过一段时间后,系统版本升级到Android 2.0.1 (API Level 6),这次升级后,系统验证该APP发现已经不能安装,就会将APP从系统中移除。
注意:Google不推荐声明这个属性。
首先:没有必要为你的APP设定一个以后不能使用的API 版本。Android在设计的时候,所有的新系统版本都是向后兼容的。老版本的APP也是可以在新系统设备上运行的。
其次:其次,如例子所说,已经安装该APP的设备很有可能在系统升级中移除它。Google不希望你牺牲掉已经安装该APP的用户。
和 uses-permission的关系
permission和SDK密切相关,有很多权限必须在指定的SDK版本上才能使用,也有权限在SDK版本以下才需要声明。
当我们开发的APP依赖很多的libs时,full build后会将所有的AndroidManifest进行合并,这个过程会产生两个文件:
app\build\outputs\logs\manifest-merger-debug-report.txt
app\build\intermediates\manifests\full\debug\ AndroidManifest.xml
前者会说明为什么会产生某一个uses-permission
后者是合并后APP实际安装时候需要的所有uses-permission
举例来说:
app\build\outputs\logs\manifest-merger-debug-report.txt
ADDED from AndroidManifest.xml:18:9
android:uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
IMPLIED from AndroidManifest.xml:2:1 reason: com.htc.lib1.security has a targetSdkVersion < 4
MERGED from HMS_AllPlay.............app.packages.apps:HTC_AllPlay_Service:unspecified:12:5
MERGED from HMS_AllPlay.............app.packages.apps:HTC_AllPlay_Service:unspecified:12:5
MERGED from HMS_AllPlay.............app.packages.apps:HTC_AllPlay_Service:unspecified:12:5
MERGED from HMS_AllPlay.............app.packages.apps:HtcAllPlay:unspecified:12:5
MERGED from HMS_AllPlay.............app.packages.apps:HTC_AllPlay_Service:unspecified:12:5
android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from AndroidManifest.xml:2:1 reason: com.htc.lib1.security has a targetSdkVersion < 4
android:uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from AndroidManifest.xml:2:1 reason: com.htc.lib1.security requested WRITE_EXTERNAL_STORAGE
可以看到因为com.htc.lib1.security has a targetSdkVersion < 4,所以会自动加上这个权限
android:uses-permission#android.permission.READ_PHONE_STATE
app\build\intermediates\manifests\full\debug\ AndroidManifest.xml
<android:uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
<android:uses-permission android:name="android.permission.READ_PHONE_STATE" />
<android:uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
这个是合并之后的AndroidManifest.xml,发现
<android:uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
限制了maxSdkVersion,因为我们的APP 的sdk基于23,导致这个权限我们就看不到了。
这两个例子有两个点:
1. 所有API版本低于3 的设备上,都会自动被声明 READ_PHONE_STATE 权限。
2. 由于 READ_EXTERNAL_STORAGE在Android 4.4 (API level 19)之后就不再需要声明,所以如果maxSdkVersion <= 18,编译时就会自动加上一下限制,就会导致API版本 > 18的就看不到READ_EXTERNAL_STORAGE这个权限。
<android:uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />