我正在向 Dalvik libcore 方法(例如 libcore/luni/src/main/java/org/apache/harmony/luni/platform/OSFileSystem.java 中的文件打开方法)添加一些拦截例程,我认为这只会更改基本共享库. 但令我惊讶的是,每次我在修改后运行make时,它几乎都会重新构建框架的所有内容,例如计算器应用程序、W3C DOM 解析器等。在一个小修改后构建框架确实需要时间。我想知道修改dalvik libcore后是否可以减少重建组件的数量?谢谢。
1 回答
实际上,更改 core.jar 会导致许多东西被重建,这并不奇怪。core.jar 包含许多/所有核心 java 类,如 Object、String 等。因此,构建的每个其他 jar/apk 实际上都依赖于 core.jar。
从 makefile 的角度来看,它不知道您在 core.jar 中进行了哪些更改,也不知道不重建所有其他依赖于 core.jar 的东西是否安全。它只是看到 core.jar 上的最后修改时间比依赖它的所有其他 jars/apk 更新,因此它全部重建它们。
然而,诀窍是明确地告诉 make 你想要构建什么,而不是告诉它构建所有东西。
假设您之前已经完成了完整的构建,您可以简单地执行
make core snod
核心目标将专门使用您的更改构建一个新的 core.jar,而不重建任何依赖于 core.jar 的内容。
snod 目标(systemimage-nodeps 的缩写)将导致它将所有内容从 out/target/product//system 重新打包到一个新的 system.img 中。这是在 build/core/Makefile 中声明的“特殊”目标。
通常,特定 jar/apk 的目标只是该 jar/apk 的名称,没有扩展名。或者,您可以查看该模块的 Android.mk 文件,并找到模块名称,这通常类似于LOCAL_PACKAGE_NAME
或LOCAL_MODULE
,具体取决于模块的类型。
对于 core.jar(至少在姜饼中),模块名称在 libcore/JavaLibrary.mk(实际上包含在 libcore/Android.mk 中)。该文件包含许多不同模块的定义,但第一个模块LOCAL_MODULE := core
负责构建 core.jar。其余的似乎主要是测试相关的模块。