前言:新插件的開發(fā)驶赏,可以說是為插件開發(fā)者帶來了福音,雖然還很多坑要填補(bǔ)既鞠,對于這款牛逼的插件機(jī)制煤傍,一直想找個(gè)時(shí)間分析和總結(jié)下它的code,話不多說嘱蛋,直接入正題蚯姆,本文是分析../hook/handle及../hook/proxy下代碼五续,../hook/binder單獨(dú)分析
Hook機(jī)制的包結(jié)構(gòu)關(guān)系
Hook機(jī)制的類圖關(guān)系
Hook機(jī)制的時(shí)序圖關(guān)系
Manifest權(quán)制申請
基類Hook做了什么?
HookedMethodHandler
基類BaseHookHandle和Hook有什么關(guān)系龄恋?
ProxyHook能干什么疙驾?
實(shí)例-如何hook IPackageManager
Hook機(jī)制的包結(jié)構(gòu)關(guān)系
首先定義了一個(gè)基類Hook,抽象類郭毕,外部可以通過setEnable()方法來使能否hook它碎。聲明了onInstall和onUnInstall及相關(guān)的方法,子類可以覆蓋這些方法完成相應(yīng)的車間機(jī)床,這里相當(dāng)于提供一個(gè)車間显押,機(jī)床上的具體操作什么由子類去自己實(shí)現(xiàn)扳肛。
插件管理服務(wù)類聲明:
權(quán)限申請:
ProxyHook繼承自Hook乘碑,實(shí)現(xiàn)了InvocationHandler接口挖息。它有一個(gè)setOldObj()方法,用來保存原始對象兽肤。新的代理對象可以看到在代碼中是如何實(shí)現(xiàn)的(動態(tài)代理)
接上面ProxyHook中的invoke()方法套腹,mHookHandles是一個(gè)BaseHookHandle對象,內(nèi)部包含了一個(gè)Map资铡,可以根據(jù)API名映射到對應(yīng)對應(yīng)的HookedMethodHandler對象电禀。這個(gè)Map由其子類IXXXHookHandle在初始化的時(shí)候進(jìn)行填充。
緊接著調(diào)用HookedMethodHandler的doHookInner()方法:
ReplaceCallingPackageHookedMethodHandler
IPackageManagerHook:Hook所有IPackageManager的方法
IActivityManagerHookHandle:安裝所有被Hook的方法的處理對象害驹,加入到Map中
IPackageManagerHandle.checkSignatures:這是一個(gè)內(nèi)部類鞭呕,繼承HookedMethodHandler, 專門校驗(yàn)簽名的。以此宛官,還有各種各樣的PackageManger原生中的方法葫松,在這都變成了一個(gè)內(nèi)部類繼承了HookedMethodHandler.上圖:
IPackageManagerHookHandle:
第一時(shí)間獲得博客更新提醒,以及更多android干貨底洗,源碼分析腋么,歡迎關(guān)注我的微信公眾號,掃一掃下方二維碼亥揖,即可關(guān)注珊擂。