安卓舊項(xiàng)目使用Small框架插件化改造踩坑記

我們團(tuán)隊(duì)把一個(gè)10萬(wàn)行安卓代碼的舊項(xiàng)目(電商系統(tǒng)管理臺(tái)App),使用Small框架做了插件化改造枫浙。把項(xiàng)目分成了10多個(gè)插件模塊,解除了業(yè)務(wù)模塊之間的代碼耦合,為業(yè)務(wù)功能的快速迭代和多團(tuán)隊(duì)并行開發(fā)做好基礎(chǔ)架構(gòu)谍夭。遷移期間遇到了一些坑,但最后在大家的努力下基本得到了解決憨募,也感謝Small的作者光亮對(duì)我們提出的issue的快速響應(yīng)紧索。

Small 插件化框架
Small 插件化框架

Small的應(yīng)用場(chǎng)景

開發(fā)時(shí):讓你完全透明的像開發(fā)普通工程一樣完成插件開發(fā)
編譯時(shí):自動(dòng)化的幫助你分離各個(gè)公共庫(kù)、業(yè)務(wù)模塊插件(插件僅保留自身的代碼跟資源菜谣,達(dá)到最小化)
運(yùn)行時(shí):運(yùn)用最少量的Hook無(wú)縫的將各個(gè)插件并入宿主珠漂,讓代碼跟資源完全融合晚缩,自由調(diào)用
所以撇開開發(fā)者不用關(guān)注的(2)來(lái)說,Small的目的就是要做到保證開發(fā)者「暢快開發(fā)」的體驗(yàn)媳危,以及App使用者「順暢使用」的體驗(yàn)荞彼。

插件化方案有很多,很難有統(tǒng)一的形態(tài)待笑,各有各的適用場(chǎng)景鸣皂。如果你需要分發(fā)你的插件給別人使用,Small無(wú)法滿足滋觉;如果你想利用插件化拆分签夭、重組自己的應(yīng)用,我認(rèn)為Small在這方面已經(jīng)走在了前面椎侠,并且將不斷完善第租,做到極致。

插件化的工程(開發(fā))結(jié)構(gòu)

關(guān)于工程(開發(fā))結(jié)構(gòu)的討論
1.依賴管理:Small使用同一個(gè)ClassLoader加載不同的插件我纪,因此不同插件中的依賴在運(yùn)行時(shí)對(duì)其他插件和宿主都是可見的慎宾,所以依賴的管理一定要收斂,統(tǒng)一管理浅悉,避免各自引入趟据。
2.插件之間的通信:插件的開發(fā)一般都是多team并行的,插件之間應(yīng)避免直接調(diào)用來(lái)減少耦合
3.資源的使用:由于small的特性术健,runtime各插件的資源也是可以相互訪問的汹碱,但在開發(fā)上需要組織和統(tǒng)一管理好,包括命名和安全的使用資源荞估。

老項(xiàng)目集成Small插件的官方建議

基本原則

宿主中不要放業(yè)務(wù)邏輯咳促。只做加載插件以及調(diào)起主插件的操作。

重構(gòu)步驟

  1. 拆lib.* - 公共模塊插件
    把各個(gè)第三方庫(kù)拆出來(lái)做成一個(gè)個(gè)lib.*插件模塊勘伺,包括統(tǒng)計(jì)跪腹、地圖、網(wǎng)絡(luò)飞醉、圖片等庫(kù)冲茸。
    把老項(xiàng)目積累的業(yè)務(wù)公共代碼(utils)分離出來(lái)封裝成一個(gè)lib.utils插件
    把基礎(chǔ)的樣式、主題分離出來(lái)封裝成一個(gè)lib.style插件
  2. 拆app.* - 業(yè)務(wù)模塊插件
    把業(yè)務(wù)模塊拆成app.*模塊缅帘,他們可以依賴lib.*模塊轴术,顯示調(diào)用lib.*中的各個(gè)API
    相對(duì)獨(dú)立的業(yè)務(wù)模塊先拆,比如“詳情頁(yè)”钦无、“關(guān)于我們”逗栽,如果剩下的業(yè)務(wù)不好拆,先放一個(gè)插件里
    如果都不好拆铃诬,先把全部業(yè)務(wù)做成一個(gè)app.main主插件

插件之間的通信

插件之間的通信/互調(diào)
目前的插件之間的通信僅限于Small.openUri()祭陷,用來(lái)調(diào)起其它插件的頁(yè)面。

但有些時(shí)候趣席,我們還是需要操作一下其它插件兵志。 比如說在跳轉(zhuǎn)到另一個(gè)插件的頁(yè)面之前,需要查詢一下對(duì)方插件的一個(gè)狀態(tài)宣肚。
我覺得應(yīng)該借助v4包的LocalBroadcastManager來(lái)實(shí)現(xiàn)

老項(xiàng)目集成Small插件化遇到的坑

  1. 插件中通過startActivityForResult獲取不到數(shù)據(jù)問題想罕。如果啟動(dòng)的Activity是SingleTask啟動(dòng)模式,有這個(gè)問題霉涨。

  2. 插件lib2依賴插件lib1按价,導(dǎo)致同時(shí)依賴lib1和lib2的插件app1編譯時(shí)出現(xiàn)找不到類的情況。

  3. 一個(gè)lib依賴另一個(gè)lib笙瑟,buildLib時(shí)出現(xiàn)Duplicate package錯(cuò)誤
    一個(gè)lib依賴另一個(gè)lib楼镐,buildLib時(shí)出現(xiàn)下面的錯(cuò)誤,目前還沒有找到解決吧往枷,clean工程和cleanLib都做了框产,但還不行,只好把依賴去掉了才行错洁。原因未知

  4. 如果插件用到了百度地圖等秉宿,需要把相關(guān)的功能放在一個(gè)插件下面,注意那些很大的.so是放在插件里面的

  5. Small插件中是支持aar引用的屯碴,實(shí)際使用過了

  6. Small 0.9版本的插件限制了包名描睦,因此已有代碼復(fù)制過來(lái)會(huì)有改變。特別要注意layout文件中自定義ban件包名的改動(dòng)导而,能夠通過編譯但運(yùn)行時(shí)會(huì)找不到類忱叭。1.1版本支持自定義包名了

  7. 通過assembleRelease單獨(dú)編譯一個(gè)插件出現(xiàn)下面的錯(cuò)誤,但有的電腦能正常單獨(dú)編譯插件嗡载,原因未知窑多,已經(jīng)提issue。

下午2:30:54: Executing external task 'assembleRelease'...
Configuration on demand is an incubating feature.
Incremental java compilation is an incubating feature.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app.me'.
> Could not find property 'android' on project ':app'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED
  1. 第三方SDK的meta洼滚,Service等需要在宿主App的manifest中聲明埂息,例如百度地圖SDK的定位Service。
  2. lib.utils刪除資源后出現(xiàn)編譯錯(cuò)誤遥巴,解決辦法是刪除public.txt千康,重新編譯lib和bundle
  3. 老代碼一些業(yè)務(wù)上耦合比較緊的頁(yè)面不容易拆開,可以作為一個(gè)模塊存在铲掐,我們最后拆成了6個(gè)大模塊拾弃。
  4. 目前1.0版本不支持gradle并行編譯,在gradle.properties中打開org.gradle.parallel=true 編譯會(huì)報(bào)錯(cuò)
    gradle  buildLib -q
  [Small] [Small] building library 1 of 2 - app (0x7f)
  [Small] [Small] building library 1 of 2 - app (0x7f)
  building library 2 of 2 - lib.utils (0x73)

  FAILURE: Build failed with an exception.

  * What went wrong:
  Execution failed for task ':lib.utils:preBuild'.
   ./build-small/intermediates/small-pre-link/aar/app-D.txt (No such file or directory)

參考gradle文檔
這個(gè)不是Bug摆霉,有依賴的工程肯定是不能并行編譯的

后面遇到問題會(huì)持續(xù)更新

更新
Small框架0.9升級(jí)1.0時(shí)出了很多bug豪椿,主要是在windows上編譯有些問題奔坟,但現(xiàn)在新版本已經(jīng)修復(fù)了。

2016年8月25日使用Small插件化的千米電商云App已經(jīng)在各大應(yīng)用市場(chǎng)上線了搭盾!歡迎體驗(yàn)啊

參考文章

https://github.com/wequick/Small/issues

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咳秉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸯隅,更是在濱河造成了極大的恐慌澜建,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌以,死亡現(xiàn)場(chǎng)離奇詭異炕舵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跟畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門咽筋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人徊件,你說我怎么就攤上這事晤硕。” “怎么了庇忌?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵舞箍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我皆疹,道長(zhǎng)疏橄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任略就,我火速辦了婚禮捎迫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘表牢。我一直安慰自己窄绒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布崔兴。 她就那樣靜靜地躺著彰导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敲茄。 梳的紋絲不亂的頭發(fā)上位谋,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音堰燎,去河邊找鬼掏父。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秆剪,可吹牛的內(nèi)容都是我干的赊淑。 我是一名探鬼主播爵政,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陶缺!你這毒婦竟也來(lái)了茂卦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤组哩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后处渣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伶贰,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年罐栈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黍衙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠诬,死狀恐怖琅翻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柑贞,我是刑警寧澤方椎,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站钧嘶,受9級(jí)特大地震影響棠众,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜有决,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一闸拿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧书幕,春花似錦新荤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至苟呐,卻和暖如春智袭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掠抬。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工吼野, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人两波。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓瞳步,卻偏偏與公主長(zhǎng)得像闷哆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子单起,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容