【问题标题】:Does every Android device contains all previous SDK versions?每个 Android 设备是否都包含所有以前的 SDK 版本?
【发布时间】:2015-01-10 11:30:19
【问题描述】:

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

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

或者是否所有版本都只有一个代码库,其中包含大量检查和开关,然后通过某种兼容模式运行,选择正确的代码并启用我所针对的 SDK 版本的方法?

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

【问题讨论】:

  • 不,但它们通常向后兼容到错误。
  • @user1095108 是的,但是向后兼容是如何实现的呢?你说系统不包含以前版本的代码。那么当我使用当前 SDK 中不再可用的方法时会发生什么?或者如果方法的代码改变了怎么办?系统从哪里获取原始代码?
  • SDK公开接口供开发者使用,接口向后兼容。

标签: android android-compatibility


【解决方案1】:

好的,我刚刚浏览了一下源代码(您可以在这里找到: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 都在做同样的事情的原因

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这很好,但它根本没有回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多