Xposed 无法挂钩 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","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 是一个抽象类,方法 getInstalledApplications(int) 也是抽象的。由于 Xposed 无法挂钩 abstract Methods and Interfaces,因此您必须指定实际实现方法 getInstalledApplications(int) 的类。

如您所见,PackageManager 的实际实现位于类 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()");
        }
    });