Small插件化方案適用于將一個(gè)APK拆分為多個(gè)公共庫(kù)插件、業(yè)務(wù)模塊插件的場(chǎng)景。
完美內(nèi)置所有插件支持內(nèi)置于宿主包中
高度透明插件編碼、布局編寫(xiě)方式與獨(dú)立應(yīng)用開(kāi)發(fā)無(wú)異
插件代碼調(diào)試與整包開(kāi)發(fā)無(wú)異極致剪裁對(duì)插件分離所有一切能分離的公共代碼、資源
無(wú)縫鏈接通過(guò)設(shè)定URI,宿主、本地化應(yīng)用插件、本地化web插件、在線網(wǎng)頁(yè),以及任何自定義的插件之間能夠相互調(diào)起與傳遞參數(shù)
跨平臺(tái)目前已支持Android、iOS以及html5插件。并且三者之間可以通過(guò)同一套Javascript接口進(jìn)行通信。
工程build.gradle中引入small,目前已發(fā)布gradle插件1.0.0-beta7版本,small組件1.1.0-beta4.
buildscript {
...
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'net.wequick.tools.build:gradle-small:1.0.0-beta7'
....
}
}
...
apply plugin: 'net.wequick.small'
small {
aarVersion = '1.1.0-beta4'
}
工程結(jié)構(gòu)包括宿主工程app,業(yè)務(wù)模塊插件app.*,以及l(fā)ib.*公共庫(kù)插件工程。如:

- 1.app 宿主工程

宿主工程中僅僅應(yīng)用入口HostApp,啟動(dòng)首屏展示LoadingActivity(不包含任何網(wǎng)絡(luò)加載邏輯,廣告圖片加載邏輯放在業(yè)務(wù)插件app.launch中)。build.gradle中包含signingConfigs、buildTypes等,插件公共依賴可放到dependencies中,不會(huì)打包到插件中。

記得在assets中bundle.json文件配置插件包名和路由rules,否則small將找不到對(duì)應(yīng)插件。
- 2.app.業(yè)務(wù)模塊*
業(yè)務(wù)模塊之間互相獨(dú)立,通過(guò)small來(lái)管理跳轉(zhuǎn)和fragment的獲取。業(yè)務(wù)模塊包含自己的APIService(網(wǎng)絡(luò)請(qǐng)求使用lib.net,底層是retroifit+okhttp)、UI(Activity、Fragment、View、Adapter)、Model、Application。
Small Activity跳轉(zhuǎn)
Small.openUri("main", LaunchActivity.this);
Small獲取Fragment
BaseFragment fragment = (BaseFragment)Small.createObject("fragment-v4", "community/community", MainActivity.this);
- 3.lib.模塊*
lib模塊的引用最好在宿主工程中也保留一份,這樣不會(huì)打包到插件中,可以使最后只保留一份引用。Account也可以做成lib,供其他app插件調(diào)用。

lib.style中包含通用的動(dòng)畫(huà)、顏色、規(guī)格、尺寸、主題。
lib.utils放置一些通用help、utils,依賴style(dialog主題)。
lib.config 應(yīng)用的配置信息,版本號(hào)、包名、系統(tǒng)信息等。
lib.constant 暫時(shí)放置一些常量、枚舉、key、id等。
lib.analytics統(tǒng)計(jì)API
lib.net 網(wǎng)絡(luò)請(qǐng)求框架,retroifit+okhttp,處理token錯(cuò)誤等全局錯(cuò)誤。
lib.base放置Activity、Application、Fragment等的基類。
lib.router Small的uri特殊處理
- 4.其他第三方模塊和aar
其他依賴最好通過(guò)私有maven倉(cāng)庫(kù)管理。
jni_plugin用來(lái)存放一些so文件,以及jni接口。
jsbridge--webview和native交互的一個(gè)庫(kù),參考
https://github.com/gzsll/WebViewJavascriptBridge。