筆者從 2016 年初就因?yàn)楣緲I(yè)務(wù)需求轉(zhuǎn)戰(zhàn) android sdk 開(kāi)發(fā), 應(yīng)用插件化技術(shù)將公司 android sdk 重新翻版。先來(lái)說(shuō)說(shuō)需求。
由于筆者所在一家創(chuàng)業(yè)公司, android sdk 實(shí)際運(yùn)營(yíng)時(shí)間并不長(zhǎng), 處于業(yè)務(wù)成長(zhǎng)階段, 經(jīng)常會(huì)面對(duì)各種需求更改以及運(yùn)營(yíng)通道穩(wěn)定性等個(gè)方面的問(wèn)題。由于種種的不穩(wěn)定性, 會(huì)導(dǎo)致 sdk 可能會(huì)經(jīng)常出現(xiàn)小規(guī)模修改的問(wèn)題, 用戶對(duì)這種行為當(dāng)然是非常不滿意的了??梢韵胂?,每一次 sdk 更新商務(wù)部門(mén)的同學(xué)要扛著多少用戶口水去和用戶商談,而技術(shù)部門(mén)又要承受到少商務(wù)部門(mén)同學(xué)的白眼。
為了徹底解決這種現(xiàn)狀, 從 16 年初我就開(kāi)始正式介入 android sdk 重新開(kāi)發(fā)這邊的工作。 需求 (1) 很明確, 就是要能夠做到 一次對(duì)接。介紹一下這個(gè)需求, 一次對(duì)接, 對(duì)于正常的 sdk 開(kāi)發(fā)來(lái)說(shuō)是最基本的需求, 因?yàn)?sdk 就應(yīng)該處于長(zhǎng)期穩(wěn)定的狀態(tài), 要不然用戶不太愿意使用。 可是這對(duì)我們公司的現(xiàn)狀來(lái)說(shuō)是致命的, 恰恰是最基本的我們保障不了。為了能夠留下為數(shù)可憐的那些用戶們,一定要做些事情。需求 (2) 能夠做到及時(shí) 升級(jí)。 當(dāng)然這個(gè) 升級(jí) 的需求就是針對(duì)我們自己的現(xiàn)實(shí)狀況, 產(chǎn)品處于成長(zhǎng)期迭代的功能多少都會(huì)有。
主要的需求就是這兩個(gè)。 從技術(shù)的角度仔細(xì)去分析這兩個(gè)需求, 其實(shí)就是一個(gè)需求。 就是做 sdk 的 熱更。筆者之前從事的是 cocos2d-x 游戲開(kāi)發(fā), 對(duì) 熱更 不可謂不熟。對(duì)于移動(dòng)領(lǐng)域的 app 開(kāi)發(fā)熱更技術(shù)也都是了解的, 不過(guò)都是建立在腳本語(yǔ)言基礎(chǔ)上的。 如大家經(jīng)常提及的 cocos2d-x/u3d lua/js, android/iOS h5等, 這些都有成熟的方案做參考, 而當(dāng)時(shí)擺在我面前的卻是翻閱了所有搜索引擎都沒(méi)找到先例的問(wèn)題。經(jīng)過(guò)一番苦思冥想之后, 從自己的記憶中提取到了一個(gè)片段 - 插件化。
15 年年底的時(shí)候, 快放假那段時(shí)間翻閱 github, 看到了一個(gè)很簡(jiǎn)明的 android 插件化框架 PluginMgr。果斷翻閱了當(dāng)時(shí)能找到的關(guān)于 插件化 的所有技術(shù)文章, 看懂看不懂的都閱讀一邊。 最終還是選擇了 PluginMgr。 我需要一個(gè)只需要支持 android activity 的插件化框架就可以了,另外,在 sdk 中使用也不能體積太大。它能滿足我目前的所有需求。 但是缺點(diǎn)卻也很明顯, 作者當(dāng)時(shí)已經(jīng)在開(kāi)發(fā)新的插件化框架了, 并沒(méi)有太多的時(shí)間去做維護(hù)和更新, 這意味著我自己需要能夠把控這個(gè)框架,這讓我一度很遲疑。 經(jīng)過(guò)一段時(shí)間后, 發(fā)現(xiàn)自己能夠完全掌握所需要的技術(shù)棧。于是開(kāi)始動(dòng)手, 新版 sdk 框架部分開(kāi)發(fā)大概一周左右,然后另一位同事加入, 幫我開(kāi)發(fā)我們 sdk 業(yè)務(wù) apk。
業(yè)務(wù) apk 的開(kāi)發(fā)是一個(gè)正常的 android 項(xiàng)目, 插件化框架對(duì)他開(kāi)始就是個(gè)黑匣子, 他不需要關(guān)心。 在后來(lái)實(shí)際上線的時(shí)候, 我提供了一些 宿主 和 插件 交互的 api 給他替換掉以前的一些 api 調(diào)用就可以了。 最后索性將這部分封裝做的徹底了點(diǎn), 讓他自己去調(diào)試自己的 業(yè)務(wù) apk, 成功了就可以直接發(fā)布。
而我這邊需要做的前期工作就是把 PluginMgr 做一些定制化的修改, 并修復(fù)一些原本的 bug。 然后就是做動(dòng)態(tài)更新部分的, 這很好做, 完全可以把以前做過(guò)的 熱更 部分拿過(guò)來(lái)做相應(yīng)的改動(dòng)就好了。 只不過(guò)我需要面向的是 更新 apk, 而不是原來(lái)的一個(gè)加密后的 腳本壓縮包。