Xposed 无法挂钩 getInstalledApplications
Xposed can't hook getInstalledApplications
我想挂钩 getInstalledApplications 和 getInstalledPackages 以监控应用程序是否使用此方法获取我的应用程序列表。
我的代码:
XposedHelpers.findAndHookMethod(
android.content.pm.PackageManager.class.getName(),
lpparam.classLoader,
"getInstalledApplications",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledApplications()");
Log.d("HookLogin", "getInstalledApplications()");
}
});
我收到了这个错误:Xposed: java.lang.NoSuchMethodError: android.content.pm.PackageManager#getInstalledApplications()#exact
然后我用谷歌搜索,发现我应该使用 android.app.ApplicationPackageManager
,然后我更改了我的代码:
XposedHelpers.findAndHookMethod(
"android.app.ApplicationPackageManager",
lpparam.classLoader,
"getInstalledPackages",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledPackages()");
Log.d("HookLogin", "getInstalledPackages()");
}
});
但我仍然得到 NoSuchMethodError,这次是:
Xposed: java.lang.NoSuchMethodError: android.app.ApplicationPackageManager#getInstalledApplications()#exact
我现在很困惑,我应该如何hook方法getInstalledPackages
。
两个代码版本都有一个主要问题:
您的挂钩无法工作,因为您正在尝试挂钩一个不存在的方法:您正在尝试挂钩方法 getInstalledApplications()
但该方法不存在,只有方法 [getInstalledApplications(int)][1]
确实存在,可以挂钩。
您已经注意到 android.content.pm.PackageManager
是抽象的 class 并且方法 getInstalledApplications(int)
也是抽象的。由于 Xposed 无法挂钩 abstract Methods and Interfaces,因此您必须指定实际实现方法 getInstalledApplications(int)
.
的 class
正如您已经发现的那样,PackageManager 的实际实现位于 class android.app.ApplicationPackageManager 中。
因此正确的挂钩代码是:
XposedHelpers.findAndHookMethod(
"android.app.ApplicationPackageManager",
lpparam.classLoader,
"getInstalledPackages",
int.class, // this line has been added as the getInstalledPackages method has one int parameter
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledPackages()");
Log.d("HookLogin", "getInstalledPackages()");
}
});
我想挂钩 getInstalledApplications 和 getInstalledPackages 以监控应用程序是否使用此方法获取我的应用程序列表。
我的代码:
XposedHelpers.findAndHookMethod(
android.content.pm.PackageManager.class.getName(),
lpparam.classLoader,
"getInstalledApplications",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledApplications()");
Log.d("HookLogin", "getInstalledApplications()");
}
});
我收到了这个错误:Xposed: java.lang.NoSuchMethodError: android.content.pm.PackageManager#getInstalledApplications()#exact
然后我用谷歌搜索,发现我应该使用 android.app.ApplicationPackageManager
,然后我更改了我的代码:
XposedHelpers.findAndHookMethod(
"android.app.ApplicationPackageManager",
lpparam.classLoader,
"getInstalledPackages",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledPackages()");
Log.d("HookLogin", "getInstalledPackages()");
}
});
但我仍然得到 NoSuchMethodError,这次是:
Xposed: java.lang.NoSuchMethodError: android.app.ApplicationPackageManager#getInstalledApplications()#exact
我现在很困惑,我应该如何hook方法getInstalledPackages
。
两个代码版本都有一个主要问题:
您的挂钩无法工作,因为您正在尝试挂钩一个不存在的方法:您正在尝试挂钩方法 getInstalledApplications()
但该方法不存在,只有方法 [getInstalledApplications(int)][1]
确实存在,可以挂钩。
您已经注意到 android.content.pm.PackageManager
是抽象的 class 并且方法 getInstalledApplications(int)
也是抽象的。由于 Xposed 无法挂钩 abstract Methods and Interfaces,因此您必须指定实际实现方法 getInstalledApplications(int)
.
正如您已经发现的那样,PackageManager 的实际实现位于 class android.app.ApplicationPackageManager 中。
因此正确的挂钩代码是:
XposedHelpers.findAndHookMethod(
"android.app.ApplicationPackageManager",
lpparam.classLoader,
"getInstalledPackages",
int.class, // this line has been added as the getInstalledPackages method has one int parameter
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("getInstalledPackages()");
Log.d("HookLogin", "getInstalledPackages()");
}
});