Android 6.0.1下Xposed Hook PackageManagerService报类找不到问题咨询
错误原因
- PackageManagerService属于system_server系统进程的类,你当前代码未过滤进程,拿到的是普通应用的类加载器,自然无法加载系统服务的类,触发类找不到异常。
- 普通应用进程的ClassLoader不存在系统服务相关类,只有system_server进程的ClassLoader才能加载到目标类。
修复后的代码
import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; public class HookAPM_6 implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { // 仅处理system_server进程,其包名固定为android if (!"android".equals(lpparam.packageName)) { return; } Class<?> packageManagerService = XposedHelpers.findClass("com.android.server.pm.PackageManagerService", lpparam.classLoader); // 注意内部类引用使用$而非. XposedHelpers.findAndHookMethod(packageManagerService, "installPackageLI", "com.android.server.pm.PackageManagerService$InstallArgs", "com.android.server.pm.PackageManagerService$PackageInstalledInfo", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); // 此处添加自定义hook逻辑 } }); } }
注意事项
- 必须在Xposed框架的模块作用域设置中勾选「系统框架(android)」,否则不会触发system_server进程的hook回调。
- Java语法中内部类的全类名使用
$分隔外部类和内部类,原代码中参数类名使用.分隔会导致后续方法找不到报错。 - 部分定制ROM可能修改AOSP原生的
installPackageLI方法签名,如果还是提示方法找不到,可以先dump目标系统的PMS类所有方法确认参数列表。
内容的提问来源于stack exchange,提问作者王胖虎
相关产品推荐
相关产品推荐

