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中看源码】
 
posted @ 2022-12-09 18:07  小汀  阅读(262)  评论(0编辑  收藏  举报