剛開始要作 SDK 熱修復,我是拒絕的 ~html
某日,解決完一個線上 bug 後,我冒出了一個念頭:讓咱們的 SDK 也具備熱修復的能力唄!android
可是查了查,網上資料少、不少熱修復方案只針對app……算法
但是我都拍胸脯向老大誇口了,焉有退縮的道理?!api
加上萬一之後手抖,出了個什麼大 bug 或者兼容問題,個人職業生涯不就要終結了!?安全
我滴乖乖,保命要緊!仍是趕忙作個保底方案吧。架構
咱們想實現的效果很簡單,以下場景三:app
先說明下,方案沒有最好,只有最合適。雖然我最終選定了方案四,但若是各位小夥伴的團隊有資源、有其餘方案的經驗、SDK的熱更需求更豐富,能夠自行選擇其餘方案。框架
從服務端下載 jar -> 經過反射,加載jar -> 建立相關對象而且操做之。性能
方案參考:
Android SDK熱修復機制簡析以實現學習
優勢:
缺點:
針對 jar 包體積大的狀況,咱們能夠考慮對 sdk 項目進行拆包(拆module),分紅小的 jar 包和主包
主包負責反射加載,若是須要熱修,下發子 jar 便可,比較輕量。
優勢:
缺點:
將SDK分包,宿主包僅提供 API 和加載核心實現的插件包,插件包就能夠熱更了。
優勢:
缺點:
走投無路之下,我想起,誒!不少 app 熱更方案不是說支持 lib 熱更嗎!那先做爲一個保底方案吧。
經過業務方 app 熱更 lib 包。
優勢:
缺點:
Sophix 功能完善、開發簡單透明,惋惜沒開源,沒法改造。
底層替換方案不可避免地存在兼容問題,棄之。
優勢:
缺點:
還有兩個問題,留給你們去思考:
擴展:
InstantRun 如何動態替換 Application,總結起來就兩步:
- 打包時替換 Application 標籤,插入BootstrapApplication
- 運行時 hook 系統api,將 BootstrapApplication 換回 MyApplication
Robust 的原理能夠簡單描述爲:
優勢:
缺點:
思考:
就在我美滋滋地接入 Robust 時,問題來了!
Robust 須要是 Application 才能插樁和打補丁,要用在 SDK 上,仍是須要一輪改造的。
如何改造?我將在下篇博文中詳解,同時將推出封裝好的庫,讓 SDK 開發者只需 5 分鐘便可讓本身的 SDK 擁有熱修復的能力,敬請期待。
固然,咱們的焦點並不侷限在技術實現上,還有不少值得咱們去考慮的:
咱們怎麼對分發進行控制?對監控數據進行統計?若是補丁引發了崩潰,咱們怎麼第一時間補救?
結合外部維度系統,根據用戶維度,好比渠道、系統版本等等作有差異的下發。
上線後咱們最關心的就是補丁的兼容性和成功率。
咱們須要支持自動監控崩潰,若是是下發的補丁引發的,則下次啓動補丁自動失效,避免擴大影響範圍。
以上這些思考,我將會在下篇博文中一一實現,敬請關注!
本篇完成耗時 6 個番茄鍾(180 分鐘)
我是 FeelsChaotic,一個寫得了代碼 p 得了圖,剪得了視頻畫得了畫的程序媛,致力於追求代碼優雅、架構設計和 T 型成長。
歡迎關注 FeelsChaotic 的簡書和掘金,若是個人文章對你哪怕有一點點幫助,歡迎 ❤️!你的鼓勵是我寫做的最大動力!
最最重要的,請給出你的建議或意見,有錯誤請多多指正!