写点什么

Android 组件化实战,企业微信移动应用

用户头像
Android架构
关注
发布于: 17 小时前

}


}


dependencies {


implementation fileTree(dir: "libs", include: ["*.jar"])


implementation "com.android.support:appcompat-v7:$rootProject.ext.supportLibVersion"


implementation "com.android.support.constraint:constraint-layout:$rootProject.ext.constraintLibVersion" // 注意这里是双引号


}

[](

)3. 设置模块是否可以单独运行


在根目录的 gradle.properties 末尾添加

是否需要单独编译, 是否是 application,true 为 application,false 为 library

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 {


if (isApplicationModule1.toBoolean()){


applicationId "com.demo.myapplication.module1"


}


}


(3) AndroidManifest 启动入口


sourceSets {


main {


if (isApplicationModule1.toBoolean()) {


manifest.srcFile 'src/


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


main/module/AndroidManifest.xml'


} else {


manifest.srcFile 'src/main/AndroidManifest.xml'


}


}


}

[](

)4. 在主 app module 中引入其他 Module


要注意的一点是每个组件如果是独立运行的话,那它是不能作为依赖库供 app 模块使用的,所以在 app 模块下的 build.gradle 文件中需要进行依赖判断


if (!isApplicationModule1.toBoolean()){


implementation project(':module1')


}


if (!isApplicationModule2.toBoolean()){


implementation project(':module2')


}


if (!isApplicationModule3.toBoolean()){


implementation project(':module3')


}


implementation project(':common')


在模块 Module 中引入 common module


implementation project(':common')


至此通过修改配置,每个 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 下都需要添加注解


annotationProcessor "com.alibaba:arouter-compiler:$rootProject.ext.arouterAnnotationLibVersion"


(2) 每个引入 Arouter 的 Module 的 build.gradle 中加入下面代码


defaultConfig {


...


//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 中都存在以下代码。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android 组件化实战,企业微信移动应用