每个Android设备都包含以前的所有SDK版本吗?

时间:2014-11-13 10:38:06

标签: android android-compatibility

我只是想知道,如果设备上安装的最新Android SDK包含所有以前版本的代码吗?

因此,如果我在我的应用程序中定位API级别10并将其安装在带有Lollipop的设备上,它是否会像3年前一样使用和使用Gingerbread SDK?

或者只有一个代码库适用于所有具有大量检查和开关的版本,然后通过某种兼容模式运行,选择正确的代码并启用SDK I版本的目标吗?

我阅读了有关android:targetSdkVersion specified in Manifest的文章,但仍想知道内部如何运作。

2 个答案:

答案 0 :(得分:0)

好的,我刚刚浏览了一下源代码(你可以在这里找到:https://github.com/android/platform_frameworks_base)。我不是Android框架的工程师,我只是对你的问题感到好奇,这就是我找到的。

它不包含所有不同版本的源代码。您可以想象,如果有越来越多的版本可用,这将导致噩梦。最重要的是,您可以使用相同方法的不同(错误)版本而不修复它们只是为了保持它们相同。

在源代码中,您可以找到以下地点:(请参阅https://github.com/android/platform_frameworks_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/java/com/android/internal/view/ActionBarPolicy.java#L55

public boolean hasEmbeddedTabs() {
    final int targetSdk = mContext.getApplicationInfo().targetSdkVersion;
    if (targetSdk >= Build.VERSION_CODES.JELLY_BEAN) {
        return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs);
    }

    // ...
    return mContext.getResources().getBoolean(R.bool.action_bar_embed_tabs_pre_jb);
}

因此,Android开发人员会在必要时对代码进行版本检查。但是这些检查并不像你想象的那样(我猜)。更改方法的原因是什么?

  • 方法是错误的:他们需要做的就是修复错误。测试将确保方法的一般行为保持不变
  • 不推荐使用
  • 方法:这些人无法删除该方法,他们只能将其标记为已弃用并希望获得最佳效果。编译器将完成剩下的工作。
  • 方法行为必须改变:嗯,我想这是他们不能轻易做到的事情。他们可以使用版本代码(这非常难看并成为维护噩梦),或者他们只是引入了一个新的API。这就是为什么你会发现许多API只是做同样的事情

答案 1 :(得分:-1)

如果您已使用最新的Android sdk写下代码并将其安装在您的设备中。这意味着你实际上在编译/执行代码时使用了最新的android.jar(你可以在你的项目中看到android.jar)文件。

现在如果您在姜饼面包设备中安装应用程序,那么android.jar(最新)具有向后兼容性(如果需要)以在Gingerbread设备中运行代码。如果您定义目标sdk版本10并在更高API级别上运行应用程序,然后它会顺利运行,除了你的兼容性行为禁用在目标设备以外的相应设备。