- 博客(243)
- 资源 (3)
- 收藏
- 关注
原创 一个startActivity请求是如何穿越进程边界
现在AMS需要通知目标App进程去创建并运行对应的Activity。这需要另一个Binder调用,但方向反了过来。这个对象看起来像是一个本地对象,但它实际上是一个。,后面会讲)、Intent、参数等信息打包成一个。进程中的目标Binder对象。Proxy 对象会将方法名(中解包数据,并执行真正的。(AMS的一部分)的。
2025-09-30 15:20:54
595
原创 Binder,IBinder,BBinder,BpBinder之间的联系
IBinder是接口,定义了 Binder 通信的“协议”或“能力”Binder是 Java 层的核心实现,通常作为服务端的基类BpBinder是 C++ 层的客户端代理BBinder是 C++ 层的服务端基类Binder(Java)和BBinder(Native/C++)是同一事物的两种语言实现,都是服务端。而BpBinder是它们的对应面——客户端代理这个流程图清晰地展示了它们在整个 IPC 调用过程中的位置与协作关系:IBinder是贯穿始终的契约BinderBBinder。
2025-09-30 10:37:39
625
原创 /dev/binder设备驱动
高效的内存管理:通过mmap实现一次拷贝精确的对象引用:通过和binder_ref管理跨进程对象引用智能的路由机制:将事务准确递送到目标进程和线程强大的生命周期管理:通过引用计数和死亡通知防止资源泄漏安全的基础:为 SELinux 和自定义权限检查提供调用上下文。
2025-09-30 09:32:46
562
原创 Binder和IBinder
概念角色关键点IBinder通信协议接口定义了跨进程通信的基本操作(如transact是所有 Binder 对象的根接口。代表一个远程对象的引用Binder服务端基类 & 机制实现实现了IBinder。作为服务端本地对象的基类(Stub),处理请求(onTransact其内部类是客户端的远程代理客户端代理在客户端进程中,实现了IBinder。是transact调用的客户端起点,负责将调用序列化并发送给驱动AIDL工具和胶水自动生成代码(StubProxy),将复杂的BinderIBinder。
2025-09-29 16:26:33
556
原创 主线程的Looper消息循环是如何建立的
建立时机:消息循环是在中,在应用进程创建并 attach 到 AMS之后建立的核心三部曲:创建唯一的 Looper 和 MessageQueue:与系统服务建立连接,为后续接收系统消息(如启动Activity)做准备:启动无限循环,开始处理消息为什么不会ANR?:ANR 不是因为 loop 循环本身,而是因为单个消息的处理时间过长,导致后续的消息(例如屏幕触摸事件)得不到及时处理。这个循环本身正是保证应用响应的机制与系统交互:AMS 通过 Binder 线程发送过来的请求(如),都会被中的。
2025-09-29 10:56:56
922
原创 App进程是如何从Zygote中fork出来的
核心机制Fork + 写时拷贝。这是高效创建App进程的基石准备工作:Zygote在系统启动时预加载通用代码和资源,避免了每个App都重复加载通信方式:AMS通过向Zygote发起Fork请求进程的“灵魂”:Fork出的子进程通过执行,从一个空的Zygote副本“变身”为真正的App进程安全性:Zygote本身以root权限运行,但Fork出的子进程会根据App的配置(在AndroidManifest.xml中)被降权,以非root的沙箱权限运行,保证了系统安全。
2025-09-29 09:53:56
879
原创 AudioFlinger
中心化:AudioFlinger 实现了音频资源的中心化管理,避免了应用间对音频设备的无序竞争效率:通过共享内存和高效的混音算法,在保证功能的前提下,最大限度地降低了CPU和功耗开销灵活性:与 AudioPolicyService 的解耦,使得 Android 可以灵活地适应不同设备(手机、电视、汽车)的音频策略能力提供者:它为上层提供了丰富的音频功能,如低延迟播放、音频效果(重低音、虚拟化)、音量控制等总而言之,AudioFlinger 是 Android 音频系统的基石和引擎。
2025-09-28 16:31:16
818
原创 汇编语言:机器语言
机器语言是唯一一种能被计算机中央处理器(CPU)直接理解和执行的编程语言。它是由一系列二进制数字(0和1)组成的代码,这些代码直接对应着CPU硬件层面的操作指令你可以把它想象成计算机的母语。所有其他高级语言(如Python、Java、C++)编写的程序,最终都必须被翻译成机器语言,才能被CPU执行特性描述本质CPU能直接执行的二进制代码(0和1序列)层级最低级的编程语言可读性对人类极差,是计算机的“母语”可移植性很差,依赖于特定的CPU架构执行速度最快,因为无需翻译相关概念指令集架构、操作码、操作数。
2025-09-28 15:11:52
882
原创 虚拟机管理程序(Hypervisor)
简单来说,Hypervisor 是一种在单一物理硬件上创建并运行多个独立、隔离的虚拟计算机(称为虚拟机,VM)的软件你可以把你的个人电脑想象成硬件。在没有 Hypervisor 的情况下,你只能安装一个操作系统,比如 Windows。但如果你安装了或VirtualBox,你就可以在这台电脑上同时运行多个“虚拟电脑”,比如一个 Ubuntu Linux 和一个 macOS。Hypervisor 就是汽车领域的“VMware”,但它更加强调实时性、安全性和可靠性隔离(Isolation)和。
2025-09-26 16:42:47
986
原创 CAN总线
特性SocketCAN厂商库可移植性高(标准 Linux API)低(依赖特定厂商)灵活性高(可进行底层控制)中/低(受限于库提供的功能)开发难度中/高(需要 JNI 和 C++ 知识)低(纯 Java/Kotlin API)设备要求内核需支持 SocketCAN厂商提供了对应的库和驱动推荐场景拥有系统控制权的定制设备(如自研 IVI)使用现成的商业硬件模块建议:首先确认你的硬件平台:查阅设备的数据手册或咨询供应商,明确它支持哪种方式如果支持 SocketCAN。
2025-09-26 15:38:48
846
原创 Vehicle HAL
在传统汽车中,信息娱乐系统(车机)和车辆的核心控制系统(如发动机、变速箱、车身控制器)通常是两套独立的网络,通信有限。AAOS 的目标是打破这种隔阂,让应用能安全、统一地与车辆功能交互VHAL 就是打破这堵墙的“翻译官”和“网关”VHAL 提供了一套标准化、抽象化的车辆属性接口。应用开发者只需要知道“空调设定温度”这个属性,而不需要关心它是通过哪种总线、哪个控制器、哪个字节位来实现的VHAL 负责与具体的车辆硬件和网络(如 CAN、LIN、FlexRay、以太网)打交道。
2025-09-26 14:39:46
841
原创 Car Service
Car Service 是 Android Automotive OS 的基石。通过精细的权限模型保护车辆关键功能通过缓存和事件机制减少总线负载,提升响应速度将复杂的车辆信号转化为应用开发者易于理解的 API通过分心管理确保驾驶安全。
2025-09-26 13:16:25
782
原创 Android Automotive OS架构
以 Car API 和 Car Service 为中枢,向上为应用提供统一接口,向下通过车辆 HAL 抽象车辆硬件,从而构建了一个既开放又安全、既能快速迭代又能满足汽车级要求的软件平台。这套架构的成功,关键在于它在谷歌的软件生态和汽车制造商的硬件控制之间找到了一个完美的平衡点。
2025-09-26 10:27:39
747
原创 内存泄漏排查
主题层面核心工具/机制优化目标内存泄漏排查应用层 (Java/Native)避免应用因逻辑错误无谓消耗内存,提升稳定性内核层 (Kernel)Kmemleak确保系统底层稳定,防止内核模块耗尽系统内存ION 内存管理系统层 (HAL/Driver)ION 分配器,/proc/ion实现硬件间零拷贝,极致优化多媒体、图形性能,同时高效管理设备内存。
2025-09-25 16:05:18
876
原创 LMK机制及优化策略
Low Memory Killer 是 Android 系统在 Linux 内核层面实现的一套主动内存回收机制。它的根本目的是在系统可用内存不足时,根据一定的策略主动选择并终止(杀死)一些优先级较低的进程,从而释放内存,避免系统陷入不可控的、卡死性的内存危机为什么需要 LMK?—— 解决 OOM Killer 的滞后性与被动性标准的 Linux 内核有一个OOM Killer,它只在系统内存完全耗尽,无法分配新内存时才会被触发。
2025-09-25 15:27:46
752
原创 Choreographer 的工作原理
Choreographer 原理解决 Jank 的方法它是基于VSync的调度中心确保工作能在16.6ms(一帧时间)内完成按顺序执行回调优化主线程,避免在TRAVERSAL(测量、布局、绘制)阶段耗时过长如果错过截止时间,就跳过该帧,导致 Jank使用精确找出是哪个环节超时它管理着渲染流水线的应用侧节奏优化渲染侧:减少过度绘制、使用合适的视图。
2025-09-25 14:40:35
914
原创 HWC的软硬件架构
HWC的软硬件架构是一个典型的分工协作、能力协商的范例硬件层(DPU)提供高效、低功耗的合成能力,但资源有限HAL层(厂商实现)是“大脑”,负责最优化地利用有限的硬件资源,其算法质量直接决定了设备的图形性能上限框架层(SurfaceFlinger)是“指挥官”,遵循HAL的决策,并准备好回退方案(GPU合成),保证系统的鲁棒性。
2025-09-24 09:07:54
971
原创 SurfaceFlinger的合成策略及优化启示
在Android系统中,应用通常会将内容绘制到一到多个图形缓冲区(Graphic Buffer)中。这些缓冲区就像是画布,应用负责在上面作画。但是,最终这些多个“画布”需要被整合到一起,显示在同一个物理屏幕上(比如,状态栏、导航栏、微信界面、一个悬浮窗可能同时存在)这个系统服务的核心工作,就是接收来自各个应用和系统进程的图形缓冲区,并根据它们的Z-order(层级关系)、位置、透明度等信息,将这些缓冲区合成为最终的一帧图像,然后提交给显示硬件(Display Hardware)进行扫描输出。
2025-09-23 16:47:31
634
原创 Android启动优化
层面关键优化手段内核/Init驱动裁剪与延迟初始化,init.rc 任务并行化Zygote精简预加载类和资源服务启动并行化,非关键服务延迟加载,PMS 扫描优化应用/Launcher预编译,应用启动优化工具bootchart(宏观),systrace/perfetto(微观),logcat/dmesg(日志)
2025-09-23 15:45:48
553
原创 A/B系统更新
无缝更新 (A/B Seamless Updates)通过双系统分区的方案,将耗时的更新安装过程从阻塞用户的“前台”移到了无感的“后台”,只在最后需要一次简单的重启来切换系统。它通过与动态分区技术结合,提供了极其可靠、高效且用户友好的系统更新体验,是 Android 系统现代化进程中一项至关重要的技术。
2025-09-23 11:39:13
635
原创 Super分区和动态分区
特性传统静态分区动态分区 (Super 分区)分区布局多个独立的物理分区一个大的 Super 物理分区,内含多个逻辑子分区分区大小固定不变,出厂即确定动态可调,可在 Super 总容量内按需分配空间利用效率低,每个分区需预留空间,导致浪费效率高,空间池共享,按需使用OTA 更新容易因空间不足失败,更新机制复杂更可靠,支持无缝更新,更新成功率大幅提升管理复杂度对OEM来说,需要为每个设备精确规划分区大小对OEM来说更简单,只需设定一个总容量兼容性所有 Android 设备Android 10 及以上。
2025-09-22 16:18:05
926
原创 HAL服务AIDL创建流程
aidl包名与路径:包名必须包含hardware,路径必须严格对应稳定性注解:接口必须使用,模块必须设置VINTF声明必须在中声明HAL,否则框架无法发现NDK API:使用的现代API (返回值:方法必须返回构建配置:服务的Android.bp中必须通过属性包含清单文件。
2025-09-22 14:29:28
947
原创 HAL服务HIDL创建流程
hal步骤文件路径作用编译命令/结果1. 定义接口合同。定义方法2. 生成接口编译指令。指导生成代码(生成的)C++桩代码。包含IDemoStubProxy类(生成)3. 实现业务逻辑。继承Stub,实现.hal中的方法程序入口。main()函数,注册服务到管理器4. 编译服务编译指令。指导生成可执行文件(生成的)最终的可执行程序(生成)5. 注册Init启动脚本。告诉Init如何启动我们的服务(随服务一起安装)device.mk产品包配置。决定哪些模块被打包进系统镜像。
2025-09-22 13:09:05
783
原创 从接口定义(.hal/.aidl)到实现(Service)
创建接口目录结构在或下创建你的HIDL包目录。假设我们的包是编写.hal文件创建一个名为IDemo.hal的文件/*** 示例方法:简单加法*//*** 示例方法:获取欢迎信息*/创建接口目录结构在或下创建你的AIDL包目录。注意AIDL HAL的包名有hardware部分,类型是hardware编写.aidl文件创建一个名为IDemo.aidl的文件@VintfStability // 声明接口是稳定的,对于HAL是必须的/*** 示例方法:简单加法。
2025-09-19 11:53:07
698
原创 配置manifest.xml和compatibility_matrix.xml
守护进程会收集所有分区的 manifest 和 matrix 文件,在内存中执行同样的合成与检查。首先,你必须清楚 Android 框架对你的设备有什么要求。这个文件的意思是:“我的供应商实现,需要内核版本为。○ 你的设备需要一个框架未要求的特定内核模块 (内核信息通常由构建系统自动生成并注入到最终的。○ 你的供应商 HAL 依赖一个特定的系统属性。的 HAL,你都必须提供一个对应的。根据第一步中框架的需求,你来编写。,声明你的设备具体提供了什么。如果你的供应商实现有一些。这个内核模块被加载”
2025-09-18 14:32:45
1047
原创 VINTF中manifest.xml和compatibility_matrix.xml的作用
特性核心作用声明供给(“我有什么”)声明需求(“我要什么”)文件类型自我描述要求规范常见位置主要作者供应商 (HAL 实现者)谷歌 Android 团队 (定义框架需求)内容示例关系供应商的“投标书”框架的“招标书”一句话概括:VINTF 通过对比供应商(我提供了什么)和框架(我需要什么),确保软硬件双方遵守共同的接口规范,从而实现了 Android 系统的兼容性可扩展性和可升级性。
2025-09-18 13:43:19
974
原创 Project Treble和HAL架构
HIDL(HAL Interface Definition Language): Treble 初期引入的专用接口语言,用于描述框架和 Vendor 之间的接口。有@1.0@1.1@1.2等版本,支持向后兼容AIDL(Android Interface Definition Language): 原本用于应用和框架之间的通信。从 Android 11 开始,被引入,旨在逐步取代 HIDL。它提供了更好的版本管理、更简单的编程模型,并统一了 Android 的 IPC 生态特性。
2025-09-17 10:33:04
827
原创 信任链验证流程
整个过程就像一场严格的接力赛,每一棒都必须从可信的上一位手中接过接力棒(信任),验证无误后,再跑自己的那段路,并把信任传递给下一棒。第 3 棒:vbmeta.img → 其他分区(boot, system, vendor)第 2 棒:Bootloader → vbmeta.img。第 1 棒:硬件信任根 → Bootloader。
2025-09-16 18:53:48
855
原创 如何配置 vbmeta.img
配置vbmeta.img生成并安全存储你的私钥为每个分区用添加验证脚注使用收集所有分区的描述符,并用私钥签名,生成最终的vbmeta.img将公钥嵌入 Bootloader,并将所有镜像刷写到设备。
2025-09-16 16:03:09
576
原创 硬件信任根
硬件信任根就是一个被硬件保护的、不可更改的“信任锚点”。它通常是一个熔断在eFuse中的公钥哈希值,或者被存储在安全世界(TrustZone)/安全芯片中。它的存在打破了信任循环,为整个Android Verified Boot流程提供了起点和基石。没有它,所有后续的软件验证都将失去意义,因为最基础的信任无从建立。
2025-09-16 15:36:17
857
原创 vbmeta.img 是什么
组件角色类比Bootloader保安队长他只认官方盖章的文件(能验证官方签名)OEM 私钥公司的官方印章绝对机密,只有公司高层才有Bootloader 内置的公钥保安队长持有的官方印章样本用于核对文件上的印章真伪vbmeta.img官方盖章的通行证清单清单本身由官方盖章(签名),所以保安队长信任它描述符清单上的每条通行规则写着“持A证的人可进入机房,其指纹应为XXX”(哈希描述符);“B区域需用专用指纹锁验证,根指纹是YYY”(哈希树描述符)其他分区需要进入各个区域的人和物他们的合法性由。
2025-09-16 14:57:08
792
原创 Android Verified Boot
Android Verified Boot 是一项关键的安全功能,旨在通过建立从硬件信任根到系统分区的完整信任链,来防止设备启动被篡改的或恶意的固件在加载和执行任何代码或数据之前,先验证其加密签名,确保其来自可信的发布者(通常是设备制造商),并且未被修改过隐藏在启动流程中的恶意软件运行非官方的 ROM(即使是一些自定义 ROM,如带有官方支持的 PixelExperience,也会建立自己的信任链)恶意固件可能会在操作系统运行时窃取加密密钥等敏感数据。
2025-09-15 15:42:03
640
原创 硬件支持的密钥库(Hardware-Backed Keystore) 的工作原理
简单来说,它是一个用于生成、存储和执行加密操作(如签名、验证)的系统,其关键特性在于:加密密钥材料永远无法被 Android 操作系统内核或其他应用程序直接访问,而是由一块独立的、受保护的硬件芯片(通常是 Trusted Execution Environment)来保管和处理密钥:就是你放在保险箱里的贵重物品硬件支持:意味着这个保险箱是由坚不可摧的特殊合金(安全硬件)制成,并且有一个只能从外部下达指令、但无法伸手进去的内部机械臂(安全处理环境)你(应用程序)
2025-09-15 13:56:11
1032
原创 SELinux 策略文件编写
在my_app.te文件中,我们首先声明模块并定义新的类型# 声明策略模块名称# 定义进程域类型# 你的应用程序进程将运行在这个域中# 初始域:当系统启动时,由 init 启动的进程的初始上下文# 定义用于 /opt/my_app 目录及其文件的类型# 定义用于日志文件的类型:声明模块名为my_app,版本为1.0:定义一个新类型my_app_t,用于我们的应用程序进程域:这是一个宏,它做了很多事情:○ 它告诉 SELinux,由init系统启动的、类型为的可执行文件,应该转换到。
2025-09-12 15:25:56
675
原创 domain_auto_trans,source_domain,untrusted_app
概念角色类比规则制定者一份官方文件,规定:“如果A部门()的员工使用了B工具(),就必须自动调到C岗位(new_domain)”起点/发起者A部门的员工(如zygote他的身份决定了他能使用哪些工具以及能调到哪些岗位终点/目标之一C岗位中的一个,即限制最多的基层岗位。第三方应用员工最终都在这里。
2025-09-12 10:23:36
510
原创 SELinux策略:域转换与类型继承
特性域转换(Domain Transition)类型继承(Type Inheritance)目的控制进程权限提升,确保安全边界简化策略管理,实现规则重用和集中化管理机制通过executeentrypointtransition权限和控制可执行文件标签来实现自动或手动的域切换通过属性(Attribute)将类型分组,允许为整个组编写统一的allow规则关键规则类比函数调用:有严格的参数和权限检查才能进入面向对象编程中的继承:一个子类(具体类型)继承父类(属性)的所有特性(规则)两者如何协同工作。
2025-09-10 16:01:19
791
原创 JAVA与Native相互调用的真实成本
Native 代码如何调用 Java 方法访问 Java 字段创建 Java 对象Java 代码如何调用 Native 函数(用native关键字声明)当一个 Java 进程启动时,Java 虚拟机(如 ART)会加载并初始化 JNI 相关的组件。的作用就是加载共享库(.so文件),并将其中的 Native 函数符号与 Java 中声明的native方法链接起来操作成本优化策略Java -> Native 调用中到高(取决于参数)减少调用次数,批处理参数/返回值转换非常高(对于引用类型)
2025-09-10 14:37:27
624
原创 通过日志分析GC活动
捕获日志: 使用捕获带时间戳的 GC 日志寻找模式: 不要只看单条日志。关注一段时间内的模式:○频率: GC 是不是每秒都在发生很多次?○暂停时间paused时间是否经常超过 5ms 甚至 16ms?○原因: 是否是令人讨厌的Alloc或ExplicitGC?关联上下文: 尝试在复现用户操作(如快速滑动列表)时捕获日志,将卡顿的时刻与 GC 事件的时间戳对应起来使用专业工具深挖logcat只能告诉你“是什么”和“何时发生”。要找出“为什么”和“在哪里”,你必须使用进行更深入的分析。
2025-09-10 11:55:57
904
pingtools.apk
2020-03-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人