1.模块化简介
简单的小项目,大多都采用的是单一工程,独立开发。由于项目不大,编译速度及维护成本这些也在接受范围之内。一个大型App产品,多人合作、单一工程的App架构势必会影响开发效率,增加项目的维护成本。
大项目使用单一工程的劣势:
A:每个开发者都要熟悉如此之多的代码,将很难进行多人协作开发,
B:Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。所以必须要有更灵活的架构代替过去单一的工程架构
2.模块化和组件化的区别
2.1.按照业务划分,模块指的是独立的业务模块。按照功能划分,组件指的是单一的功能组件。每个组件都可以以一个单独的module开发,并且可以单独抽取出来作为SDK对外发布使用。模块和组件最明显的区别是模块相对组件来说粒度更大。一个模块中可能包含多个组件。
2.2 模块化的优点
用模块化架构,业务模块分离,低耦合,高内聚,代码边界清晰,每一个模块业务都可以单独抽取出来作为SDK对外发布使用。
3. 模块化的具体实现
3.1 对项目代码分层级
3.1.1 抽取基础library
library-base BaseActivity BaseFragment BaseApplication ...
library-db SQLiteOpenHelper Dao
library-network OkHttp Retrofit 网络请求库
library-widget 第三方控件封装
......
library-base 依赖一下 library-db library-network library-widget ...等第三方库
3.1.2 按照业务新建Model
![](https://img.haomeiwen.com/i5685477/048203276f8ab678.png)
比如美团那种:
![](https://img.haomeiwen.com/i5685477/0458fadc617ba136.png)
外卖Model
美食Model
电影Model
打车Model
3.2 动态配置模块的工程类型, ApplicationId 和 AndroidManifest 文件
3.2.1 gradle.properties 中申明一个变量 isRunModel =true/false
![](https://img.haomeiwen.com/i5685477/1fcf69d38ef0dd7b.png)
3.2.2 在Model的build.gradle中根据isRunModel是true或者false来生命是library 还是application,在DefaultConfig中配置applicationId,SourceSets中配置
if (isRunModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
sourceSets {
main {
// 1.单独调试与集成调试时使用不同的 AndroidManifest.xml 文件
// 我们还可以根据不同工程配置不同的 Java 源代码、不同的 resource 资源文件等的
if (isRunModule.toBoolean()) {
manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
![](https://img.haomeiwen.com/i5685477/0b78f01ef17056ed.png)
![](https://img.haomeiwen.com/i5685477/f612749cbc31d68a.png)
3.2.3 AndroidManifest.xml的异同
作为Library:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zlx.module_home">
<application>
<activity android:name=".activity.SearchAc" />
<activity android:name=".activity.SearchResultAc" />
</application>
</manifest>
作为Model:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zlx.module_home">
<application
android:name=".HomeApp"
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:roundIcon="@mipmap/logo"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
<activity android:name=".activity.HomeAc">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activity.SearchAc" />
<activity android:name=".activity.SearchResultAc" />
</application>
</manifest>
HomeApp 继承BaseApplication
public class HomeApp extends BaseApplication {
@Override
public void onCreate() {
super.onCreate();
ModuleLifecycleConfig.getInstance().initModuleAhead(this);
}
}
public class HomeAc extends BaseAc {
@Override
protected int getLayoutId() {
return R.layout.ac_home;
}
}
R.layout.ac_home
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.zlx.module_home.fragment.HomeFg"
android:layout_width="match_parent"
android:layout_height="match_parent">
</fragment>
4.组件之间页面的跳转【由于各个模块之间互不相关,不能采用通过Intent,类名显式调用的方式调用】
ARouter是阿里巴巴开源路由框架
网友评论