isapplicationmodule1=false
isapplicationmodule2=false
isapplicationmodule3=false
然后在module中的build.gradle中改变 application 还是 library
(1) 区分 application 还是 library
if (isapplicationmodule1.toboolean()){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
(2) 增加 applicationid
defaultconfig {
applicationid "com.demo.myapplication.module1"
(3) androidmanifest 启动入口
sourcesets {
main {
if (isapplicationmodule1.toboolean()) {
manifest.srcfile 'src/main/module/androidmanifest.xml'
} else {
manifest.srcfile 'src/main/androidmanifest.xml'
)4. 在主 app module 中引入其他module
要注意的一点是每个组件如果是独立运行的话,那它是不能作为依赖库供app模块使用的,所以在app模块下的build.gradle文件中需要进行依赖判断
if (!isapp
licationmodule1.toboolean()){
implementation project(':module1')
if (!isapplicationmodule2.toboolean()){
implementation project(':module2')
if (!isapplicationmodule3.toboolean()){
implementation project(':module3')
implementation project(':common')
在模块 module中引入 common module
至此通过修改配置,每个module就可以单独运行。
)5. 引入arouter
由于需要模块之间的解耦,平时的intent跳转需要导包,而arouter引入之后,就能在跳转的同时不用导包。
集成arouter
(1) 引入依赖
common中添加
api("com.alibaba:arouter-api:$rootproject.ext.arouterlibversion") { exclude group: 'com.android.support' }
annotationprocessor "com.alibaba:arouter-compiler:$rootproject.ext.arouterannotationlibversion"
在每个module下都需要添加注解
(2) 每个引入arouter的module的build.gradle中加入下面代码
...
//arouter
javacompileoptions {
annotationprocessoroptions {
arguments = [modulename: project.getname()]
(3) 在application中进行初始化
if (isdebug) {
arouter.openlog();
arouter.opendebug();
arouter.init(this);
(4)使用arouter跳转
定义路由
@route(path = "/app/main")
public class mainactivity extends appcompatactivity {
跳转路由
arouter.getinstance().build("/app/main").navigation();
)6. butterknife 的坑
单工程使用这个库是没有问题的,但是在组件化使用的时候就报错了。 除了一系列的配置之外,还有个难受的地方就是需要把library中的r改成r2,但当你想把library改成application时,又要将r2改成r,这岂不是很难受。
!!! 所以我目前放弃在library中使用butterknife
)7. switch (view.getid()) 的坑
由于 library中的view.getid 可能是个变量,所以需要把 switch 改成 if。
快捷操作:
光标移至switch这行代码上,同时按下 alt + enter, 此时点击 replace switch to if
)8. 资源重复的坑
no static field xxx of type i in class lcom/xxx/r$id错误
出现这个问题是layout 和 主布局名字重复了,养成习惯,在library中资源文件前加上标识,比如 library_layout
另外有一种方法只是帮忙增加约束,提醒。
android {
compilesdkversion rootproject.ext.compilesdkversion
buildtoolsversion rootproject.ext.buildtoolsversion
// 增加资源的约束,提醒
if (toolsislibrary.toboolean()) {
resourceprefix "${project.name}_"
为了保证不与其他module冲突,建议在string、style、color、dimens 等资源文件都加上前缀。
)六、踩坑
)1. arouter 组件化打包不成功
出现问题:program type already present: com.alibaba.android.arouter.routes.aroutergroupgroupservice
在modulea 和 moduleb 中不能使用相同的 group。
根据提示报错 service 就是重复的group,全局搜索,于是发现在modulea 和 moduleb中都存在以下代码。
package com.bp.tech.common.util;
import android.content.context;
import com.alibaba.android.arouter.facade.annotation.route;
import com.alibaba.android.arouter.facade.service.serializationservice;
import java.lang.reflect.type;
@route(path = "/service/json")
public class jsonserviceimpl implements serializationservice {
@override
public void init(context context) {