我只是想知道,如果设备上安装的最新Android SDK包含所有以前版本的代码吗?
因此,如果我在我的应用程序中定位API级别10并将其安装在带有Lollipop的设备上,它是否会像3年前一样使用和使用Gingerbread SDK?
或者只有一个代码库适用于所有具有大量检查和开关的版本,然后通过某种兼容模式运行,选择正确的代码并启用SDK I版本的目标吗?
我阅读了有关android:targetSdkVersion specified in Manifest的文章,但仍想知道内部如何运作。
答案 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开发人员会在必要时对代码进行版本检查。但是这些检查并不像你想象的那样(我猜)。更改方法的原因是什么?
答案 1 :(得分:-1)
如果您已使用最新的Android sdk写下代码并将其安装在您的设备中。这意味着你实际上在编译/执行代码时使用了最新的android.jar(你可以在你的项目中看到android.jar)文件。
现在如果您在姜饼面包设备中安装应用程序,那么android.jar(最新)具有向后兼容性(如果需要)以在Gingerbread设备中运行代码。如果您定义目标sdk版本10并在更高API级别上运行应用程序,然后它会顺利运行,除了你的兼容性行为禁用在目标设备以外的相应设备。