关于Android Library需要注意的细节

1. 设置库的资源为私有

我们都知道,库中的所有资源(res/目录的所有文件)在默认情况下均处于公开状态。如果不希望库的使用者访问这些资源,我们必须通过声明一个或多个公开资源的方式来使用这种自动私有标识机制。

具体做法:

在库的 res/value/ 目录下创建 public.xml 文件,添加 mylib_app_namemylib_public_string 为公开字符串资源。使用库的模块如果尝试引用库中的其他资源时,Lint会显示警告信息:

1
2
3
4
<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

同时,我们可以参考v7 appcompat库中的 res-public/values/public_layouts.xml ,就声明了 support_simple_spinner_dropdown_item.layout 是允许库使用者去访问的。

1
2
3
4
5
<?xml version="1.0" encoding="utf-8"?>
<!-- Definitions of layouts to be exposed as public -->
<resources>
<public type="layout" name="support_simple_spinner_dropdown_item"/>
</resources>

2. app模块的 minSdkVersion 必须大于或等于库定义的版本

库作为相关应用模块的一部分编译,因此,库模块中使用的 API 必须与应用模块支持的平台版本兼容。

3. 库模块如何使用自己的混淆配置文件

这个也算是我们平时开发过程当中的一直没搞明白的问题。因为之前库模块的混淆配置想当然的以为和app模块相同,实则不然,当时也没有找到解决办法,导致目前我们项目所有的混淆配置都写在app模块下的 proguard-rules.pro

其实我们是可以分别针对库做混淆配置的,在将库添加到app模块时,库的 ProGuard 文件是会附加至app模块的 ProGuard 配置文件 (proguard.txt)。

首先,以下配置只在app模块下有效,在库模块中是没有用的

1
2
3
4
5
6
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

要指定库的混淆配置文件名称,例如,以下代码段会将 lib-proguard-rules.txt 设置为库的 ProGuard 配置文件:

1
2
3
4
5
6
android {
defaultConfig {
consumerProguardFiles 'lib-proguard-rules.txt'
}
...
}

如此这般,我们就不需要再将库中的混淆配置写到app模块的 proguard-rules.pro 了!

4. app模块无论debug、release构建下,默认都是使用库的release构建类型

如果要让app模块使用库中不同的构建类型咋办?

1)首先在库的build.gradleandroid块内添加以下代码,将此库的非发布配置展示给使用它的项目:

1
2
3
4
android {
    ...
    publishNonDefault true
}

2)在app模块的build.gradle中添加以下代码段使应用在debug构建时使用库的debug构建类型,release构建时使用库的release构建类型:

1
2
3
4
dependencies {
    debugCompile project(path: ':library', configuration: 'debug')
    releaseCompile project(path: ':library', configuration: 'release')
}

参考链接:https://developer.android.google.cn/studio/projects/android-library.html