4

我只是想知道,设备上安装的最新 Android SDK 是否也包含所有先前版本的代码?

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

还是所有版本都只有一个代码库,有很多检查和开关,然后通过某种兼容模式运行,选择正确的代码并启用我所针对的 SDK 版本的方法?

我阅读了 Manifest 中指定的关于android:targetSdkVersion的文章,但仍然想知道它在内部是如何工作的。

4

2 回答 2

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 都在做同样的事情的原因
于 2014-11-14T07:49:45.497 回答
-1

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

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

于 2014-11-13T10:54:54.077 回答