3

我有一个相当大的 Android 项目,sdk 需要花费大量时间来进行资源解析/ dexing / 等。我想以某种方式改进这一点。

我读过 Android 库项目现在也可以包含资源。所以我们也可以在里面放Activity、Fragments等。

这是否意味着,如果我将大型项目的一部分导出到我从主项目引用的库项目中,那么当我重建主项目时,我不必再次重建已经构建(而不是修改)的库?所以我只需要对修改后的库和可能的主项目进行资源解析/索引等,在大多数情况下减少了整体构建时间。

4

3 回答 3

2

这是否意味着,如果我将大型项目的一部分导出到我从主项目引用的库项目中,那么当我重建主项目时,我不必再次重建已经构建(而不是修改)的库?

部分不,Android Library Project 不是直接构建的,它始终与依赖的 Main Project 一起构建,当 SDK 编译/构建 Main Project 时,SDK 工具将 Library Project 编译为临时 JAR 文件并在主项目中使用它。每当您重新构建主项目时,引用的库项目都会作为主项目构建生命周期的一部分重新构建,即使库项目中没有任何更改。查看在您的 app-lib/bin 文件夹下生成的临时 JAR 的时间戳以获取证据,每次构建主项目时它总是会更改。

引用官方开发指南

但是,库项目与标准 Android 应用程序项目的不同之处在于,您不能将其直接编译为自己的 .apk 并在 Android 设备上运行。同样,您不能将库项目导出到自包含的 JAR 文件,就像对真正的库所做的那样。相反,您必须通过在依赖应用程序中引用库并构建该应用程序来间接编译库。

当您构建依赖于库项目的应用程序时,SDK 工具会将库编译为临时 JAR 文件并在主项目中使用,然后使用结果生成 .apk。如果在应用程序和库中都定义了资源 ID,这些工具会确保应用程序中声明的资源获得优先级,并且库项目中的资源不会编译到应用程序 .apk 中。这使您的应用程序可以灵活地使用或重新定义在任何库中定义的任何资源行为或值。

Android 库项目不同于常规的 java 库项目。您可以在其中一次将所有内容编译并构建到 jar 库中,然后开始从主项目中的参考 jar 依赖项中导入/使用该类。目前 Android 库项目是基于源代码的机制设计的,而不是基于编译代码的库机制,正如这个 Android 博客中所提到的,尽管在未来的版本中承诺了自包含的 jar 分发(不幸的是,r15、r16、r17 和 r18 都没有然而)。

于 2012-04-16T04:10:01.483 回答
1

I wouldn't expect huge time savings here.

In my experience, the slowest step of compilation is actually the dexing of the output files, which can not be performed incrementally, so moving your code into libraries will not speed things up. Similarly, incremental compilation (when it works — it often doesn't with the Android toolchain) will work equally well with unchanged files spread over a bunch of projects as will unchanged files in a single project.

Of course, the best way to find the answer for your actual use case is to experiment on your actual code base. And there may also be code maintainability benefits to splitting your project up into independent modules.

于 2012-04-16T04:21:19.600 回答
1

是的...除非您构建 Clean,否则构建系统会重建需要构建的内容。

于 2012-04-14T12:05:15.393 回答