Hook 又叫“鉤子”,它可以在事件傳送的過程中截獲并監(jiān)控事件的傳輸,將自身的代碼與系統(tǒng)方法進(jìn)行融入
一般都是用于攔截修改系統(tǒng)方法,今天介紹的是一個(gè)開源 HOOK 框架 SandHook的使用,下邊是github的地址:
https://github.com/asLody/SandHook
添加依賴
implementation 'com.swift.sandhook:hooklib:4.2.0'
// need for android 11
implementation 'com.swift.sandhook:nativehook:4.2.0'
創(chuàng)建Hooker類
下邊是一個(gè) hook Activity 生命周期方法的實(shí)例,需要創(chuàng)建類,寫出要 hook 的方法名,通過@HookClass 和 @HookMethod 注解來聲明自已要Hook的類和方法;@HookMethodBackup注解來獲取攔截方法的原有實(shí)現(xiàn),通過 callOrigin 或者 SandHook.callOriginByBackup 來調(diào)用原有方法;@MethodParams 聲明方法的參數(shù)類型
@HookClass(Activity.class)
public class Hooker {
@HookMethodBackup("onCreate")
@MethodParams(Bundle.class)
static Method onCreateBackup;
@HookMethodBackup("onPause")
static HookWrapper.HookEntity onPauseBackup;
@HookMethod("onCreate")
@MethodParams(Bundle.class)
public static void onCreate(Activity thiz, Bundle bundle) throws Throwable {
Log.e("ActivityHooker", "hooked onCreate success " + thiz);
SandHook.callOriginByBackup(onCreateBackup, thiz, bundle);
}
@HookMethod("onPause")
public static void onPause(@ThisObject Activity thiz) throws Throwable {
Log.e("ActivityHooker", "hooked onPause success " + thiz);
onPauseBackup.callOrigin(thiz);
}
}
初始化Hooker類
下邊代碼最好放到 Application 的 onCreate 方法中,同時(shí)不要忘記將自定義的 Application 放到manifest application標(biāo)簽下的 android:name 中
try {
SandHook.addHookClass(
Hooker.class);
} catch (HookErrorException e) {
e.printStackTrace();
}
自已定義想要 hook 的方法,有時(shí)候會初始失敗,可以看看這里拋出的異常,一般會有詳細(xì)信息,未找到 hook 的類,或者未找到 hook 的方法。
結(jié)論
這樣在每個(gè)Activity的 onCreate 和 onPause 的時(shí)候,都可以看到日志的打印,然后通過 callOrigin 方法回調(diào)系統(tǒng)的實(shí)現(xiàn)。
這樣就可以攔截自己需要的系統(tǒng)方法,并且還可以自己控制需不需要系統(tǒng)的原有實(shí)現(xiàn)。當(dāng)然也可以攔截自己代碼中的類中的方法,不一定必須是要系統(tǒng)方法。