我们需要获取的是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调用相应的函数了。
我们先了解怎么用,有时间再探究一下其中的原理