Android系统服务源码位置解析

最近在做Android系统服务的测试,发现了一些系统服务的问题,于是想去找一下系统服务相关的源码,可是Android源码系统太复杂了,那么多代码不知道从何找起,幸好得到了大白师兄的点拨,茅塞顿开。赶紧记下来以备不时之需。

首先是知道服务名字以及服务接口号码。就拿connectivity服务的第57号服务接口来说。

服务名当然是connectivity啦,至于服务接口嘛,使用java反射机制获取到stub类就能够得到接口代码和相关的code啦。我这里是57号服务接口,对应的code就是TRANSACTION_releasePendingNetworkRequest。

既然这些都有了,从哪里找起呢?我觉得这个问题首先要看一下binder服务的相关知识。如果不知道的建议看下老罗的blog。我这里就不赘述了。首先是找到相关的aidl文件,这个文件定义了所有的系统服务的接口方法,然后系统会根据这个文件生成相对应的java文件,这个文件是封装好的。比如我的connectivity服务,对应在系统中的aidl文件就是IConnectivityManager.aidl,然后在编译过程中,会产生中间文件IConnectivityManager.java。这个类里面有一个onTransact的函数,在函数里面搜索相关的code也就是TRANSACTION_releasePendingNetworkRequest就能得到服务端的处理函数啦。我这里面是这样的

case TRANSACTION_releasePendingNetworkRequest:
{
   data.enforceInterface(DESCRIPTOR);
   android.app.PendingIntent _arg0;
   if ((0!=data.readInt())) {
     _arg0 = android.app.PendingIntent.CREATOR.createFromParcel(data);
   }
   else {
     _arg0 = null;
   }
   this.releasePendingNetworkRequest(_arg0);
   reply.writeNoException();
   return true;
}
大家注意到没有,其实他调用了另外一个函数this.releasePendingNetworkRequest(_arg0),那这个函数在哪里呢?千万不要在IConnectivityManager.java中搜索哦,你要去找到ConnectivityService.java,这个文件是在源码中写的,这里面的releasePendingNetworkRequest才是调用服务时的函数。

可是我为什么说不要在IConnectivityManager.java中搜索呢?因为这个java文件里面也有一个同名的函数,是这样的

@Override public void releasePendingNetworkRequest(android.app.PendingIntent operation) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
if ((operation!=null)) {
_data.writeInt(1);
operation.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
mRemote.transact(Stub.TRANSACTION_releasePendingNetworkRequest, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
缩进什么的不要在意。注意有一个mRemote.transact()...这个函数是提供给客户端使用的,并不是服务端的。我最开始在这边饶了好久。大家注意。

好啦,就这么多,再次感谢大白师兄的指点~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值