Gradle android-library 的各种坑
软件开发随着项目越来越大,我们会开始拆封出多个子项目(sub-project)或者库(library)来更好地独立维护。Android开发也不例外,我们也会需要创建各种库。如果使用Android Studio和Gradle,他们为我们提供了便捷的方式来创建libray。但是他们也带来了不少的维护问题,本文就来讲讲android-library里的坑来帮助大家避开。
android-library v.s. java-library
对于普通Android手机项目,我们有创建两种不同的Library可以选用: android-library 和 java-library
它们的gradle文件内容分别如下
[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]
apply plugin: 'com.android.library' android { // ... } dependencies { // ... }
[/codesyntax]
[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]
apply plugin: 'java-library' sourceCompatibility = "7" targetCompatibility = "7" dependencies { // ... }
[/codesyntax]
两种库在定义上的根本差别其实就是不同gradle plugin的使用。另一个小的差别就是android-library需要有一个 AndroidManifest.xml 文件,但它可以简单到只有一行内容(其中package的值通常是文件夹的路径)
[codesyntax lang=”xml” lines=”normal”]
<manifest package="com.ider.android.library" />
[/codesyntax]
使用上他们有一些差异,这些差异也是我们决定使用哪种Library的标准:
- android-library 可以使用 Android API(比如Activity, Service等等),java-library 则不能使用
- android-library 可以编译android资源文件(resources files),java-library 则无视这样内容
- android-library 编译出 arr 文件,java-library编译出 jar 文件(本质上他们都是 zip 文件)
- android-library 的配置可以包含各种编译类型(build variants)来控制,java-library没有那个复杂
- android-library 可以依赖于另一个android-library 或者 java-library, java-library只能依赖于java-library而不能依赖于android-library
总体而言 android-library 基本是 java-library 的一个超集, 但 android-library 比 java-libray 使用起来要更加复杂一些。从上边的对比来看,对于Android的项目,因为我们不确定什么时候会需要调用 Android 的API,或者定义一下 Android 的资源内容。再者最后一条的约束也决定了创建的 java-library 要保证在整个依赖树(dependency tree)上要在接近叶子节点的位置。所以不如优先选择创建android-library,以免掉入之后改 build.gradle 的坑中。
Read More →