前言:新插件的開發,可以說是為插件開發者帶來了福音,雖然還很多坑要填補,對于這款牛逼的插件機制,一直想找個時間分析和總結下它的code,話不多說,直接入正題,本文是分析../hook/handle及../hook/proxy下代碼,../hook/binder單獨分析
Hook機制的包結構關系
Hook機制的類圖關系
Hook機制的時序圖關系
Manifest權制申請
基類Hook做了什么?
HookedMethodHandler
基類BaseHookHandle和Hook有什么關系?
ProxyHook能干什么?
實例-如何hook IPackageManager
首先定義了一個基類Hook,抽象類,外部可以通過setEnable()方法來使能否hook。聲明了onInstall和onUnInstall及相關的方法,子類可以覆蓋這些方法完成相應的車間機床,這里相當于提供一個車間,機床上的具體操作什么由子類去自己實現。
插件管理服務類聲明:
權限申請:
ProxyHook繼承自Hook,實現了InvocationHandler接口。它有一個setOldObj()方法,用來保存原始對象。新的代理對象可以看到在代碼中是如何實現的(動態代理)
接上面ProxyHook中的invoke()方法,mHookHandles是一個BaseHookHandle對象,內部包含了一個Map,可以根據API名映射到對應對應的HookedMethodHandler對象。這個Map由其子類IXXXHookHandle在初始化的時候進行填充。
緊接著調用HookedMethodHandler的doHookInner()方法:
ReplaceCallingPackageHookedMethodHandler
IPackageManagerHook:Hook所有IPackageManager的方法
IActivityManagerHookHandle:安裝所有被Hook的方法的處理對象,加入到Map中
IPackageManagerHandle.checkSignatures:這是一個內部類,繼承HookedMethodHandler, 專門校驗簽名的。以此,還有各種各樣的PackageManger原生中的方法,在這都變成了一個內部類繼承了HookedMethodHandler.上圖:
IPackageManagerHookHandle:
第一時間獲得博客更新提醒,以及更多android干貨,源碼分析,歡迎關注我的微信公眾號,掃一掃下方二維碼,即可關注。