【发布时间】:2014-08-06 12:59:43
【问题描述】:
这些问题是我试图理解 Android 如何处理 JAR 文件和外部库等。它是概念性的。
在 Java 中,JRE 附带了一个 JAR 文件 rt.jar,因此每个应用程序都可以访问 Java 核心库。
Java 类加载器是否只加载应用程序需要的类?
rt.jar 是否等同于 android 的 /system/framework/ jars?
当我们使用 SDK 开发应用程序时,我们会包含来自其中一个 android API 的 android.jar。 android.jar 本质上是该 API 的已编译 AOSP(减去一些隐藏库)吗?
android.jar 实际上并不包含在 APK 中,是吗?一旦在设备上,APK 正在使用 /system/framework/framework.jar,对吗?
如果是 4,android 如何告诉应用程序使用该库?这是我可以查看源代码的东西吗?
当我们将 JAR 添加到 Android 项目中时,这是否就像包含静态库一样?库中的代码只是像项目的其他部分一样编译到 classes.dex 中?
当我们将android库项目添加到应用程序中时,它是否也编译成classes.dex?这和6的唯一区别是库项目可以包含资源?
如果每个应用程序都引用 /system/framework/framework.jar(以及其他,如 services.jar 等),那么设备上是否同时运行该库的一堆实例?是不是像一个多次加载到内存中的动态库?
我很想知道所有这些问题的答案,但我也希望能推荐一些阅读这些内容的好地方。
【问题讨论】:
-
3-5 AFAIK 提供了 jar,但 IDE 用于编译目的,但实际实现由操作系统加载,这就是它们如何实现向后兼容性以及在三星或亚马逊等熟 rom 上工作的类似 apk .
-
6 是的,所有内容都打包在 classes.dex 中,所有依赖项之间有 65k 个方法的硬帽。对于可能已经包含在操作系统中的依赖项,有一些编译器时替换。
-
7 我不确定新的 AAR,但模块或其他项目已编译并捆绑在一起,是的。
-
1 Android 多年来一直是 JIT,但有一个新的运行时强制执行 AOT 以提高性能:source.android.com/devices/tech/dalvik/art.html
-
8 AFAIK 有一个共享内存空间用于这些东西以及系统资产:commonsware.com/blog/Articles/what-is-dalvik.html section Memory Consumption