Android min, max, targetSDK详解

本文详细介绍了Android应用中minSdkVersion、targetSdkVersion和maxSdkVersion的含义和作用。minSdkVersion指定应用能安装的最低系统版本,targetSdkVersion表示应用最佳运行的系统版本,而maxSdkVersion则限制了应用支持的最高系统版本。此外,还讨论了这些属性与uses-permission的关系,包括权限在不同SDK版本上的处理方式。
摘要由CSDN通过智能技术生成

使用方法

<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" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值