Android13 PMS服务的获取方法
基于Android T(13)代码
PackageManagerService 不再 extends IPackageManager.Stub ——> 改为由抽象类 IPackageManagerBase extends IPackageManager.Stub
不再以pkms为基础类addService "package"服务 ——> 改为以PackageManagerService 的内部类IPackageManagerImpl 为基础类addService"package"服务
而此内部类IPackageManagerImpl实现了抽象类IPackageManagerBase,则app可以通过AIDL将获得的binder转为接口实例来使用调用系统接口。
具体使用:
apk内获取
(可能需要是system_app或者在frameworks/base/core/java/android/content/pm/ApplicationInfo.java中的isAllowedToUseHiddenApis函数中添加调用系统隐藏接口的app_whitelist)
还需要建立一个aidl类,把需要的接口声明写进去(详见我另一篇 访问系统隐藏类 的随笔)
try {
Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null, "package");
if (binder != null) {
IPackageManager mIPm = IPackageManager.Stub.asInterface(binder);
res = mIPm.deletePreloadsFileCache();
}
} catch (RemoteException | ClassNotFoundException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
Framework内获取
IBinder binder = (IBinder)ServiceManager.getService("package");
IPackageManager mIPm = IPackageManager.Stub.asInterface(binder);
【至于为什么是“package”,这是它的名字,在启动pms服务的时候就会为其起名字,可以进PMS.java中看源码】
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16969681.html