美文网首页
浅谈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