美文网首页
浅谈Android模块化和组件化

浅谈Android模块化和组件化

作者: Owen270 | 来源:发表于2021-07-12 14:48 被阅读0次

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
image.png
比如美团那种:
image.png

外卖Model
美食Model
电影Model
打车Model

3.2 动态配置模块的工程类型, ApplicationId 和 AndroidManifest 文件

3.2.1 gradle.properties 中申明一个变量 isRunModel =true/false
image.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'
            }
        }
    }
image.png image.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是阿里巴巴开源路由框架

相关文章

网友评论

      本文标题:浅谈Android模块化和组件化

      本文链接:https://www.haomeiwen.com/subject/pcerpltx.html