Android項目模塊化實踐

項目模塊化是一個大命題,相信各團隊都有其合理方案。本文不求涵蓋各方面,僅從項目協同、開發調試、業務模塊服務調用與通知三個方面簡述一個可行方案。html

項目協同

項目協同,也叫多項目協同,是對多個相關且有並行狀況項目的管理模式,它是幫助實現項目與企業戰略相結合的有效理論和工具[1]。本文的項目協同爲Android主APP與其餘業務模塊的協同。
假設咱們的APP目錄以下,一個主app,多個modules。並假設咱們的主app與各modules爲多git repository。一個大APP多git repository管理是合理的。本文使用git repo[2]管理項目(可能有團隊使用git submodule[3],在此不推薦,其坑會不少)。android

MApp --獨立git rep
    app
    modules
           module1 --獨立git rep
           module2 --獨立git rep
           module3 --獨立git rep
           ...

使用git repo,團隊早期能夠不用玩一整套(git repo+gerrit),能夠考慮只用repo去管理項目目錄,成員提交代碼仍是繼續走git提交。git

項目開發與調試

Android模塊化的主要目的是業務並行開發,減小編譯時間,但又方便業務模塊與主App的調試。本文介紹以下方案。github

MApp
    app   --application
    modules
           module1
                  demo --application
                  lib  --library
                  settings.gradle

    settings.gradle
    settings_debug.gradle
    local.properties

MApp的settings.gradle文件:app

boolean moduleDebug() {
        boolean ret = false
        try {
            Properties properties = new Properties()
            File file = file('local.properties')
            if (!file.exists()) {
                return false
            }
            properties.load(file.newDataInputStream())
            String debugStr = properties.getProperty("debug")
            if (debugStr != null && debugStr.length() > 0) {
                ret = debugStr.toBoolean()
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace()
            ret = false
        }
        return ret
    }
    
    include ':app'
    if (moduleDebug()) {
        apply from: 'settings_debug.gradle'
    }

settings_debug.gradle文件:ide

//include 'module1'
//project(':module1').projectDir = new File('modules/module1/lib')
...其餘業務模塊

當module1在需求開發階段,徹底不用考慮主APP,能夠在Android Studio中以項目的方式打開。當module1須要和主APP跑流程時,咱們只須要把MApp的local.properties的debug屬性改成true,並在settings_debug.gradle中打開module1便可。模塊化

業務模塊服務調用與通知

當APP模塊化後,經過Intent(Context packageContext, Class<?> cls)方式去啓動其餘模塊的Activity就不太合理了。模塊化後,模塊裏的Activity或其餘組件對其餘業務模塊最好透明。喚起Activity能夠經過App Links[4]的方式,也就是咱們常說的url router方式。App Links還能夠玩deep link。Github上如今開源項目好比ARouter[5]就是App Link的應用。
固然,模塊之間的通訊,不侷限於啓動四大組件,還有服務調用與通知。這的服務不是Android系統的Service。舉個服務通知的例子,在電商APP中,店鋪詳情頁點收藏按鈕,可能要通知其餘模塊,變動UI或數據。服務調用的例子,好比模塊喚起登錄註冊,登錄或註冊成功後,作相應業務處理。
服務調用,大部分團隊可能沒涉及到。服務調用能夠用IOC,反射等註冊到服務註冊中心。本文選一個取巧的方案。利用Applicatin.getSystemService方法,讓Application做爲ZoomKeep同樣成爲服務註冊中心。只要各Serivce繼承同一個Interface,相應模塊間服務調用就不難了。工具

public class MApp extends Application {
    
    @Override
    public Object getSystemService(String name) {
        return super.getSystemService(name);
    }
}

服務通知,稍簡單,用廣播,EventBus[6]或其餘方式均可。本文推薦EventBus,但其有缺點,如Event多起來後,很難找全觀察者和通知者之間的關係;一些簡單Event對象沒法複用,因此最好二次開發。gradle

參考

[1] 項目協同: http://www.baike.com/wiki/%E9...
[2] git repo:https://gerrit.googlesource.c...
[3] git submodule:https://git-scm.com/book/zh/v...
[4] App Links:https://developer.android.com...
[5] ARouter:https://github.com/alibaba/AR...
[6] EventBus:https://github.com/greenrobot...google

相關文章
相關標籤/搜索