AndroidManifest.xml 中的 targetSdkVersion 属性 和 project.properties 中的 target 属性的区别

在AndroidMenifest.xml中,常常会有下面的语句:

    

在project.properties中,会看到下面的语句:

    target=android-10 

如果是使用Eclipse的话,还可能会看到这样的警告:

    Attribute minSdkVersion (4) is lower than the project target API level (10) 

那么,这里面的minSdkVersion、maxSdkVersion、targetSdkVersion、target四个属性到底有什么区别?

minSdkVersion与maxSdkVersion

minSdkVersion与maxSdkVersion比较容易理解,就是在安装程序的时候,如果目标设备的API版本小于minSdkVersion, 或者大于maxSdkVersion,程序将无法安装。一般来说没有必要设置maxSdkVersion。

targetSdkVersion

targetSdkVersion 相对复杂一些,引用安卓官方文档的解释:

Note: The targetSdkVersion attribute does not prevent your app from being installed on platform versions that are higher than the specified value, but it is important because it indicates to the system whether your app should inherit behavior changes in newer versions. If you don’t update the targetSdkVersion to the latest version, the system assumes that your app requires some backward-compatibility behaviors when running on the latest version. For example, among the behavior changes in Android 4.4, alarms created with the AlarmManager APIs are now inexact by default so the system can batch app alarms and preserve system power, but the system will retain the previous API behavior for your app if your target API level is lower than “19”.

Note: 系统并不会阻止你的应用被安装在平台版本大于targetSdkVersion属性值的设备上,
但是它对于指示系统,你的应用是否应该在新版本中继承行为更改是非常重要的。
当你不更新targetSdkVersion属性值到最新版本,那么系统就假定你的应用运行在最新版本系统上的时候,需要一些向后兼容行为。
例如,在Android 4.4中的行为变化,用AlarmManager APIs创建的警报,在当前版本中默认是不精确的,这样的话系统就可以批处理应用的警报并且节省系统电量。但是,如果您的目标API级别低于“19”,系统将为你的应用程序保留以前的API行为。

理解一下上面的解释。接下来我们根据解释中提到的例子,看看 AlarmManager 的源代码:

AlarmManager(IAlarmManager service, Context ctx) {
    mService = service;

    final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion;
    mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT);
}

private long legacyExactLength() {
    return (mAlwaysExact ? WINDOW_EXACT : WINDOW_HEURISTIC);
}

从上面代码可以看出, targetSdkVersion 属性就是一个作为逻辑判断的标准 ,同一个接口, 低于某个版本API就是一种行为, 高于某个API版本就是另外一种行为。
所以如果你的应用的 targetSdkVersion 属性值小于19 ,那么使用 AlarmManager 中的接口就是旧的行为 ; 如果 targetSdkVersion 属性值大于或等于 19 , 那就是新的行为。

我们再举另外一个例子 ,Activity 的返回按键逻辑:

public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if (getApplicationInfo().targetSdkVersion
                >= Build.VERSION_CODES.ECLAIR) {
            event.startTracking();
        } else {
            onBackPressed();
        }
        return true;
    }
    ......
}

这个例子可以非常具象化的解释 , 如果应用的 targetSdkVersion 属性值小于 5 (ECLAIR的API版本是5) , 那么就直接执行Activity的返回事件(也就是Activity直接被关闭) ;而如果 应用的 targetSdkVersion 属性值大于 5 , 那么就会走按键事件分发逻辑 , 也就是说开发者可以在应用中拦截返回键事件实现其他逻辑(比如仅仅回到主页而不关闭Activity)

target

project.properties 中的 target 是指在编辑和编译的时候使用哪个版本的API。
在 Eclipse 中, 你也可以通过 右键工程 - Properties - Android属性页 - Project Build Target 下更改API版本, 这个更改也会导致 project.properties 中的 target 属性值改变。
可以做如下测试: target 设置一个低于 23的值 , 然后在Activity中的函数中调用 this.checkSelfPermission(“test”); ,你会发现它会报错 。因为这个接口是在 API 23的时候,添加在 Context 中的 。 现在你把 target 设置成 23及以上,再调用上述接口,就不会报错了。

你可能感兴趣的:(Android)