導(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