android - 对 Android API 级别感到困惑?

标签 android android-studio android-virtual-device android-sdk-tools build.gradle

我正在学习有关 Android 的 Udacity 类(class),这些术语似乎让我感到困惑 (我使用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'

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

appcompat.light.darkaction bar 

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

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

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

minsdk 是支持的最小值,

我到这里了吗?

现在让我困惑的是

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

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

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

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

最佳答案

so target SDK is controlling the look and feel of my app irrespective of device OS,

是的。 (除其他外)

it defines what highest version of android the device can support , right?

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

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

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

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

最低 sdk 版本可能低于编译 sdk。在您的示例中,您声明您的代码可以在 API 级别 10 上执行,但可以使用 API 级别 21 进行编译...没关系,但您必须确保对 API-10 中不存在的 API 的每个调用都不会被执行。在运行 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:应用程序在此级别上进行了测试,较新的设备必须启用向后兼容性 Hook ,以便应用程序的行为仍然像在该级别上运行一样在较新的设备上。

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

ma​​xSDK:您无法在运行更高 API 的设备上安装该应用(不推荐,并且大多数时候没有用)。

关于android - 对 Android API 级别感到困惑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27729503/

相关文章:

ubuntu - Android AVD 键盘输入在 xUbuntu 操作系统上始终无法正常工作

java - 从 Android 平板电脑中提取文件以进行调试。

XML 结束标记独占一行

android - 在列表中看不到 genymotion 虚拟设备

android - 无法重新加载 AVD 列表 :/Users/adilmalik/. android/avd/Nexus_5_API_21_x86.avd/config.ini(权限被拒绝

android - 是否有命令行工具可以下载 Android 模拟器图像(AVD 管理器)?

java - 在 Android 中测量 DHCP 时间

java - 为每 5 个项目在 recyclerview 中添加广告?

java - Youtube 缩略图加载器显示缩略图的时间太长?

java - 安卓工作室 : Cannot resolve symbol MainActivity