組件化開發 實戰篇

1爲什麼採用組件化開發

理由很簡單, 提高團隊開發速度.特別是業務模塊繁瑣的項目,主要體現在一下幾點

  1. 解耦
  2. 每個功能模塊都可單獨運行, 開發期,只編譯一個模塊即可(這是組件獨有的亮點)
  3. 有利於單元測試
  4. 代碼迭代便捷

舉個栗子

普通項目機構
上圖是常見的普通項目的架構,主工程依賴各業務模塊, 各業務模塊都依賴相同的支持庫,例如日誌庫,工具類庫等,當A業務改一行代碼, 編譯看效果時,要都編譯,這樣效率相當慢. 當然有人會選擇單元測試,當然爲了一行代碼單獨寫個單元測試有點沒必要,如果還設計其他模塊可能會更復雜 如下圖

在這裏插入圖片描述

上圖單一工程模型下的業務關係,總的來說就是:你中有我,我中有你,相互依賴,無法分離。
然而隨着產品的迭代,業務越來越複雜,隨之帶來的是項目結構複雜度的極度增加,此時我們會面臨如下幾個問題:

1、實際業務變化非常快,但是單一工程的業務模塊耦合度太高,牽一髮而動全身;
2、對工程所做的任何修改都必須要編譯整個工程;
3、功能測試和系統測試每次都要進行;
4、團隊協同開發存在較多的衝突.不得不花費更多的時間去溝通和協調,並且在開發過程中,任何一位成員沒辦法專注於自己的功能點,影響開發效率;
5、不能靈活的對業務模塊進行配置和組裝;

爲了滿足各個業務模塊的迭代而彼此不受影響,更好的解決上面這種讓人頭疼的依賴關係,就需要整改App的架構。

2 組件化的介紹

在這裏插入圖片描述
業務組件之間是相互獨立的,但是又都被APP殼工程依賴,這樣app殼工程可以調用組件,當時有個問題,組件之間怎麼通信呢??? 這個問題就要交給路由協議了,(例如: ActivityRouter, ARouter)
很詳細我就不介紹了 文末參考文章都寫的很詳細,直接擼代碼

開始實踐

1)組件模式和集成模式的轉換

  1. 首先介紹項目 今天我們新建一個app 殼工程 和 兩個邏輯模塊 main(即主工程,但是他只負責用戶登錄等相關操作) 和keepAlive(保活工程) , app殼文件依賴這兩個組件工程, 如下圖

在這裏插入圖片描述
2.在項目的根目錄中生成一個文件 gradle.properties加入 一個變量isModule

# 每次更改“isModule”的值後,需要點擊 "Sync Project" 按鈕
# true  是組件模塊,說明是單獨的App
# false 是集成模式,說明是依賴Lib
isModule=false
  1. 在邏輯模塊的 build.gradle 中加入如下配置
if (isModule.toBoolean()) {
    apply plugin: com.android.application
} else {
    apply plugin: com.android.library
}

  1. 同步下項目 此時項目還沒有任何變化
  2. 把isModule 的值改成 true 然後同步項目,這時候項目就傻眼了,殼項目找不庫, 兩個組件雖然變成了獨立的應用,但是不能直接運行,會報錯,
  3. 解決殼文件出錯, 在文件的依賴裏添加如下判斷代碼, 然後同步, 此時殼文件沒有問題了
    if (isModule.toBoolean()) {
    // 可以寫一下基類庫
    } else {
        implementation project(path: ':module_main')
        implementation project(path: ':module_keepAlive')
    }
  1. 兩個組件不能運行 因爲表單文件不完整, 爲了後期合併時不影響整體項目,所以 在main下創建一個module文件夾,並創建 AndroidManifest.xml 可以按照殼文件 添加完整 主要是application 標籤, package 名就不要改了
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.zhf.keepalive">

    <application
        android:name=".debug.App"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
    </application>

</manifest>

在這裏插入圖片描述
8. 在組件的build.gradle 文件的 android 標籤裏填加如下判斷代碼

    sourceSets {
        main {
            if (isModule.toBoolean()) {
                manifest.srcFile 'src/main/module/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                //集成開發模式下排除debug文件夾中的所有Java文件
                java {
                    exclude 'debug/**'
                }
            }
        }
    }
  1. 非完美CV工程師會發現 在集成模式時 有這麼一個配置 exclude ‘debug/**’,
  2. 在 項目包名下創建 debug文件夾 主意這裏面的文件只有在組件模式下才會運行,配置在第8步中已經添加
  3. 在debug文件夾下創建一個activity , 記得在module目錄下的配置文件註冊並設置爲入口頁面,如下
        <activity android:name=".debug.SplashActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
其實到了這裏你的兩個功能模塊就可以單獨運行了,如果到這裏沒有問題那就在模塊工程裏(非debug文件下 )創建一些頁面吧

在這裏插入圖片描述
我項目中 splashActivty 只有是組件模式時纔會調用, keepMainActiviyty 則什麼模式下都可以調用,

2) 模塊路由配置

上圖中我們說了 keepMainActiviyty 什麼模式下都能調用, 我們知道在集成模式下 很簡單,寫個intent 就可以開啓了,但是在集成模式下(合併成一個完整項目)怎麼辦呢,這事就要引入 路由框架了 這裏以 ARouter爲例

  1. 現在我們再創建一個庫 lib_common 所有組件都依賴他,是所有組件基礎庫
  2. 只在lib_common庫 中引入下面依賴
api 'com.alibaba:arouter-api:1.5.0'
  1. 在app殼 .main庫 和keepAlive庫 中引入下面依賴
 annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
implementation project(path: ':lib_common')
  1. 在所有組件build.gradle在android 標籤裏添加如下
       javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
     compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
  1. 配置完成 接下來就開始使用, 我有個需求 想跨組件跳轉到module_keepAlive 組件中的 keepMainActivity 頁面 要在這個activity上面加上 @Route 註釋 其中path 的值 必須是兩級目錄, 也就是要有兩個 反斜槓 這是 " 亀腚 "
@Route(path = "/keepalive/KeepMainActivity")
public class KeepMainActivity extends BaseActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}
  1. 在要跳轉的地方直接調用如下代碼就可以了 , 加try catch 是怕蹦沙卡拉卡
      try {
                ARouter.getInstance().build("/keepalive/KeepMainActivity").navigation();
            } catch (Exception e) {
                e.printStackTrace();
            }
別忘了在項目的兩個AndroidManifest.xml 表單文件中都註冊 上activity ,debug 文件夾下的除外,這樣合成完成項目時, 表單文件也會合並,最好不要出現重名和資源衝突問題.
別忘了把 isModule 的值改成 false 並同步項目, 到此基本完成了組件化項目

3 全局的 application 說明

  1. 在lib_commom 創建一個 BaseApp 繼承application
  2. 在 app殼 module_main 和module_keepAlive 中繼承 BaseApp, 注意兩個module的 BaseApp的實現直接放在debug下,
  3. 別忘了表單文件中註冊 application ,同樣的注意兩個module的只在module文件下的表單文件中註冊就可以了.
本文理論少,偏重實踐,對於有經驗的應該能基本理解. 如有看不懂的可以直接去文末的參考文章 理論加實踐

參考文章:
https://blog.csdn.net/guiying712/article/details/55213884

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章