Skip to content

Latest commit

 

History

History
80 lines (45 loc) · 2.64 KB

4.Android framework 调用服务.md

File metadata and controls

80 lines (45 loc) · 2.64 KB
Error in user YAML: (<unknown>): could not find expected ':' while scanning a simple key at line 13 column 1
---

title: Android framework 调用服务

date: 2021-03-08

categories: 
   - Java

tags: 
   - Java


description: 

---

startActivity 为例:

client 进程

ActivityManagerProxy.startActivity //ActivityManagerNative.java class ActivityManagerProxy implements IActivityManager public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); .. //这里的mRemote指向BinderProxy mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); ... reply.readException(); int result = reply.readInt(); reply.recycle(); data.recycle(); return result; } }

mRemote 是 BinderProxy。BinderProxy.transact()

进而调用:BpBinder(handle)的transact()

通过BpBinder中的IPCThreadState与Binder驱动进行交互。把请求数据包装好后发给驱动

一开始,Zygote进程启动,system_server进程启动。system_server进程把ActivityManagerService服务 注册到 ServiceManager之后,创建一个新的binder线程,不断进行talkWithDriver(),从驱动读,没有就阻塞(等待客户端请求)

此时,驱动中有数据来了,是有客户端想要调用startactivity方法了。system_server进程被唤醒

从驱动中读取数据,返回给用户进程(Native层)

用户进程拿到 binder_transaction_data 数据,进而拿到binder_transaction_data中的cookie,也就是BBinder

最终会调用到BBinder的transact()处理请求进而调用虚函数onTransact()。JavaBBinder(C++)重写了onTransact(),所以调用JavaBBinder 的onTransact

通过JNI调用Binder(Java)中的execTransact方法,进而调用子类重写之后的onTransact方法

按照通常逻辑一般是交由服务端的Stub类中进行处理onTransact方法的,但是AMS服务并没有接着aidl语言生成Stub接口(这里说明一个道理,我们可以不通过aidl也可以实现Java Binder),而是直接手动硬编写出了Stub类型的子类AMN

最终进入 ActivityManagerNative 的onTransact。

ActivityManagerNative中的 onTransact根据code值执行相应的方法,这里即调用startActivity方法,最终则调用PAMS类(继承自AMN)中相应的startActivity()接口方法,执行该接口方法的功能。