有时候我们要把一个app的核心代码作为一个公共的库,用在公司的各种不同的app中,最笨的方式可能就是把当前的代码copy一份,然后在此基础上做业务修改,但是为了更好的拓展和保持原有业务不变,可以将application改造成library,library编译后的产物.aar可以发布到仓库供多个项目使用,下面我们就说一下简单的改造
一般我们改造分为四个步骤
- 打开app目录下 build.gradle 文件,注意不是项目全局的build.gradle,我发现好多人对这个区分不开,大概是没有学习过gralde的项目管理基础吧
- 找到
defaultConfig
删除applicationId
。只有 Android 应用才能定义applicationId
,不然编译会报错的 - 在文件的顶部(一般都是第一行)将
apply plugin: 'com.android.application'
修改为apply plugin: 'com.android.library'
- 保存文件,然后依次点击
File > Sync Project with Gradle Files
。大功告成。模块的整个结构仍然相同,但是现在它会作为Android library
运行,编译现在也会创建AAR
文件,而不是APK
。如果您想要编译AAR
文件,请在Project
窗口中选择要编译的库模块,然后依次点击Build >Make Module my-library-module
或者用gradle生成aar。
特殊注意事项
- 在将将application改成library后,如果涉及到
View
的onClick
事件多分支选择的,不能使用switch (view.getId()){...}
作为逻辑处理,必须使用if--else if---else
的形式,不然编译会报错
将库添加为依赖项
方法一、图形界面操作
- 添加已编译的 AAR(或 JAR)文件到项目(库必须已编译):
a. 依次点击File > New > New Module
。
b. 点击Import .JAR/.AAR Package
,然后点击Next
。
c. 输入已编译的AAR 或 JAR
文件的路劲位置,然后点击Finish
。 - 将
library Module
导入到您的项目(库源代码会成为项目的一部分):
a. 依次点击File > New > Import Module
。
b. 输入库模块目录的位置,然后点击Finish
。
方法二、Gradle脚本导入(个人喜欢这个)
- 添加已编译的 AAR(或 JAR)文件到项目(库必须已编译):
a、一般都是将生成的AAR(或 JAR)放到 libs目录下 ,如:lib/my-library-module-release.aar
b、在gradle的dependencies{...}
节点下配置
android{
...
productFlavors {
pro { ... }
other{...}
}
configurations {
proDebugImplementation
proReleaseImplementation
}
}
dependencies {
//一般的只需要这样一行配置就可以使用
implementation (name: 'my-library-module-release', ext: 'aar')
//特殊情况下可以用configurations 里面定义的配置不同环境的依赖,二选一
proDebugImplementation (name: 'my-library-module-debug', ext: 'aar') //比如开发环境下
proReleaseImplementation (name: 'my-library-module-release', ext: 'aar') //正式发布环境
}
我们也可以在app目录下创建一个专门存放aar文件的目录,如aars
- 这样我们需要在gradle中通过以下脚本进行指定该目录才能使用
repositories {
flatDir { dirs 'aars' }
}
dependencies {
//一行代码将aars目录下的aar文件都依赖进项目中
implementation fileTree(dir: 'aars', include: ['*.aar'])
}
如果是jar包就直接 implementation fileTree(dir: 'libs', include: ['*.jar'])
,这行配置可以引入libs下所有的jar包,当然你也可以引入个别的jarimplementation file('libs/my-lib-module-release.jar');
- 将
library Module
导入到您的项目(库源代码会成为项目的一部分):
a. 确保my-library-module和 app
在同一级目录
b. 然后在 settings.gradle 中进行配置include ':app', ':my-library-module'
c. 打开app的 build.gradle 文件,然后添加dependencies
d.点击Sync Project with Gradle Files
dependencies {implementation project(":my-library-module") }
以上为基本用法,要是有定制化的变体,可以使用 buildVariantName
+Implementation的形式,而不是 implementation。例如,如果只想在“pro”产品中包含此库,其他项目中用不到这个库里面的内容,避免影响打包的编译速度
android{
...
productFlavors {
pro { ... }
other{...}
}
}
dependencies {
proImplementation project(":my-library-module")
}
将库添加为依赖项后在打包的时候经常会出现资源合并冲突
1、资源id经可能用该库为前缀或者后缀,有一定特色的命名,避免在values.xml合并的时候报错
2、AndroidManifest.xml
合并的时候也会报错,比如android:name,android:icon,android:label,android:theme
等属性冲突,可以在应用的AndroidManifest.xml
的 application
节点加入以下代码解决,多个属性之间用逗号隔开
<application tools:replace="android:theme,android:label,android:allowBackup,android:icon">
查看AndroidManifest.xml
报错日志可以参考 Android studio各种gradle报错解决方案汇总
学习更多的合并冲突请看官方文档 合并多个清单文件
最后建议大家学习一下gralde 基础语法,弄清楚project
和tast
的;不要只知道在 dependencies {...}
加入依赖,结果gradle一报错自己就慌了