第3章 仿微信".api"化 實(shí)現(xiàn)原理(下)

導(dǎo)航

第3章 組件聲明式編程 仿微信".api"化(上)
第3章 仿微信".api"化 實(shí)現(xiàn)原理(下)

1、思考路徑

將原本下沉到base模塊的通用性不高的代碼,被重新申領(lǐng)到各個(gè)業(yè)務(wù)模塊,運(yùn)行時(shí)動(dòng)態(tài)放入到base模塊,在項(xiàng)目不斷擴(kuò)大時(shí),避免了base在后期開發(fā)時(shí)急速膨脹,約束好代碼邊界

反復(fù)參考微信Android模塊化架構(gòu)重構(gòu)實(shí)踐思想,忽然有一個(gè)靈感,“.api”文件是java JVM不識(shí)別的,可不可以在編譯之前,將這些".api"文件變成系統(tǒng)可識(shí)別的。weixinapi,是這個(gè)插件由來的原因

2、代碼實(shí)現(xiàn)的核心邏輯

1、將項(xiàng)目中所有module中".api"文件拷貝至指定ApiModule
2、因?yàn)閖ava jvm不識(shí)別".api"文件,將ApiModule中“.api”文件后綴改為".java"
3、同理,將原來所有module中".api"文件編譯時(shí)移除使用(exclude)
4、清理ApiModule中空文件夾,使該項(xiàng)目顯得更加清晰

3、示例核心代碼 gradle腳本編寫

1、刪除api_module中所有java代碼 做項(xiàng)目初始化

task cleanApiLib() {
    delete project.rootProject.project(':module_api').projectDir.path + "/src/main/java"
}

2、api文件拷貝指定api_module ,且文件后綴改為".java"

task copyApiForCommLib(type: Copy) {

    group 'api'
    //遍歷所有項(xiàng)目 將api文件
    for (Project mProject : project.rootProject.getAllprojects()) {
        println(mProject.projectDir.path + "/src/main/java")
        from(mProject.projectDir.path + "/src/main/java") {
            include '**/**.api'
        }
    }

    println(project.rootProject.project(':module_api').projectDir.path + "/src/main/java")
    into file(project.rootProject.project(':module_api').projectDir.path + "/src/main/java")

    //將".api"改名為".java"
    rename { String filename ->
        int index = filename.indexOf(".api")
        String name = filename[0..index] + "java"
        return name
    }

}

3、api_module空文件夾清理

task clearApiEmptyDir() {
    String filePath = project.rootProject.project(':module_api').projectDir.path + "/src/main/java"
    println("show all filePath:" + filePath)
    clear(new File(filePath))
}

public static void clear(File dir) {
    File[] dirs = dir.listFiles()
    for (File file : dirs) {
        if (file.isDirectory()) {
            clear(file)
        }
    }

    if (dir.isDirectory() && dir.delete())
        println(dir.name + "清理成功")

}

4、項(xiàng)目編譯時(shí)移除原有module中“.api”文件

    //刪除api文件
    sourceSets {
        main {
            java {
                exclude('**/**.api')
            }
        }
    }
4、 采用groovy編寫weixinApi插件

本插件采用groovy編寫,難點(diǎn)在中間的一些語法差異,和細(xì)節(jié)優(yōu)化,請(qǐng)大家給我一個(gè)star,
主要考慮三點(diǎn):

  • 1、有利于開發(fā)者用戶快速集成
  • 2、減少不必要gradle腳本,干擾到用戶,重點(diǎn)在于業(yè)務(wù)
  • 3、增強(qiáng)weixinapi通用性

groovy 編寫其中有很多技術(shù)難點(diǎn),想要學(xué)習(xí)的朋友,可以我寫的插件源碼component/weixinApi

5、喜歡的朋友們記得給我的項(xiàng)目一個(gè)star

https://github.com/yinlingchaoliu/AndroidComponent
具體代碼位置去".api"插件
component/weixinApi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容