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