Shadow騰訊的 Android 插件框架
Shadow是一個(gè)騰訊自主研發(fā)的Android插件框架,經(jīng)過(guò)線上億級(jí)用戶量檢驗(yàn)。 Shadow不僅開(kāi)源分享了插件技術(shù)的關(guān)鍵代碼,還完整的分享了上線部署所需要的所有設(shè)計(jì)。
與市面上其他插件框架相比,Shadow主要具有以下特點(diǎn):
- 復(fù)用獨(dú)立安裝App的源碼:插件App的源碼原本就是可以正常安裝運(yùn)行的。
- 零反射無(wú)Hack實(shí)現(xiàn)插件技術(shù):從理論上就已經(jīng)確定無(wú)需對(duì)任何系統(tǒng)做兼容開(kāi)發(fā),更無(wú)任何隱藏API調(diào)用,和Google限制非公開(kāi)SDK接口訪問(wèn)的策略完全不沖突。
- 全動(dòng)態(tài)插件框架:一次性實(shí)現(xiàn)完美的插件框架很難,但Shadow將這些實(shí)現(xiàn)全部動(dòng)態(tài)化起來(lái),使插件框架的代碼成為了插件的一部分。插件的迭代不再受宿主打包了舊版本插件框架所限制。
- 宿主增量極小:得益于全動(dòng)態(tài)實(shí)現(xiàn),真正合入宿主程序的代碼量極?。?5KB,160方法數(shù)左右)。
- Kotlin實(shí)現(xiàn):core.loader,core.transform核心代碼完全用Kotlin實(shí)現(xiàn),代碼簡(jiǎn)潔易維護(hù)。
支持特性
- 四大組件
- Fragment(代碼添加和Xml添加)
- DataBinding(無(wú)需特別支持,但已驗(yàn)證可正常工作)
- 跨進(jìn)程使用插件Service
- 自定義Theme
- 插件訪問(wèn)宿主類(lèi)
- So加載
- 分段加載插件(多Apk分別加載或多Apk以此依賴加載)
- 一個(gè)Activity中加載多個(gè)Apk中的View
- 等等……
編譯與開(kāi)發(fā)環(huán)境
環(huán)境準(zhǔn)備
第一次clone Shadow的代碼到本地后,建議先在命令行編譯一次。
- 在編譯前,必須設(shè)置
ANDROID_HOME環(huán)境變量。 - 在編譯時(shí),必須使用
gradlew腳本,以保證采用了項(xiàng)目配置的Gradle版本。
在命令行測(cè)試編譯時(shí)可以執(zhí)行這個(gè)任務(wù):
./gradlew build
如果沒(méi)有出錯(cuò),再嘗試用Android Studio打開(kāi)工程。
- 必須使用3.4或更高版本的Android Studio打開(kāi)工程。(業(yè)務(wù)插件開(kāi)發(fā)時(shí)沒(méi)有限制)
- 必須關(guān)閉Android Studio的Instant Run功能。
然后就可以在IDE中選擇sample-host模塊直接運(yùn)行了。
Shadow的所有代碼都位于projects目錄下的3個(gè)目錄,分別是:
-
sdk包含SDK的所有代碼 -
test包含SDK的自動(dòng)化測(cè)試代碼 -
sample包含演示代碼
其中sample應(yīng)該是大家體驗(yàn)Shadow的最佳環(huán)境。 詳見(jiàn)sample目錄中的README介紹。
自己寫(xiě)的測(cè)試代碼出錯(cuò)?
以我們多年的插件環(huán)境下業(yè)務(wù)開(kāi)發(fā)經(jīng)驗(yàn),插件框架是不可能一步到位實(shí)現(xiàn)完美的。 因此,我們相信大部分業(yè)務(wù)在接入時(shí)都是需要一定的二次開(kāi)發(fā)工作。 Shadow現(xiàn)有的代碼滿足的是我們自己的業(yè)務(wù)現(xiàn)在的需求。得益于全動(dòng)態(tài)的設(shè)計(jì), 插件框架和插件本身都是動(dòng)態(tài)發(fā)布的,插件包里既有插件代碼也有插件框架代碼, 所以可以根據(jù)新版本插件的需要同時(shí)開(kāi)發(fā)插件框架。
例如,ShadowActivity沒(méi)有實(shí)現(xiàn)全所有Activity方法,你寫(xiě)的測(cè)試代碼可能用到了, 就會(huì)出現(xiàn)Method Not Found錯(cuò)誤,只需要在ShadowActivity中實(shí)現(xiàn)對(duì)應(yīng)方法就可以了。 大部分方法的實(shí)現(xiàn)都只是需要簡(jiǎn)單的轉(zhuǎn)調(diào)就能工作正常。
如果遇到不會(huì)實(shí)現(xiàn)的功能,可以提Issue。最好附上測(cè)試代碼。
后續(xù)開(kāi)發(fā)
- 原理與設(shè)計(jì)說(shuō)明文檔
- 多插件支持的演示工程
- 自動(dòng)化測(cè)試用例補(bǔ)充
- 開(kāi)源包含下載能力的manager實(shí)現(xiàn)
