文章目录
-
- 什么是binder
- 1. 什么是Binder?
- 2. Binder架构组成
- 3. 工作原理与通信流程
- 4. 关键技术点
- 5. 常见面试考点
- 6. 面试表达建议(简明版)
- 7. 简易流程图
- 什么是 AMS(Activity Manager Service)
- app的启动,点击launcher icon 开始
- 1. 总览:从点击应用Icon到Activity显示的主流程
- 2. 详细分步流程
- 3. 关键技术细节与源码链路
- 4. 源码调用链(简化)
- 5. 流程时序图
- 6. 面试答题建议(精炼版)
- ActivityA调用`startActivity(Intent)`启动ActivityB
- 详细流程分解
- 3. 源码关键链路(简化)
- 4. 时序图
- 6. 面试答题建议
什么是binder
1. 什么是Binder?
Binder 是 Android 系统中实现进程间通信(IPC, Inter-Process Communication)的核心机制。它是 Android 独有的、基于C/S架构的高效IPC框架,底层由内核驱动支持,广泛用于系统服务(如AMS、WMS、Service等)和应用间通信。
2. Binder架构组成
- Binder驱动(内核空间)
位于/dev/binder
,负责消息的传递和对象引用管理。 - ServiceManager(守护进程)
管理所有Binder服务的注册与查询。 - Server端(服务提供者)
继承自Binder
,实现具体业务逻辑。 - Client端(服务调用者)
通过Proxy
代理对象与服务端通信。 - Binder库(用户空间)
提供Java和C++的Binder通信API。
3. 工作原理与通信流程
1)服务注册
- 服务端(如SystemServer中的AMS)继承Binder,实现业务接口,并通过ServiceManager注册服务。
2)服务查询
- 客户端通过ServiceManager查询目标服务,获得一个Binder代理对象(Proxy)。
3)通信过程
- 客户端通过Proxy发起远程方法调用,数据通过Parcel序列化,传递给Binder驱动。
- Binder驱动负责跨进程传递数据,唤醒服务端线程池,服务端解包数据并执行方法。
- 返回值同样通过Binder驱动回传给客户端。
4)核心数据结构
- IBinder:Java层的Binder接口,所有Binder对象的基类。
- Parcel:高效的序列化/反序列化容器。
- Binder线程池:服务端用于处理Binder请求的线程池。
4. 关键技术点
- 零拷贝/高效传输:Binder驱动采用内核空间的内存映射,减少用户空间与内核空间的数据拷贝,提高效率。
- 引用计数/安全性:Binder机制自动管理对象引用,防止内存泄漏和非法访问。
- 权限校验:支持UID/PID校验,保证通信安全。
- 支持一对多/多对多通信:如AIDL、Messenger、ContentProvider等都基于Binder。
Binder通信的安全与性能机制
安全机制
Binder驱动自动传递调用方的UID/PID,服务端可做身份校验。
支持权限声明(如AIDL接口可声明enforcePermission),防止未授权访问。
配合SELinux、App沙箱机制,进一步提升安全性。
性能机制
Binder采用内核空间的内存映射(mmap),实现零拷贝或最小拷贝,效率高于Socket等传统IPC。
支持对象引用传递(Binder引用计数),避免重复序列化。
线程池机制避免主线程阻塞,提升并发处理能力。
5. 常见面试考点
1)Binder与传统IPC(Socket、管道、共享内存等)对比
- 性能高、支持对象引用、支持跨语言、内核级安全、易用性强。
2)AIDL与Binder关系
- AIDL自动生成Stub和Proxy,底层通信依赖Binder机制。
3)Binder线程池与ANR
- 服务端通过线程池处理请求,若线程池耗尽或主线程阻塞,可能导致ANR。
4)Binder通信的生命周期与内存管理
- Binder驱动自动管理引用计数,防止内存泄漏。
5)Binder的安全机制
- 支持权限校验、SELinux策略、UID/PID传递。
6. 面试表达建议(简明版)
Binder是Android系统实现高效进程间通信的核心机制,底层由内核驱动支持,采用C/S架构。它通过ServiceManager实现服务注册与查询,客户端通过Proxy对象与服务端通信,数据通过Parcel序列化后由Binder驱动在内核空间高效传递。Binder机制具备高性能、强安全性、自动内存管理等优点,是Android系统服务、AIDL、Messenger等IPC的基础。
7. 简易流程图
什么是 AMS(Activity Manager Service)
• 基本信息:AMS是Framework层的系统服务,运行在system_server进程中,是一个Java层的单例类。系统启动时由SystemServer.java初始化,通过Binder IPC机制与应用程序通信。
• 核心功能
◦ 生命周期管理:负责Activity、Service、BroadcastReceiver等组件的启动、暂停、停止、销毁等生命周期操作。
◦ 进程管理:根据应用优先级管理进程的创建、销毁和优先级调整,通过ProcessRecord记录进程信息,必要时回收低优先级进程以释放资源。
◦ 任务栈管理:通过ActivityStack和TaskRecord管理Activity的任务栈,支持多任务、多窗口模式,决定Activity在任务栈中的创建和存放方式。
◦ 权限管理:检查应用权限,确保应用在访问敏感资源时具备相应权限。
◦ ANR监控:监控主线程的响应时间,若主线程阻塞超过默认5秒,会触发ANR弹窗。
• 相关关键类与数据结构
◦ ActivityManagerService:AMS的核心类,管理所有与Activity相关操作。
◦ ActivityStack:管理Activity的任务栈。
◦ TaskRecord:表示一个任务,包含多个Activity。
◦ ProcessRecord:记录进程信息。
◦ ActivityRecord:表示一个Activity实例。
• Activity启动模式:AMS会根据Activity的启动模式决定其在任务栈中的创建和管理方式。启动模式包括standard(标准模式)、singleTop(栈顶复用模式)、singleTask(栈内复用模式)和singleInstance(单实例模式),开发者可在AndroidManifest.xml中设置或通过Intent标志动态改变。
• Intent解析与分发:当应用发送Intent时,AMS会根据其动作、数据等信息查找符合条件的组件,遍历AndroidManifest.xml文件进行匹配,找到后将Intent分发给相应组件。
app的启动,点击launcher icon 开始
1. 总览:从点击应用Icon到Activity显示的主流程
- Launcher进程接收点击事件
- Launcher通过Binder向SystemServer请求启动Activity
- SystemServer(AMS)处理启动请求
- 进程存在性检查,必要时Zygote孵化新进程
- Application进程启动,ActivityThread启动主线程
- ActivityThread通过Handler分发消息,反射创建Activity
- Activity生命周期回调,界面最终显示
2. 详细分步流程
1)Launcher进程接收点击事件
- 用户点击桌面应用icon,Launcher的
onClick()
被触发。 - Launcher构造一个
Intent
(包含包名、Activity信息),调用startActivity()
。
2)Launcher通过Binder向SystemServer请求启动Activity
startActivity()
最终调用到Instrumentation.execStartActivity()
。- 通过AIDL接口,Binder跨进程调用
ActivityManagerService.startActivity()
(AMS,系统服务,运行在SystemServer进程)。
3)AMS处理启动请求
- AMS进行权限校验、Intent解析、任务栈管理等。
- 判断目标应用进程是否存在:
- 已存在:直接调度启动Activity。
- 不存在:需要先启动应用进程。
4)进程管理与Zygote孵化
- 若目标进程不存在,AMS调用
startProcessLocked()
,通过Process.start()
请求Zygote孵化新进程。 - Zygote进程通过socket接收fork请求,fork出新的App进程,并在新进程中执行
ActivityThread.main()
。
5)Application进程启动
- 新进程启动后,执行
ActivityThread.main()
,进入主线程(UI线程)消息循环。 - 通过Binder回调
attachApplication()
,AMS与新进程建立通信。
6)ActivityThread请求启动Activity
- AMS通过Binder回调
scheduleLaunchActivity()
,通知App进程启动目标Activity。 ActivityThread
收到消息后,通过Handler
切换到主线程,调用performLaunchActivity()
。- 反射创建Activity实例,依次调用
attach()
、onCreate()
等生命周期方法。
7)Activity界面显示
- Activity创建完成后,
setContentView()
加载布局,ViewRootImpl与WindowManager建立联系。 - WindowManager通过SurfaceFlinger合成界面,最终Activity界面显示在屏幕上。
3. 关键技术细节与源码链路
1)Binder跨进程通信
- Launcher与AMS、AMS与App进程之间均通过Binder通信,保证了进程间的高效与安全。
2)进程孵化与Zygote
- Zygote采用fork机制,极大提升了新进程启动速度(共享内存、Copy-On-Write)。
3)主线程消息机制
- ActivityThread基于Looper/Handler机制,保证所有UI操作在主线程串行执行,避免线程安全问题。
4)Activity生命周期管理
- AMS全局管理Activity栈,负责生命周期调度、任务切换、回收等。
5)Window与View体系
- Activity通过WindowManager与系统窗口管理服务交互,ViewRootImpl负责View的绘制、输入分发等。
4. 源码调用链(简化)
- Launcher进程
onClick()
→startActivity()
→Instrumentation.execStartActivity()
→AMS.startActivity()
- AMS(SystemServer)
startActivity()
→startProcessLocked()
(如需新进程)→Process.start()
→ Zygote fork
- App进程
ActivityThread.main()
→attach()
→AMS.attachApplication()
→scheduleLaunchActivity()
→ActivityThread.H.handleMessage()
→performLaunchActivity()
→Activity.attach()
→Activity.onCreate()
5. 流程时序图
6. 面试答题建议(精炼版)
Android应用从点击icon到Activity显示,涉及Launcher、AMS、Zygote、App进程、ActivityThread等多个系统组件。Launcher通过Binder向AMS发起启动请求,AMS负责进程管理和任务栈调度,必要时通过Zygote fork新进程。新进程启动后,ActivityThread通过Handler机制反射创建Activity并回调生命周期,最终通过WindowManager和SurfaceFlinger将界面显示到屏幕。整个过程高度依赖Binder通信、进程管理、消息机制和窗口系统,是Android系统架构的核心体现。
ActivityA调用startActivity(Intent)
启动ActivityB
当ActivityA调用startActivity(Intent)
启动ActivityB时,涉及应用进程、系统服务(AMS)、Binder通信、任务栈管理、ActivityThread调度、生命周期回调等多个环节。
详细流程分解
1)ActivityA进程(应用层)
调用链
ActivityA.startActivity(Intent)
→Activity.startActivityForResult()
→Instrumentation.execStartActivity()
→ 通过AIDL接口,Binder跨进程调用AMS(ActivityManagerService)的startActivity()
。
技术点
- Instrumentation用于监控和插桩,便于测试和生命周期管理。
- Binder机制实现进程间通信,传递Intent、包名、调用者信息等。
2)AMS(ActivityManagerService,SystemServer进程)
权限与Intent校验
- 校验调用者权限、Intent合法性、目标Activity是否可达。
- 解析Intent,查找匹配的Activity(PackageManagerService参与)。
任务栈与ActivityRecord管理
- 根据Intent flag、launchMode等,决定ActivityB是新建Task、复用Task还是在当前Task中入栈。
- 创建
ActivityRecord
对象,记录ActivityB的所有元信息。 - 维护
ActivityStackSupervisor
和ActivityStack
,管理所有任务栈和Activity状态。
进程调度
- 判断ActivityB所属进程是否存在:
- 已存在:直接调度。
- 不存在:调用
startProcessLocked()
,通过Zygote fork新进程。
- 判断ActivityB所属进程是否存在:
调度启动
- 通过Binder回调目标进程的
ApplicationThread.scheduleLaunchActivity()
,通知其启动ActivityB。
- 通过Binder回调目标进程的
3)目标应用进程(ActivityB所属进程)
ActivityThread消息分发
ApplicationThread
(Binder服务端)收到scheduleLaunchActivity()
,通过Handler切换到主线程。- 调用
ActivityThread.handleLaunchActivity()
,最终执行performLaunchActivity()
。
Activity创建与生命周期
- 反射创建ActivityB实例,依次调用
attach()
、onCreate()
、onStart()
、onResume()
等生命周期方法。 - Instrumentation参与生命周期回调,便于测试和监控。
- 反射创建ActivityB实例,依次调用
界面显示
setContentView()
加载布局,ViewRootImpl与WindowManager建立联系,最终通过SurfaceFlinger合成界面。
4)ActivityA与ActivityB的生命周期切换
- AMS会根据启动模式和栈顶情况,决定ActivityA是否进入
onPause()
、onStop()
等状态。 - ActivityB启动后成为前台,ActivityA可能被暂停或停止。
3. 源码关键链路(简化)
- 应用进程
Activity.startActivity()
Instrumentation.execStartActivity()
ActivityManagerService.startActivity()
- AMS
startActivity()
startProcessLocked()
(如需新进程)ApplicationThread.scheduleLaunchActivity()
- 目标进程
ActivityThread.handleLaunchActivity()
Instrumentation.callActivityOnCreate()
Activity.onCreate()
4. 时序图
6. 面试答题建议
ActivityA启动ActivityB时,应用进程通过Binder调用AMS,AMS负责权限校验、Intent解析、任务栈管理和进程调度。AMS通过Binder回调目标进程的ApplicationThread,ActivityThread在主线程反射创建ActivityB并回调生命周期。整个过程涉及Binder通信、任务栈与ActivityRecord管理、进程孵化、Instrumentation插桩等,是Android四大组件调度的核心流程。