一、背景
一个app随着业务增加,代码放在同一个模块中会越来越臃肿,同时也导致多人开发的一个难度。组件化可以把业务单独分出来,形成一个单独模块,可单独运行、测试等,相互之间不会影响。
另外一个优势,如果一个公司有多个app,总会出现一些相同业务,如登录/注册。我们可以单独把公共业务封装成一个单独模块,供所以app使用,提高了开发成本
二、项目结构
如下图1:
项目分成了4层,第一层app壳,这个也就是我们主工程, 里面包含application,启动页,以及一些初始化操作。第二层为module层,也就是我们的具体业务模块,具体需要看业务。第三层公共资源库,所有module都依赖此lib库。第四层为工具层,我们可以封装一些常用的网络请求,图片框架等
三、组件开发代码配置
1.先给大家看下工程主要目录结构
2.在project目录下创建一个全局的config.gradle配置文件。具体每个字段作用,看代码注释,这里就不作讲解了
ext{
//组件独立调试开关, 每次更改值后要同步工程
isDebug = false
//统一管理Android配置
android = [
// 编译 SDK 版本
compileSdkVersion: 32,
// 最低兼容 Android 版本
minSdkVersion: 22,
// 最高兼容 Android 版本
targetSdkVersion: 31,
// 当前版本编号
versionCode: 1,
// 当前版本信息
versionName: "1.0.0"
]
//组件唯一包名
applicationid = [
"app":"com.example.demo",
"lgoin":"com.test.login",
]
//请求测试服/正式服
url = [
"debug": "http://v.juhe.cn",
"release":"http://v.juhe.cn"
]
//统一管理module的第三方依赖
dependencies = [
corektx: 'androidx.core:core-ktx:1.7.0',
appcompat: 'androidx.appcompat:appcompat:1.3.0',
material: 'com.google.android.material:material:1.4.0',
constraintlayout: 'androidx.constraintlayout:constraintlayout:2.0.4',
junit: 'junit:junit:4.13.2',
junittest: 'androidx.test.ext:junit:1.1.3',
espressocore: 'androidx.test.espresso:espresso-core:3.4.0',
]
//路由
libARouter= 'com.alibaba:arouter-api:1.5.2'
libARouterCompiler = 'com.alibaba:arouter-compiler:1.5.2'
//Gson解析
libGson = 'com.google.code.gson:gson:2.8.9'
}
3.引入config.gradle配置文件,在project全局中build.grale文件添加 apply from:"config.gradle"
plugins {
id 'com.android.application' version '7.2.1' apply false
id 'com.android.library' version '7.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
//引入config全局配置文件
apply from:"config.gradle"
task clean(type: Delete) {
delete rootProject.buildDir
}
4.配置module
,通过全局配置文件中的 isDebug 控制,来实现module和library之间的转换,我们对module中的build.grale文件作一下修改(这里修改的是module_login下面的)
apply from: '../config.gradle'
if (isDebug){
apply plugin: 'com.android.application'
}else {
apply plugin: 'com.android.library'
}
apply plugin:'org.jetbrains.kotlin.android'
apply plugin: 'kotlin-kapt'
android {
compileSdk rootProject.ext.android.compileSdkVersion
defaultConfig {
if (isDebug){
applicationId rootProject.ext.applicationid.lgoin
}
minSdk rootProject.ext.android.minSdkVersion
targetSdk rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext. android.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
//kotlin 路由配置
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
sourceSets{
main{
if (isDebug){
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation rootProject.ext.dependencies.corektx
implementation rootProject.ext.dependencies.appcompat
implementation rootProject.ext.dependencies.material
implementation rootProject.ext.dependencies.constraintlayout
testImplementation rootProject.ext.dependencies.junit
androidTestImplementation rootProject.ext.dependencies.junittest
androidTestImplementation rootProject.ext.dependencies.espressocore
implementation project(path: ':lib_common')
//kotlin路由配置
implementation rootProject.ext.libARouter
kapt rootProject.ext.libARouterCompiler
}
5.添加AndroidManifest.xml
文件,这里解释下为什么要添加AndroidManifest.xml。当module作为library库时,AndroidManifest.xml里面的内容是有区别的
- 作为library,目录位置
src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.module.login">
<application>
<activity
android:name="com.module.login.TestActivity" />
</application>
</manifest>
- 作为module单独运行,目录位置
src/main/debug/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.module.login">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:name="com.module.login.App"
android:theme="@style/Theme.Demo">
<activity
android:name="com.module.login.TestActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
6.完成上面几步,module_login
模块就配置完了,其他module依照配置就可以了。另外需要注意,组件开发,一般会引入路由框架ARoute,实现模块之间的的跳转。具体怎么实现,请看ARoute使用
四、具体效果展示
1.当config.gradle配置文件中的 isDebug=true 时
2.当config.gradle配置文件中的 isDebug=false 时
五、总结
总的来说还算顺利,期间就出现了些小问题,但还是值得注意
- 包重名问题,创建项目时没注意,导致包重名了。Android修改包名
- 路由ARoute配置,跳转提示找不到路径,主要时因为我当时想试试java和kotlin不同配置,详细请看Android路由ARoute使用
- 组件开发特别需要注意资源重名,为了避免这个问题,可以在module中的build.gradle中添加resourcePrefix “xxx_” 前缀提示,这样每次添加资源,系统会提示加前缀
作者:字不知
链接:https://www.jianshu.com/p/f0fe6e5fe042
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
一、架构师筑基必备技能
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
二、Android百大框架源码解析
1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程
三、Android性能优化实战解析
- 腾讯Bugly:对字符串匹配算法的一点理解
- 爱奇艺:安卓APP崩溃捕获方案——xCrash
- 字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc
- 百度APP技术:Android H5首屏优化实践
- 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- 携程:从智行 Android 项目看组件化架构实践
- 网易新闻构建优化:如何让你的构建速度“势如闪电”?
- …
四、高级kotlin强化实战
1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》
-
从一个膜拜大神的 Demo 开始
-
Kotlin 写 Gradle 脚本是一种什么体验?
-
Kotlin 编程的三重境界
-
Kotlin 高阶函数
-
Kotlin 泛型
-
Kotlin 扩展
-
Kotlin 委托
-
协程“不为人知”的调试技巧
-
图解协程:suspend
五、Android高级UI开源框架进阶解密
1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
六、NDK模块开发
1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习
七、Flutter技术进阶
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)
…
八、微信小程序开发
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取↓↓↓