---
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()接口方法,执行该接口方法的功能。