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 @   小汀  阅读(289)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示