我们需要获取的是Serial这个系统服务,这是一个系统服务,是不对外开放的。此服务的源码路径在Frameworks/base/services/java/com/android/server/SerialService.java,继承了ISerialManager。此服务的名称是serial
ServiceManager是系统内部对所有服务的管理类这个类并不是开放的,我们需要通过获取ServiceManager这个隐藏类来获取这个隐藏服务。
先来获取隐藏类ServiceManager和这个类的操作函数getService,再执行这个函数:
Class clazz = PlaceholderFragment.class.getClassLoader().loadClass("android.os.ServiceManager");Method method = clazz.getDeclaredMethod("getService", String.class);IBinder iBinder = (IBinder) method.invoke(null, "serial");
这样就返回了一个IBinder。我们可以用隐藏服务的aidl再结合IBinder来获取到这个服务:
先找到这个服务的aidl:frameworks\base\core\java\android\hardware\ISerialManager.aidl
在App创建一个与aidl相同的包名:android.hardware
把ISerialManager.aidl放入App新建的包里,这时我们就可以在App里引用ISerialManager这个类
private ISerialManager mSerialManager;mSerialManager = ISerialManager.Stub.asInterface(iBinder);
已经成功找到了SerialService。可能通过mSerialManager调用相应的函数了。
我们先了解怎么用,有时间再探究一下其中的原理
本文详细介绍了如何在Android应用中获取系统服务SerialService的过程,包括隐藏类ServiceManager的获取、IServiceManager的调用及使用。通过类加载器获取ServiceManager类,调用getService方法并传入服务名称,最终解析IBinder来实现服务的引用。
1241

被折叠的 条评论
为什么被折叠?



