本文目录
一、kernel层
1.binder_init
- 分配内存
- 初始化设备
- 放入链表
2.binder_open
- 创建
binder_proc
结构体并分配内存 - 将当前进程的信息放到
binder_proc
中 - 将
binder_proc
放进procs
链表中 - 将当前
binder_proc
放入file
的private_data
指针中
3.binder_mmap
- 定义了传输的内容不可超过4M
- 根据用户空间的虚拟内存大小,分配一块大小相同的内核空间
- 分配一块物理空间(大小为4K),并将这块空间映射到用户空间和内核空间
- 将
buffer
插入空闲列表中
4.binder_ioctl
- 一进来先有一个中断
- 会
switch(cmd)
,一般是binder_write_read
5.binder_write_read
- 先有一个
copy_from_user
,这里不是copy的有效命令,是先copy的头部信息 - 然后会根据write和read的size,判断是读还是写
二、ServiceManager的启动过程
启动过程要从Zygote
的启动过程开始说起,当从init进程中fork出一个子进程,并且 调用Runtime.start()
方法后,在AppRuntime
的start
方法中会启动、注册jni方法,并启动ZygoteInit
的main
方法。
而在注册jni
方法中,会将binder
相关的东西注册进去。
在init进程解析init.rc文件时,会启动ServiceManager
,对应service_manager.c
中的main
方法。
ServiceManager的main
方法
- 打开
binder
驱动,并完成映射 binder_become_context_manager
,注册成为上下文管理者binder_loop
,循环等待客户端的请求
1.open_binder
打开一个大小为128K的binder
2.binder_become_context_manager
- 创建一个新的node
- 设置成为上下文管理者
3.binder_loop
- 写入
bc_enter_loop
指令 - 循环处理
三、ServiceManager的获取
获取SM的两种情况:(1)将服务注册到SM中 (2)获取服务
1. IServiceManager.cpp中的defaultServiceManager()
方法
代码如下所示:
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
while (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
if (gDefaultServiceManager == NULL)
sleep(1);
}
}
return gDefaultServiceManager;
}
- 保证了单例
ProcessState
是进程唯一的,表示进程的状态。ProcessState::self()
:
在ProcessState的Self中,会调用自身的构造函数,在构造函数中,会做几件事情:- 打开binder设备,设置服务的最大线程数目为15个
- 用mmap做内存映射(大小为1M-8K)
ProcessState->getContextObject
:sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/) { return getStrongProxyForHandle(0); }
四、服务的注册:以AMS为例
1.SystemServer中
- 在SystemServer的run()方法中,会先创建SystemrServiceManager,然后会启动三类服务.
- 在
startBootStrapServices()
方法中,关键代码有
这里做两件事:... //这一句会启动ActivityManagerService mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); ... //这里会调用ServiceManager.addService()方法 mActivityManagerService.setSystemProcess(); ...
- 启动并返回AMS
- 调用AMS的
setSystemProcess
方法
然后在setSystemProcess中,会调用SM的addService方法,方法如下:
- SeriviceManager.addService():
public static void addService(String name, IBinder service, boolean allowIsolated) { try { //这是关键代码 getIServiceManager().addService(name, service, allowIsolated); } catch (RemoteException e) { Log.e(TAG, "error in addService", e); } }
- 分开看:getIServiceManager()
-
private static IServiceManager getIServiceManager() { if (sServiceManager != null) { return sServiceManager; } // Find the service manager //BinderInternal.getContextObject会创建一个BpBinder,并将BpBinder与BinderProxy绑定在一起,返回的是BinderProxy // ServiceManagerNative.asInterface()返回的是ServiceManagerProxy sServiceManager = ServiceManagerNative .asInterface(Binder.allowBlocking(BinderInternal.getContextObject())); return sServiceManager; }
- 然后看:addService()
-
- 分开看:getIServiceManager()