每个 Android 设备是不是都包含所有以前的 SDK 版本?
Posted
技术标签:
【中文标题】每个 Android 设备是不是都包含所有以前的 SDK 版本?【英文标题】: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公开接口供开发者使用,接口向后兼容。 【参考方案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 级别上运行应用程序,那么它将运行顺利,除非您在目标设备以外的相应设备中禁用兼容性行为。
【讨论】:
这很好,但它根本没有回答问题。以上是关于每个 Android 设备是不是都包含所有以前的 SDK 版本?的主要内容,如果未能解决你的问题,请参考以下文章