安卓外掛化框架Shadow原理分析

aa111111發表於2022-03-17

一、前言:

1.介紹:

Shadow是一個騰訊自主研發的Android外掛框架,經過線上億級使用者量檢驗。 Shadow不僅開源分享了外掛技術的關鍵程式碼,還完整的分享了上線部署所需要的所有設計。


與市面上其他外掛框架相比,Shadow主要具有以下特點:


複用獨立安裝App的原始碼:外掛App的原始碼原本就是可以正常安裝執行的。

零反射無Hack實現外掛技術:從理論上就已經確定無需對任何系統做相容開發,更無任何隱藏API呼叫,和Google限制非公開SDK介面訪問的策略完全不衝突。

全動態外掛框架:一次性實現完美的外掛框架很難,但Shadow將這些實現全部動態化起來,使外掛框架的程式碼成為了外掛的一部分。外掛的迭代不再受宿主打包了舊版本外掛框架所限制。

宿主增量極小:得益於全動態實現,真正合入宿主程式的程式碼量極小(15KB,160方法數左右)。

Kotlin實現:core.loader,core.transform核心程式碼完全用Kotlin實現,程式碼簡潔易維護。

2.專案地址

專案地址:GitHub - Tencent/Shadow: 零反射全動態Android外掛框架


二、原理分析:

Shadow號稱無Hook點。核心原理是運用代理的方式,把原本的acitivty編譯期間改成一個代理類,去代理宿主activity的所有生命週期。


2.1 傳統的方案

既然這裡提到了Shadow的特點是無hook,那麼我們自然先簡單的聊一下hook的方法是實現元件化。傳統的方式,是通過hook了instrumetation或者classLoader,本來把本來啟動HostActivity的任務,轉換成了啟動TargetActivity的任務,從而實現了外掛當中TargetActivity的啟動。


具體外掛化的文章可以參看我的外掛化系列課程:


https://blog.csdn.net/rzleilei/category_11590922.html?spm=1001.2014.3001.5482


hook有什麼缺點嗎?那自然是有的,否則Shadow也不會著重宣傳其無hook的特性。hook最大的問題,就是風險性。隨著安卓版本的更新, 之前hook的點很有可能會隨著版本的變化而改變。比如下面通過反射Hook了Instrumetation。這樣的程式碼在安卓12以下都是OK的,但是如果安卓14把mInstrumentation設定為了私有變數,那我們的整個外掛化方案都會失效。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010128/viewspace-2871650/,如需轉載,請註明出處,否則將追究法律責任。

相關文章