0

我要求这个来确认我对在 android 中使用 compileSdkVersion 的理解。

Android sdk 在路径 (Your sdk root)/Sdk/platforms/android-(sdk version) 下为每个版本提供了实现。因此,如果您将 compileSdkVersion 设置为 20 并且如果您在代码中添加了扩展 Activity 的类,则构建 apk apk 将使用取自(您的 sdk 根)/Sdk/platforms/android-20/andriod.jar 的 Activity.class 实现打包。

所以假设谷歌在 android-22/android.jar 的 Activity 实现中添加了一个方法说'public void f1()',我用 compileSdkVersion 22 编译我的代码,我从我的代码中调用方法 f1() 我要去在具有 android 版本 20 的设备中运行该应用程序。

问题 1:如果方法 f1() 是 java 层方法,而不是调用 C/C++ 实现的东西,它会在设备中正常运行吗?

当我在 compileSdkVersion 设置为 23 的 android studio 中打开 View.class 文件时,我可以在导入列表中看到一个项目 'android.widget.ScrollBarDrawable'。但是当我进入 (Your sdk root)/Sdk/platforms/ android-23/android.jar 我在小部件文件夹中找不到类“ScrollBarDrawable”(我遇到了许多这样的实现,这些实现在 android sdk 中不存在)

问题2:那么当apk被打包时,apk builder从哪里得到实现android.widget.ScrollBarDrawable.class?

对不起,我的英语不好 :(

4

1 回答 1

2

构建 apk 后,apk 将使用取自(您的 sdk 根)/Sdk/platforms/android-20/andriod.jar 的 Activity.class 实现打包

我将其表述为:您的子类将针对该JAR 文件中Activity的 进行编译。Activity.class该 JAR 中的任何内容都不会与您的 APK 一起打包,除了final static int内联到字节码中的值等。

如果方法 f1() 是 java 层方法而不是调用 C/C++ 实现的方法,它会在设备中正常运行吗?

不,如果旧设备上不存在该方法。

那么当apk被打包时,apk builder从哪里得到实现android.widget.ScrollBarDrawable.class呢?

“apk builder”既不知道也不关心这样的类,因为该类不在 Android SDK 中。

在设备上,不同的JAR 是应用程序类路径的一部分,其中包含实际实现Activity等。该 JAR 是否包含隐藏android.widget.ScrollBarDrawable将因操作系统版本而异,大概。

于 2016-05-25T14:16:23.733 回答