关于android API级别的困惑?

时间:2015-01-01 09:02:53

标签: android android-studio avd android-sdk-tools build.gradle

我正在通过关于android的Udacity课程,这些术语似乎让我很困惑 (我使用android studio 1.x最新版本) 在我的build.gradle中,我有这些

   compileSdkVersion 21
    buildToolsVersion "21.1.2"
......
    minSdkVersion 10
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"

....

compile 'com.android.support:appcompat-v7:20.0.0'

我的假设 如果我将应用程序主题保留为我的清单文件中的默认值,我将其设置为使用app:theme,并且在styles.xml中默认为

appcompat.light.darkaction bar 

我发现appcompat主题意味着,无论设备操作系统版本如何,它都会更改为使用主题版本的目标SDK

当我选择API 21时,它看起来像一个素材应用 当我选择API 20时,它看起来像一个kitkat应用程序 (两者都在我运行ICS的设备上)

因此,无论设备操作系统如何,目标SDK都会控制我的应用程序的外观和感觉, 它定义了设备可以支持的最高版本的android,对吧?默认情况下,使用app:compat主题仍然可以在较低的sdks上运行时,外观和感觉更改为最新或目标API外观作为API 10

和minsdk是最低支持的,

我到现在为止?

现在令我困惑的是

什么是编译SDK,它应该始终是最新的吗?

示例:材料没有在操作栏图标中显示应用程序图标,我不喜欢它,并切换到API 20 跟随MOOC视频

但是我应该将编译sdk保留为21,不会让应用看起来像素材,因为我很困惑,因为它没有?

最后一个问题, 我想在运行姜饼的设备上测试应用程序,我没有, 你能为姜饼装置推荐一些典型的AVD配置(因为我知道很多人仍然在发展中国家使用它), 我应该使用哪种ram,屏幕尺寸和像素密度适合典型的姜饼设备?

1 个答案:

答案 0 :(得分:4)

  

所以目标SDK控制着我的应用程序的外观,无论设备操作系统如何,

是。 (除其他外)

  

它定义了设备可以支持的最高版本的android,对吗?

不,不!目标SDK指示用于测试应用的SDK。您可以使用目标SDK 20并在安装了API 21的设备上运行您的应用程序:它将使用KitKat l& f(即级别20)。

怎么可能?当应用程序目标API 20在具有API 21的设备上运行时:系统将自动启用一些向后兼容性挂钩,以便您的应用程序的行为就像它在操作系统的旧版本(即targetVersion)上的行为一样

支持的最大sdk是maxSdk属性(很少使用,不推荐)。如果您指定maxSdk 20:无法在运行SDK 21 +的设备上安装您的应用

编译SDK级别是用于编译应用程序的sdk的版本。如果您选择最新版本:最新Android版本的用户将受益于为其优化的代码。它允许你使用sdk的最新功能......但是当你使用新的api编写代码时要小心,因为它会在旧设备上崩溃。(见下文)

最小sdk版本可能低于compile sdk。在您的示例中,您声明您的代码可以在API级别10上执行,但是使用api级别21进行编译...那没关系但是您必须确保每次调用API都不存在于API中-10不会在运行API-10的设备上执行。

让我们来说明这个棘手的问题。假设:compileSdk = 20; targetSdk = 20和minSdk = 10

if (Build.VERSION.SDK_INT >= 13) {
    apiCallToSomethingAvailableOnlySinceApi13();
}else {
    //put here some alternative code to perform something similar 
    //(but probably degraded) feature
    //on device running API 10, 11 or 12
    //device with api 9 or lower are exclude anyway (because minSdk is 10)
}

总结:

minSDK :可以在至少具有此级别的设备上安装该应用,并且开发人员编写了防御性代码,以确保所有与minSdk相比最近的api调用都不会成为在运行minSdk版本的设备上执行。

targetSDK :该应用已在此级别上进行了测试,并且更新的设备必须启用向后兼容性挂钩,以便该应用仍然可以像在此级别上运行一样在最近的设备上。

compileSDK :代码已优化为在此级别上运行。 (通常可以安全地将其与targetSDK相同)

maxSDK :您无法在运行更高API的设备上安装该应用程序(不推荐且大部分时间都没用)。