atlas躯畴、replugin茫藏、small選擇
??在實(shí)現(xiàn)比特牛牛項(xiàng)目插件化之前误趴,花了較長一段時間在插件化方案選擇上,體驗(yàn)了atlas务傲、replugin凉当、small。應(yīng)該原有項(xiàng)目是模塊化的項(xiàng)目售葡,因此需求是每個模塊都能實(shí)現(xiàn)動態(tài)更新看杭,核心的業(yè)務(wù)插件不會太大,每次更新替換原有插件挟伙。
??replugin生成的插件不夠純粹楼雹,他會把v7的包相關(guān)class和資源打進(jìn)去導(dǎo)致包變得很大(超過1m),還很容易到時方法超過65536尖阔。atlas雖然是個不錯的選擇贮缅,但它動態(tài)部署時需要打差異包,強(qiáng)調(diào)的是熱修復(fù)介却,版本更新時工作量大携悯。而small打包簡單方便,相關(guān)資源不會重復(fù)打進(jìn)插件筷笨,核心的業(yè)務(wù)插件會很小憔鬼,只有幾百k,更新插件也簡單胃夏。
small使用注意事項(xiàng)
small的使用示例可以https://github.com/wequick/Small
獲取轴或,具體教程可以參照官網(wǎng)。如果有需要仰禀,先下載官方示例運(yùn)行一遍照雁。這里說一下幾個注意事項(xiàng):
1、每個module命名要規(guī)范,業(yè)務(wù)插件模塊需要用app.xxx命名饺蚊,并且要改為application類型(apply plugin: 'com.android.application')萍诱。公共庫插件以lib.xxx命名,要打入主殼apk的模塊(宿主分身)資源可以放到app+xxx命名的模塊(會被所有其他模塊引入)污呼。當(dāng)然也可以通過bundle.json定義每個module的type類型來區(qū)分插件類型裕坊。
2、如果公共庫里的自定義組件需要在ConstraintLayout布局中使用燕酷,就要把ConstraintLayout的依賴加到公共庫插件里籍凝。不能放到app+xxx(宿主分身下),否則讀取自定義屬性會有問題苗缩。
3饵蒂、自定義屬性declare-styleable的name屬性不要和庫重復(fù),否則讀取屬性會失敗酱讶。
4退盯、轉(zhuǎn)場動畫和通知欄圖標(biāo)要放入宿主分身。
5泻肯、ConstraintLayout中的group組件無效(可以自定義group)
6渊迁、ARouter無效(可以自己實(shí)現(xiàn)一個簡易版ARouter框架替換,見上篇)
7软免、業(yè)務(wù)插件布局文件定義的id不能和公共庫插件的id一樣宫纬,否則在運(yùn)行時會報NoSuchFieldError。(如果一定要重復(fù)的話膏萧,見Small重復(fù)id解決方法)
實(shí)戰(zhàn)總結(jié)
??最終漓骚,項(xiàng)目插件化還是比較圓滿的完成了。能夠通過配置文件動態(tài)更新插件列表榛泛,根據(jù)插件版本動態(tài)更新蝌蹂。需要頻繁更新的插件不大只有300k。如果需要引入大的資源曹锨,后面還可以增加插件喷众。兼容性方面窃祝,Android4.4(紅米)逮刨、Android7.0(vivo贪壳、OPPO)、Android8.0(華為)椒楣,Android 9.0 beta(pixel)都測試通過给郊。回頭看重構(gòu)難度方面捧灰,因?yàn)橹熬褪前凑漳K化開發(fā)的淆九,所以很好重構(gòu),并且small是兼容kotlin的。當(dāng)然也有一些坑點(diǎn)炭庙,如ARouter不支持啊饲窿,Glide不支持本地資源,還有最大的id重復(fù)問題焕蹄。不過還是找到了相關(guān)解決方案逾雄。總的來說擦盾,small對代碼極致裁剪嘲驾,打包方便淌哟,它也是我用完atlas迹卢、replugin等其他插件化的最終選擇。