我正在通过关于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,屏幕尺寸和像素密度适合典型的姜饼设备?
答案 0 :(得分:4)
所以目标SDK控制着我的应用程序的外观,无论设备操作系统如何,
是。 (除其他外)
不,不!目标SDK指示用于测试应用的SDK。您可以使用目标SDK 20并在安装了API 21的设备上运行您的应用程序:它将使用KitKat l& f(即级别20)。它定义了设备可以支持的最高版本的android,对吗?
怎么可能?当应用程序目标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的设备上安装该应用程序(不推荐且大部分时间都没用)。