色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

剖析Android項目組件化重構架構

jf_78858299 ? 來源:小余的自習室 ? 作者:小余的自習室 ? 2023-03-30 10:41 ? 次閱讀

1.組件化重構效果

這里先看下我們重構前后的框架圖比較:

重構前:

圖片

傳統代碼架構.png

重構后

圖片

組件化代碼架構.png

  • ft_xxx表示業務層模塊 lib_xxx表示基礎庫模塊

重構后的架構圖如下

圖片

服務接口調用.png

重構前的代碼業務封裝在宿主app中,業務耦合嚴重,如果修改一個業務模塊,需要對整個app進行完整測試,測試工作量巨大

重構后,我們只需要對單一app進行獨立調試即可。

重構后的框架結構:所有的業務組件之間通訊都通過ft_base_service進行通訊

2.組件化重構準則

  • 1.單一業務可以單獨調試,也可以作為lib提供給宿主app使用
  • 2.同一級別的模塊不允許直接調用,比如我們的ft_home組件不允許直接調用ft_login組件,不然組件化的意義就不存在了
  • 3.組件間通訊不能直接使用顯示的class文件跳轉,可以考慮很用ARouter框架進行解耦
  • 4.每個組件可打包為aar或者jar上傳到maven私服,宿主使用的時候,直接引用私服中aar包即可

能做到以上幾點,你的app就可以稱為一個組件化框架的app了。

3.組件化重構思路

圖片

重構思路.png

    1. :拆代碼,拆資源,拆構建

      由于所有業務和資源都耦合在宿主app中,所以需要將代碼和資源拆開到對應模塊中

      當然我們的構建build.gradle也需要拆分到不同模塊中

    1. :對外提供接口

      組件化之間不能直接通訊,需要使用暴露接口的方式對外通訊

    1. :反復測試

      重構后代碼,需要反復測試,防止出現意想不到的bug

4.組件化重構過程

這里我以登錄業務ft_login為例子:

1. 步驟1 :首先新建一個業務模塊ft_login,然后在宿主app中將登錄功能相關聯的代碼和資源抽離到ft_login

2. 步驟2 :將和登錄構建相關的依賴分配到ft_login構建中。

3. 步驟3 :單獨調試功能實現

  • 3.1:在gradle.properties中創建一個全局變量:isRunAlone=true
  • 3.2:在build.gradle中:
if(isRunAlone.toBoolean()){
    apply plugin:'com.android.application'
}else{
    apply plugin:'com.android.library'
}

android {
    compileSdkVersion 33
    buildToolsVersion "33.0.0"

    defaultConfig {
        if(isRunAlone.toBoolean()){
            applicationId 'com.anna.ft_login'
        }
        ...
    }
    sourceSets {
        main {
            java {
                srcDirs = ['src/main/java']
            }
            resources {
                srcDirs = ['src/main/res']
            }
            aidl {
                srcDirs = ['src/main/aidl']
            }
            manifest {
                if(isRunAlone.toBoolean()){
                    srcFile 'src/main/manifest/AndroidManifest.xml'
                }else {
                    srcFile 'src/main/AndroidManifest.xml'
                }
            }
        }
    }
}
def dependList = [rootProject.depsLibs.okhttp,
                  rootProject.depsLibs.gson,
                  rootProject.depsLibs.appcompact,
                  rootProject.depsLibs.design,
                  rootProject.depsLibs.eventbus,
                  rootProject.depsLibs.arouterapi,
                  ':lib_network',':lib_common_ui',':ft_base_service']


dependencies {
    if(!isRunAlone.toBoolean()){
        dependList.each { String depend ->
            depend.startsWithAny(':lib',':ft')? compileOnly(project(depend)):compileOnly(depend){
                switch (depend){
                    case rootProject.depsLibs.arouterapi:
                        exclude group: 'com.android.support'
                        break;
                }
            }
        }
    }else {
        dependList.each { String depend ->
            depend.startsWithAny(':lib',':ft')? implementation(project(depend)):implementation(depend) {
                switch (depend) {
                    case rootProject.depsLibs.arouterapi:
                        exclude group: 'com.android.support'
                        break;
                }
            }
        }
    }
    //arouter注解處理器
    annotationProcessor rootProject.depsLibs.aroutercompiler

    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

}

單獨調試狀態下注意四點

  • 1.引用application插件
  • 2.引入applicationId
  • 3.引入不同給的sourceSets構建路徑
  • 4.引入的庫單獨調試狀態下需要使用implementation導入,不能使用compileOnly

實現上面四點, 只要打開isRunAlone就可作為一個單獨app運行了

4.步驟4:組件間通訊

這里,我們引入一個ft_base_service模塊,這個模塊用來實現組件間通訊用,需要調用別的業務模塊都需要使用這個模塊才能通訊、

業務模塊與ft_base_service之間通訊使用的是路由ARouter

關于ARouter的使用可以參考這篇文章:

Android開源系列-組件化框架Arouter-(一)使用方式詳解

  • 1.創建ft_base_service,在這個模塊中:創建一個LoginService接口繼承IProvider

引入ARouter依賴

android {
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]
        }
    }
}
//arouter核心api
implementation rootProject.depsLibs.arouterapi
//arouter注解處理器
annotationProcessor rootProject.depsLibs.aroutercompiler

創建LoginService:

public interface LoginService extends IProvider {
    boolean hasLogin();
    void login(Context context);
}
  • 2.在ft_login業務模塊中實現LoginService接口

注意這里因為使用了ARouter注解,所以也需要引入ARouter依賴

@Route(path = "/login/login_service")
public class LoginServiceImpl implements LoginService {
    Context context;
    @Override
    public boolean hasLogin() {
        return UserManager.getInstance().hasLogined();
    }

    @Override
    public void login(Context context) {
        LoginActivity.start(context);
    }

    @Override
    public void init(Context context) {
        Log.d("TAG","LoginServiceImpl is init");
    }
}
  • 3.在ft_base_service模塊中對LoginService接口進行依賴注入
public class LoginImpl {

    @Autowired(name = "/login/login_service")
    public LoginService mLoginService;
    private static LoginImpl mLoginImpl = null;
    public static LoginImpl getInstance() {
        if (mLoginImpl == null) {
            synchronized (LoginImpl.class) {
                if (mLoginImpl == null) {
                    mLoginImpl = new LoginImpl();
                }
                return mLoginImpl;
            }
        }
        return mLoginImpl;
    }

    private LoginImpl(){
        ARouter.getInstance().inject(this);
    }
    public boolean hasLogin(){
        return mLoginService.hasLogin();
    }
    public void login(Context context){
        mLoginService.login(context);
    }

}

筆者使用了一個 單例類LoginImpl ,在構造器中對LoginService依賴注入

ARouter.getInstance().inject(this);

然后宿主app或者其他模塊引用登錄業務功能時,需要依賴ft_base_service模塊,并使用LoginImpl的接口即可。

這里要說明下,平時我們使用的四大組件跳轉也可以使用這個方式來處理,在服務接口中定義跳轉接口即可。當然也可以使用Arouter的Activity跳轉方式或者Fragment實例獲取方式

  • 5.代碼打包aar上傳到maven私服

關于這塊maven私服更多內容可以參考這篇文章:

Gradle筑基篇(六)-使用Maven實現組件化類庫發布

這里我們封裝了一個通用組件發布庫:

apply plugin: 'maven'


uploadArchives {
    repositories {
        mavenDeployer {
            // 是否快照版本
            def isSnapShot = Boolean.valueOf(MAVEN_IS_SNAPSHOT)
            def versionName = MAVEN_VERSION
            if (isSnapShot) {
                versionName += "-SNAPSHOT"
            }
            // 組件信息
            pom.groupId = MAVEN_GROUP_ID
            pom.artifactId = MAVEN_ARTIFACTID
            pom.version = versionName

            // 快照倉庫路徑
            snapshotRepository(url: uri(MAVEN_SNAPSHOT_URL)) {
                authentication(userName: MAVEN_USERNAME, password: MAVEN_USERNAME)
            }
            // 發布倉庫路徑
            repository(url: uri(MAVEN_RELEASE_URL)) {
                authentication(userName: MAVEN_USERNAME, password: MAVEN_USERNAME)
            }

            println("###################################"
                    + "\\nuploadArchives = " + pom.groupId + ":" + pom.artifactId + ":" + pom.version + "." + pom.packaging
                    + "\\nrepository =" + (isSnapShot ? MAVEN_SNAPSHOT_URL : MAVEN_RELEASE_URL)
                    + "\\n###################################"
            )
        }
    }
}

然后在對應的組件下面引用:

apply from:file('../maven.gradle')

發布的時候直接在Gradle面板中點擊uploadArchives任務即可

圖片

task面板.png

經過上面幾個步驟就基本完成了login組件的封裝并發布,且對外提供了login組件接口 其他組件也是按照上面的邏輯進行重構

更多詳細信息可以自己拿到項目源代碼查看。

5.組件化重構總結

組件化不僅是一種架構,更是一種思想,架構是可以變得,但是核心思想卻是統一的,在拆分代碼的時候,要注意模塊的顆粒度,不是顆粒度越小就越好,模塊分離的好,后期對組件改造會有很大幫助, 關于組件化的文章就講到這里,組件化重構的項目已經上傳到Github。后面會出一期插件化的項目改造。敬請期待。

** demo地址: https://github.com/ByteYuhb/anna_music_app **

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3943

    瀏覽量

    127743
  • APP
    APP
    +關注

    關注

    33

    文章

    1577

    瀏覽量

    72671
  • 代碼
    +關注

    關注

    30

    文章

    4823

    瀏覽量

    68900
收藏 人收藏

    評論

    相關推薦

    Android的系統架構包括哪些部分?

    什么是Android以后,再來說說Android的系統架構包括哪些部分。Android的系統架構和其操作系統一樣,采用了分層的
    發表于 12-04 14:11

    【懸賞100塊】如何實現FPGA可重構計算(Android平臺)

    LZ我是大四計算機的,沒錯,我在做畢設,而且幾乎一籌莫展。題目是在Android平臺上實現可重構計算:簡單說,就是實現應用程序把一部分計算密集型的任務交給FPGA來計算,把FPGA作為CPU的一個
    發表于 05-20 20:03

    STM32庫函數架構剖析

    STM32庫函數架構剖析
    發表于 06-20 17:08

    [資料分享]+Android內核剖析

    `[資料分享]+Android內核剖析一、看威武霸氣的封面作者:柯元旦 二、讀讀簡介,看看適合你嗎? 本書詳細分析了Android內核的內部機制,包括窗口管理系統、Activity管理系統
    發表于 09-26 10:46

    Android手機操控ARM開發板外圍硬件設備【創科之龍】原創

    _源碼架構分布剖析零死角玩轉Android下_如何進行Android源碼編譯Makefile剖析 零死角玩轉
    發表于 01-12 22:31

    Android RIL架構簡介

    架構說起—Android架構從手機的架構說起—Android給客戶的價值從RIL的架構說起—R
    發表于 09-25 15:46

    Android系統的CPU架構

    Android CPU 架構詳解
    發表于 04-15 12:00

    初探Android系統整體架構

    Android系統龐大且錯綜復雜,今天小編將帶領大家初探Android系統整體架構,一窺其全貌。引言本文作為Android系統架構的開篇,起
    發表于 08-20 06:32

    XML在可重構制造執行系統組件管理中的應用

    基于組件技術研究和開發可重構制造執行系統(RMES),需要解決大量不同功能業務組件的維護問題。本文基于XML-Schema 機制設計了一套標準描述方法,來定義RMES
    發表于 08-24 11:31 ?7次下載

    深入剖析Android消息機制

    深入剖析Android消息機制
    發表于 01-22 21:11 ?11次下載

    關于iOS組件的分析

    1.組件的目的是什么? 最近一兩年很多人都想在項目里面搞組件,覺得搞組件
    發表于 09-25 10:28 ?0次下載
    關于iOS<b class='flag-5'>組件</b><b class='flag-5'>化</b>的分析

    華為BBF CloudCO架構標準為運營商重構寬帶網絡架構提供了關鍵的參考

    BBF CloudCO架構標準為運營商重構寬帶網絡架構提供了關鍵的標準參考,是邁向云網絡的關鍵一步。
    發表于 10-25 09:45 ?2827次閱讀

    重構計算架構將引領未來芯片的市場發展

    AI芯片創業公司清微智能首款可重構計算架構AI芯片實現量產的消息在業內迅速傳開,可重構計算架構芯片再次引發一波討論的熱潮。
    的頭像 發表于 12-16 15:55 ?3249次閱讀

    重構架構技術的快速發展,未來將應用于太空

    如今,技術的進步使得低軌飛行越來越容易商用。賽靈思太空產品系統架構師Minal Sawant表示,航天行業的主要挑戰之一是用于各種項目的體系結構,多任務的靈活架構平臺是如今的一個挑戰
    發表于 05-22 10:35 ?580次閱讀

    基于AndroidCrop進行鴻蒙的開源圖片裁剪組件

    項目是基于開源項目 AndroidCrop 進行鴻蒙的移植和開發的,可以通過項目標簽以及github地址( https://github
    發表于 03-23 09:53 ?2次下載
    主站蜘蛛池模板: 55夜色66夜亚洲精品播放 | 午夜精品久久久久久影视riav | 好男人在线观看视频观看高清视频免费 | 国产精品福利片 | 九九精品视频在线播放 | qvod 在线| 国产精品系列在线一区 | 日韩亚洲欧洲在线rrrr片 | 免费一级毛片在线观看 | 男人的天堂色 | 国内久久久久影院精品 | 性xxxx18公交车 | 中国bdsmchinesehd 中俄两军在日本海等上空战略巡航 | 吃春药后的女教师 | 99热这里只有精品视频2 | 亚洲精品天堂自在久久77 | 伊人久久久久久久久香港 | np高h肉辣一女多男 no视频在线观看 | 十分钟免费观看大全视频 | 九九精彩视频在线观看视频 | 99久久精品国产一区二区三区 | 黑人干亚洲人 | 暗卫受被肉到失禁各种PLAY | 99久久就热视频精品草 | 么公一夜要了我一八次视频HD | 国产成人刺激视频在线观看 | 秋霞网站一级一片 | 亚洲欧美国产旡码专区 | 涩涩涩涩爱网站 | 恋夜影院支持安卓视频美女 | 69国产精品人妻无码免费 | 国产日韩成人内射视频 | 99精品视频一区在线视频免费观看 | 亚洲黄色三级视频 | 极品少妇高潮啪啪无码吴梦 | 久久午夜免费视频 | 韩国伦理片2018在线播放免费观看 | 亚洲国产精品嫩草影院永久 | 欧美性视频xxxxhd | 久久视热频这里只精品 | 国产69精品麻豆久久久久 |