Android 组件内核

文章目录

    • 什么是binder
    • 1. 什么是Binder?
    • 2. Binder架构组成
    • 3. 工作原理与通信流程
      • 1)服务注册
      • 2)服务查询
      • 3)通信过程
      • 4)核心数据结构
    • 4. 关键技术点
    • 5. 常见面试考点
      • 1)Binder与传统IPC(Socket、管道、共享内存等)对比
      • 2)AIDL与Binder关系
      • 3)Binder线程池与ANR
      • 4)Binder通信的生命周期与内存管理
      • 5)Binder的安全机制
    • 6. 面试表达建议(简明版)
    • 7. 简易流程图
    • 什么是 AMS(Activity Manager Service)
    • app的启动,点击launcher icon 开始
    • 1. 总览:从点击应用Icon到Activity显示的主流程
    • 2. 详细分步流程
      • 1)Launcher进程接收点击事件
      • 2)Launcher通过Binder向SystemServer请求启动Activity
      • 3)AMS处理启动请求
      • 4)进程管理与Zygote孵化
      • 5)Application进程启动
      • 6)ActivityThread请求启动Activity
      • 7)Activity界面显示
    • 3. 关键技术细节与源码链路
      • 1)Binder跨进程通信
      • 2)进程孵化与Zygote
      • 3)主线程消息机制
      • 4)Activity生命周期管理
      • 5)Window与View体系
    • 4. 源码调用链(简化)
    • 5. 流程时序图
    • 6. 面试答题建议(精炼版)
    • ActivityA调用`startActivity(Intent)`启动ActivityB
    • 详细流程分解
      • 1)ActivityA进程(应用层)
      • 2)AMS(ActivityManagerService,SystemServer进程)
      • 3)目标应用进程(ActivityB所属进程)
      • 4)ActivityA与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. 简易流程图

ClientServiceManagerBinder驱动Server查询服务返回Binder代理发送请求(Parcel序列化)唤醒线程池,传递数据处理请求,返回结果返回结果ClientServiceManagerBinder驱动Server

什么是 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显示的主流程

  1. Launcher进程接收点击事件
  2. Launcher通过Binder向SystemServer请求启动Activity
  3. SystemServer(AMS)处理启动请求
  4. 进程存在性检查,必要时Zygote孵化新进程
  5. Application进程启动,ActivityThread启动主线程
  6. ActivityThread通过Handler分发消息,反射创建Activity
  7. 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. 源码调用链(简化)

  1. Launcher进程
    • onClick()startActivity()Instrumentation.execStartActivity()AMS.startActivity()
  2. AMS(SystemServer)
    • startActivity()startProcessLocked()(如需新进程)→ Process.start() → Zygote fork
  3. App进程
    • ActivityThread.main()attach()AMS.attachApplication()scheduleLaunchActivity()ActivityThread.H.handleMessage()performLaunchActivity()Activity.attach()Activity.onCreate()

5. 流程时序图

UserLauncherAMSZygoteAppProcessActivityThreadActivity点击应用iconstartActivity(Intent) (Binder)检查进程/任务栈fork新进程(如需)fork成功,执行ActivityThread.main()attachApplication (Binder)scheduleLaunchActivity (Binder)Handler消息反射创建,生命周期回调界面显示UserLauncherAMSZygoteAppProcessActivityThreadActivity

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的所有元信息。
    • 维护ActivityStackSupervisorActivityStack,管理所有任务栈和Activity状态。
  • 进程调度

    • 判断ActivityB所属进程是否存在:
      • 已存在:直接调度。
      • 不存在:调用startProcessLocked(),通过Zygote fork新进程。
  • 调度启动

    • 通过Binder回调目标进程的ApplicationThread.scheduleLaunchActivity(),通知其启动ActivityB。

3)目标应用进程(ActivityB所属进程)

  • ActivityThread消息分发

    • ApplicationThread(Binder服务端)收到scheduleLaunchActivity(),通过Handler切换到主线程。
    • 调用ActivityThread.handleLaunchActivity(),最终执行performLaunchActivity()
  • Activity创建与生命周期

    • 反射创建ActivityB实例,依次调用attach()onCreate()onStart()onResume()等生命周期方法。
    • Instrumentation参与生命周期回调,便于测试和监控。
  • 界面显示

    • setContentView()加载布局,ViewRootImpl与WindowManager建立联系,最终通过SurfaceFlinger合成界面。

4)ActivityA与ActivityB的生命周期切换

  • AMS会根据启动模式和栈顶情况,决定ActivityA是否进入onPause()onStop()等状态。
  • ActivityB启动后成为前台,ActivityA可能被暂停或停止。

3. 源码关键链路(简化)

  1. 应用进程
    • Activity.startActivity()
    • Instrumentation.execStartActivity()
    • ActivityManagerService.startActivity()
  2. AMS
    • startActivity()
    • startProcessLocked()(如需新进程)
    • ApplicationThread.scheduleLaunchActivity()
  3. 目标进程
    • ActivityThread.handleLaunchActivity()
    • Instrumentation.callActivityOnCreate()
    • Activity.onCreate()

4. 时序图

ActivityAAMSAppProcessBActivityThreadBActivityBstartActivity(Intent) (Binder)权限/Intent校验、任务栈管理scheduleLaunchActivity (Binder)Handler消息反射创建、生命周期回调生命周期切换(onPause/onStop)ActivityAAMSAppProcessBActivityThreadBActivityB

6. 面试答题建议

ActivityA启动ActivityB时,应用进程通过Binder调用AMS,AMS负责权限校验、Intent解析、任务栈管理和进程调度。AMS通过Binder回调目标进程的ApplicationThread,ActivityThread在主线程反射创建ActivityB并回调生命周期。整个过程涉及Binder通信、任务栈与ActivityRecord管理、进程孵化、Instrumentation插桩等,是Android四大组件调度的核心流程。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88173.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java类加载机制:Tomcat的类加载机制

Tomcat类加载机制深度解析:打破双亲委派的Web容器实现 Tomcat作为Java Web容器,其类加载机制为满足Web应用的隔离性、热部署和兼容性需求,对标准Java类加载机制进行了定制化扩展,核心是打破双亲委派模型并引入多层级类加载器。以下…

【PTA数据结构 | C语言版】从顺序表 list 中删除第 i 个元素

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录题目代码题目 请编写程序,将 n 个整数存入顺序表,对任一指定的第 i 个位置,将这个位置上的元素从顺序表中删除。注意:i 代表位序,从 1 开始,…

VS2022 C++ EasyX库 扫雷游戏项目开发:打造经典游戏的详细之旅

老样子,先上效果 视频演示 C经典扫雷-介绍一、引言 在这篇博客中,我将详细介绍扫雷游戏项目的开发过程。扫雷作为一款经典的游戏,其规则简单但富有挑战性。通过开发这个项目,我不仅加深了对 C 编程的理解,还提升了自己…

Go语言网络游戏服务器模块化编程

本文以使用origin框架(一款使用Go语言写的开源游戏服务器框架)为例进行说明,当然也可以使用其它的框架或者自己写。 在框架中PBProcessor用来处理Protobuf消息,在使用之前,需要使用Register函数注册网络消息&#xff…

【机器人】Aether 多任务世界模型 | 4D动态重建 | 视频预测 | 视觉规划

Aether 是一个的世界模型,整合几何重建与生成建模的统一框架,实现类人空间推理能力。 来自ICCV 2025,该框架具有三大核心功能: (1) 4D动态重建,(2) 动作条件视频预测, (3) 目标条件视觉规划。 代码地址&…

MiniMind:3小时训练26MB微型语言模型,开源项目助力AI初学者快速入门

开发|界面|引擎|交付|副驾——重写全栈法则:AI原生的倍速造应用流来自全栈程序员 nine 的探索与实践,持续迭代中。 欢迎关注评论私信交流~ 在大型语言模型(LLaMA、GPT等)日益流行的今天,一个名为…

相机Camera日志实例分析之五:相机Camx【萌拍闪光灯后置拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…

[2-02-02].第03节:环境搭建 - Win10搭建ES集群环境

ElasticSearch学习大纲 基于ElasticSearch7.8版本 一、ElasticStack下载: 1.Elasticsearch 的官方地址 2.Elasticsearch 下载地址: 二、集群搭建: 第1步:创建es目录: 1.创建 elasticsearch-cluster 文件夹,在内部…

操作系统核心技术剖析:从Android驱动模型到鸿蒙微内核的国产化实践

目录 一、移动端操作系统技术细节 1. Android 内核版本 核心模块 驱动架构 国内定制案例 2. iOS XNU内核关键模块 安全机制 3. HarmonyOS 多内核架构 驱动隔离 二、PC端操作系统技术细节 1. Windows NT内核 模块分层 驱动模型 国内适配 2. macOS(X…

整合Spring、Spring MVC与MyBatis:构建高效Java Web应用

本文将详细讲解如何整合Spring、Spring MVC和MyBatis(SSM框架),通过一个人员信息查询案例展示完整开发流程。所有代码基于提供的文件实现。一、项目结构src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── qcb…

视频插帧技术:从流畅观影到AI创作的革命

一、起源:为什么需要视频插帧? 视频的本质是连续播放的静态帧序列,帧率(FPS) 决定了流畅度。早期电影受限于拍摄技术和存储成本,普遍采用24FPS,而现代显示设备(如120Hz屏幕&#xf…

【一起来学AI大模型】PyTorch 实战示例:使用 BatchNorm 处理张量(Tensor)

PyTorch 实战示例 演示如何在神经网络中使用 BatchNorm 处理张量(Tensor),涵盖关键实现细节和常见陷阱。示例包含数据准备、模型构建、训练/推理模式切换及结果分析。示例场景:在 CIFAR-10 数据集上实现带 BatchNorm 的 CNNimport…

第8章:应用层协议HTTP、SDN软件定义网络、组播技术、QoS

应用层协议HTTP 应用层协议概述 应用层协议非常多,我们重点熟悉以下常见协议功能即可。 Telnet:远程登录协议,基于TCP 23端口,用于远程管理设备,采用明文传输。安全外壳协议 (SecureShell,SSH) ,基于TCP 22端口,用于…

uniapp页面间通信

uniapp中通过eventChannel实现页面间通信的方法,这是一种官方推荐的高效传参方式。我来解释下这种方式的完整实现和注意事项:‌发送页面(父页面)‌:uni.navigateTo({url: /pages/detail/detail,success: (res) > {/…

Android ViewModel机制与底层原理详解

Android 的 ViewModel 是 Jetpack 架构组件库的核心部分,旨在以生命周期感知的方式存储和管理与 UI 相关的数据。它的核心目标是解决两大痛点: 数据持久化: 在配置变更(如屏幕旋转、语言切换、多窗口模式切换)时保留数…

双倍硬件=双倍性能?TDengine线性扩展能力深度实测验证!

软件扩展能力是软件架构设计中的一个关键要素,具有良好扩展能力的软件能够充分利用新增的硬件资源。当软件性能与硬件增加保持同步比例增长时,我们称这种现象为软件具有线性扩展能力。要实现这种线性扩展并不简单,它要求软件架构精心设计&…

频繁迭代下完成iOS App应用上架App Store:一次快速交付项目的完整回顾

在一次面向商户的会员系统App开发中,客户要求每周至少更新一次版本,涉及功能迭代、UI微调和部分支付方案的更新。团队使用Flutter进行跨平台开发,但大部分成员日常都在Windows或Linux环境,只有一台云Mac用于打包。如何在高频率发布…

springsecurity03--异常拦截处理(认证异常、权限异常)

目录 Spingsecurity异常拦截处理 认证异常拦截 权限异常拦截 注册异常拦截器 设置跨域访问 Spingsecurity异常拦截处理 认证异常拦截 /*自定义认证异常处理器类*/ Component public class MyAuthenticationExceptionHandler implements AuthenticationEntryPoint {Overr…

企业如何制作网站?网站制作的步骤与流程?

以下是2025年网站制作的综合指南,涵盖核心概念、主流技术及实施流程: 一、定义与范畴 网站制作是通过页面结构设计、程序设计、数据库开发等技术,将视觉设计转化为可交互网页的过程,包含前端展示与后台功能实现。其核心目标是为企…

Rust+Blender:打造高性能游戏引擎

基于Rust和Blender的游戏引擎 以下是基于Rust和Blender的游戏引擎开发实例,涵盖不同应用场景和技术方向的实际案例。案例分为工具链整合、渲染技术、物理模拟等类别,每个案例附核心代码片段或实现逻辑。 工具链整合案例 案例1:Blender模型导出到Bevy引擎 使用blender-bev…