Android用loadClass获取系统隐藏类和隐藏服务的方法

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

猜你喜欢

转载自blog.csdn.net/shell812/article/details/49780949