首先是一些前提:
- Android应用程序使用Android SDK API类。
1.类定义是一些代码或代码的一部分,它们被编译成机器码/字节码。
1.我假设构成Android SDK API的所有(或大部分)类/包都列在下面:
https://developer.android.com/reference/packages.htmlhttps://developer.android.com/reference/classes.html显示器
这是很多!
"现在的问题是“
这些代码/数据驻留在哪里?它们是与应用代码沿着编译到APK文件中,还是存在于设备上的Android操作系统中,在这种情况下,应用应动态链接到它们?
如果设备上存在这些版本,那么使用较新的Android SDK版本(例如,Android Studio中的compileSdkVersion)编译应用会有什么不同?
假设“Android SDK Build-Tools”(与“SDK Platform”(根据“SDK Manager”窗口!)不同,它有自己的版本控制)负责编译您的代码,因此较新的版本意味着更好的字节码优化和更快的JAVA -〉DEX转换!?x1c 0d1x
您编译Android应用程序并使用compileSdkVersion关键字设置其版本的“SDK平台”是否仅包含类声明和引用符号?!
Google API(例如GoogleMapAPI)如何?
Android支持库怎么样?
2条答案
按热度按时间n1bvdmb61#
Android SDK
代码被烘焙到设备中,并且不是你的apk的一部分。你需要通过
gradle compile
包含的东西进入你的apk(例如Support Library
)mklgxw1f2#
Android核心SDK类由每个应用运行的Android运行时示例提供,您可以称之为Android虚拟机。当您的应用需要加载特定的Android框架类时,Classloader将通过类似于您提到的动态链接的过程为您加载该类。
要更改设备上运行的框架的版本,您可以做的事情不多,但是,您需要指定不同的minimumSdk和targetSdk的原因是,是让lint/编译器工具告诉您在特定的框架版本中,哪些函数/api在运行时可能不存在。else逻辑来提供替代功能,或者只是为了避免运行时出现ClassNotDefinedException或MethodNotFoundException。它基本上是一个开发工具,帮助您可视化与正在编译的版本不同的其他版本可能出现的错误。
当然,当你编译它的时候,它会以类似于引用一个包含的库的方式产生引用符号。VM类加载器会解析实际的文件,在运行时加载。不太清楚Google API是如何工作的,但是据我所知,在支持库的情况下,它也会被提供。