- 博客(411)
- 收藏
- 关注
原创 Binder 专题33——Binder 系统源码演进
本文分析了Android 12中ServiceManager的启动过程。主要变化包括:从Android 11开始,ServiceManager(SM)不再直接使用底层Binder驱动API,转而采用libbinder库和AIDL。文章详细展示了SM的main函数流程:初始化Binder驱动、实例化ServiceManager、注册自身服务、成为Binder上下文管理器,最后进入事件循环处理Binder调用。关键点包括进程状态初始化、访问控制设置、Looper准备等,反映了SM从底层驱动到高级接口的演进。
2026-03-01 09:59:38
308
原创 Binder 专题32——Binder 异常处理机制
本文分析了Binder通信中服务端异常处理的机制。当服务端方法抛出异常时,异常会通过调用栈向上传递到execTransactInternal方法。该方法捕获RemoteException和RuntimeException后,对于oneway调用仅打印错误日志,而非oneway调用则将异常信息写入reply Parcel。Parcel通过writeException方法将异常转换为整型code并序列化,最终传递给客户端处理。整个过程确保了跨进程异常传递的可靠性,同时避免无关异常干扰调用流程。
2026-03-01 09:44:18
355
原创 Binder 专题31——Binder 死亡通知情景分析
Binder死亡通知机制分析 本文分析了Android Binder机制中的死亡通知流程,主要包括: 基本流程:死亡通知是一个回调过程,客户端保存回调对象并发送给驱动,驱动记录关联关系,服务端死亡时通知客户端执行回调。 注册过程:以AMS为例,通过linkToDeath()注册死亡通知。客户端构造AppDeathRecipient回调对象,通过JNI调用底层BpBinder的linkToDeath()方法。 实现细节: 一个BpBinder可注册多个死亡回调 底层通过JavaDeathRecipient封装
2026-02-28 16:19:55
895
原创 Binder 专题30——Binder 代理对象泄露问题分析
摘要:Android P之前存在Binder代理对象泄露问题,恶意应用频繁发起回调注册会导致内存耗尽。解决方案是限制BpBinder对象创建:系统通过sTrackingMap记录各UID创建的BpBinder数量,超过阈值时会触发回调处理。以AMS为例,处理方式包括打印错误日志和直接终止非系统进程。该机制有效防止了Binder代理对象滥用导致的内存问题。
2026-02-28 15:54:36
257
原创 Binder 专题29——Binder 线程池溢出问题
本文分析了Binder线程池溢出的问题场景。当客户端发起同步调用时,如果服务端所有线程都在处理其他事务,内核驱动会先将事务放入目标进程的待办队列,然后唤醒所有处于轮询状态的线程。由于线程都在运行中,无法立即响应唤醒请求,导致客户端调用失败。关键点在于binder_select_thread_ilocked()返回空线程,事务被放入proc->todo队列,而binder_wakeup_poll_threads_ilocked()尝试唤醒所有线程但无效。
2026-02-28 15:37:54
257
原创 Binder 专题28——Binder 多线程场景分析
Binder多线程机制分析 线程数据结构管理: Binder驱动为每个应用层线程创建binder_thread结构体 通过红黑树(proc->threads)管理所有线程数据结构 线程休眠机制: 服务端读取数据时,线程会被加入proc->waiting_threads队列 线程进入休眠状态等待唤醒 线程唤醒机制: 客户端发送数据时,驱动从waiting_threads队列选择第一个线程作为目标 实现多线程间的任务调度和通信 同步控制: 使用锁机制保护共享数据结构 通过schedule()实现线程
2026-02-28 14:52:57
914
原创 Binder 专题27——Binder 中的 Parcel 数据结构分析(Java)
本文分析了Android Binder机制中Parcel数据结构的Java层实现。Parcel作为Binder进程间通信的数据载体,支持基本数据类型、数组、Parcelable对象等多种数据格式。文章详细剖析了Parcel的初始化过程:通过obtain()方法从缓存池获取对象,若缓存不足则新建Parcel实例,其核心功能通过JNI调用Native层实现。同时介绍了recycle()回收机制,将使用完毕的Parcel对象重新放入缓存池以供复用。整体而言,Java层Parcel主要作为接口封装,实际数据处理由N
2026-02-28 14:28:01
1029
原创 Binder 专题26——Binder 中的 Parcel 数据结构分析(C++)
本文分析了Android Binder机制中Parcel数据结构的实现原理,重点研究了Int32类型数据的读写过程。Parcel作为Binder进程间通信的数据载体,其核心实现包括: 内存管理机制:通过mData指针管理数据缓冲区,配合mDataSize、mDataCapacity和mDataPos变量跟踪缓冲区使用情况 资源限制处理:在初始化时通过getrlimit获取进程文件描述符限制 Int32数据读写:展示了writeInt32和readInt32的基本使用示例 状态初始化:详细解析了initSta
2026-02-28 14:02:32
691
原创 Binder 专题25——Binder 驱动 Debug 入门
本文介绍了Binder驱动调试的关键方法,主要包含以下内容: Debugfs概述:解释Debugfs作为内核调试虚拟文件系统的作用,以及Binder驱动如何在/sys/kernel/debug下创建调试文件和目录。 Binder调试文件:详细说明binder_init函数创建的6个关键调试文件(proc、stats等)及其作用,展示binder_debug函数如何将日志写入这些文件。 内核模块参数机制:讲解module_param宏的功能,以及如何通过命令行或文件(sysfs)方式传递参数给内核模块。 Bi
2026-02-28 11:00:42
1049
原创 Binder 专题24——AIDL 关键字 in out inout oneway 解析
本文摘要: AIDL中的in、out、inout和oneway关键字解析: 方向标签: in:数据仅从客户端流向服务端(默认) out:数据仅从服务端流向客户端 inout:数据双向流通 oneway: 使方法变为异步调用 Java实现细节: in参数会写入Parcel对象传输 out参数仅接收返回数据 inout实现双向数据交换 通过Parcelable接口实现跨进程对象传输 示例展示了Book类的Parcelable实现和IHelloService接口的AIDL定义,通过aidl工具生成对应的Java代
2026-02-28 10:09:42
858
原创 Binder 专题23——Native 调用 Java Binder 服务
本文介绍了两种Native层调用Java Binder服务的方法。第一种是直接通过IServiceManager获取服务并使用Parcel进行数据交互;第二种利用AIDL生成中间文件,实现更规范的跨语言调用。通过编译部署测试,两种方法都成功实现了Native客户端与Java服务端的通信。文章详细展示了从代码编写、编译到测试的完整流程,为Native与Java层间的Binder通信提供了实用解决方案。
2026-02-28 09:27:58
260
原创 Binder 专题22——Java 调用 Native 服务
本文介绍了两种Java调用Native Binder服务的方法:1)简易方案通过IBinder直接通信,使用Parcel封装数据;2)标准方案利用AIDL生成接口文件实现跨语言调用。详细说明了两种方案的实现步骤,包括代码结构、编译过程、部署方法和测试验证。两种方式均成功实现了Java客户端与C++服务端的通信,其中AIDL方案更为规范完整。文章提供了完整的代码示例和操作流程,可作为Android系统开发中Java与Native层交互的参考实现。
2026-02-28 09:11:09
252
原创 Binder 专题21——AIDL 数据类型详解之 C++ 篇
本文介绍了AIDL在Native层的数据类型支持情况,重点展示了自定义Parcelable类型Student的实现过程。文章通过示例程序详细说明了如何定义Student类(继承Parcelable)、实现序列化方法,以及在AIDL文件中声明该类型。同时演示了服务端接口IHello的实现,包括基本数据类型操作、List处理和自定义类型Student的传输。该示例完整呈现了AIDL在C++层的开发流程,为跨进程通信提供了实用参考。
2026-02-27 16:12:44
408
原创 Binder 专题20——AIDL 数据类型详解之 Java 篇
本文介绍了AIDL支持的数据类型及Java实现示例。AIDL支持Java基本类型、String、CharSequence、List、Map和Parcelable对象。文章通过一个Java示例程序演示了这些类型的使用,包括自定义Parcelable类Student的实现、AIDL接口定义、服务端和客户端的编写。示例展示了如何通过Binder跨进程传递各种数据类型,包括基本类型、集合类型和自定义对象,为Android跨进程通信开发提供了实践参考。
2026-02-27 15:56:07
385
原创 Binder 专题19——Java 系统服务框架与第三方 App 使用自定义 Java 系统服务
摘要:本文分析了Android Java系统服务框架的实现机制,以Vibrator振动服务为例,详细阐述了系统服务的注册、获取和使用流程。通过SystemServiceRegistry注册服务,客户端通过getSystemService获取SystemVibrator代理对象,最终通过Binder机制与系统服务端交互。文章还展示了自定义系统服务的实现方法,为开发者扩展系统功能提供了参考。
2026-02-27 15:31:53
788
原创 Binder 专题18——添加 Java 系统服务
本文介绍了在Android系统中添加Java系统服务的完整流程。首先创建AIDL接口定义文件,将其加入编译系统;然后实现Binder服务端类,在系统启动时注册服务;接着配置SELinux权限和Java接口白名单;最后演示如何在系统App中使用该服务。通过log验证服务调用成功,展示了从底层服务到上层应用调用的完整实现路径。整个过程涉及AIDL接口定义、系统服务注册、SELinux配置、白名单管理等多个关键环节,为Android系统定制开发提供了实用参考。
2026-02-27 15:03:24
286
原创 Binder 专题17——Binder Java 层服务获取与使用分析
本文分析了Android Binder机制中Java层服务的获取与使用过程。通过ServiceManager.getService()方法获取服务时,首先会查询本地缓存,若未命中则通过Binder IPC机制跨进程获取。具体流程包括:创建ServiceManagerProxy代理对象,通过BinderProxy发起跨进程调用,最终将返回的IBinder对象转换为客户端可用的接口。整个过程涉及Java层与Native层的交互,以及Binder驱动的数据传输机制,体现了Android系统服务调用的核心原理。
2026-02-27 14:10:50
784
原创 Binder 专题16——Binder Java 层服务注册过程分析
摘要:本文分析了Android Binder机制中Java层服务注册过程。当调用ServiceManager.addService()时,会创建继承自Binder的HelloService对象,其内部通过JNI持有native层的JavaBBinderHolder指针。addService()最终通过ServiceManagerProxy与native层交互,其中关键步骤包括:获取Binder代理对象(BinderInternal.getContextObject())、解除阻塞限制(Binder.allo
2026-02-27 13:38:53
963
原创 Binder 专题15——Binder Java 层初始化
本文摘要:文章详细介绍了Android Framework层对JNI函数的封装实现,重点分析了Binder在Java层的初始化过程。主要内容包括:1) Framework对常用JNI函数(如FindClass、GetMethodID等)进行了封装,并添加了错误处理;2) 在Zygote启动时通过AndroidRuntime::startReg注册JNI方法,其中包含Binder相关的JNI注册;3) 详细解析了register_android_os_Binder函数,该函数分别注册了Binder类、Bind
2026-02-27 10:41:35
363
原创 Binder 专题14——Binder 程序示例 Java 篇
本文介绍了基于Binder机制的Java程序实现示例。首先定义AIDL接口文件IHelloService.aidl,包含sayhello()和sayhello_to()两个方法。然后实现HelloService服务端类继承IHelloService.Stub,并实现具体方法逻辑。服务端Server类通过ServiceManager注册"hello"服务,客户端Client类获取服务代理并进行远程调用。最后通过Android.bp编译生成jar包,使用app_process命令在Andro
2026-02-27 10:17:00
302
原创 Binder 专题13——添加 Native 系统服务回调
本文介绍了在Android Native层实现Binder跨进程回调功能的方法。通过AIDL定义了IHello服务接口和ICallback回调接口,使用aidl-cpp工具生成C++代码。服务端实现BnHello类并保存回调对象,在sum方法中触发回调;客户端实现BnCallback类接收回调通知。整个过程展示了从AIDL定义到C++实现的完整流程,包括服务注册、回调注册及跨进程调用的实现细节。文章还提供了生成脚本和项目结构说明,为开发者实现Native系统服务回调提供了实用参考。
2026-02-27 09:52:01
583
原创 Binder 专题12——添加 Native 系统服务
本文介绍了在Android系统中添加Native系统服务的完整流程。首先创建AIDL接口定义,生成C++源文件;然后实现服务端程序(HelloServer)和客户端测试程序(HelloClient),并配置Android.bp构建文件。重点讲解了SELinux策略配置,包括在system/sepolicy中添加类型定义、文件上下文和服务上下文等配置项,确保服务能够正常启动和通信。最后通过logcat验证服务运行情况,成功实现了跨进程的远程方法调用。整个过程涵盖了从代码实现到系统集成的完整开发流程。
2026-02-27 09:13:38
276
原创 Binder 专题11——Binder 程序示例 aidl-cpp 篇
本文介绍了使用AIDL-CPP实现Binder通信的完整流程。首先定义IHello.aidl接口文件,包含hello()和sum()两个方法。通过aidl-cpp工具生成C++代码框架后,分别实现服务端和客户端:服务端继承BnHello类实现具体功能,客户端通过代理对象发起远程调用。最后编写Android.bp编译文件,生成可执行程序在设备上运行测试。整个过程展示了AIDL-CPP在Binder跨进程通信中的应用,包括接口定义、服务实现、客户端调用等关键步骤。
2026-02-26 17:20:13
150
原创 Binder 专题10——Binder 服务获取与使用分析C++篇
本文分析了Android Binder机制中客户端获取与使用服务的C++实现过程。首先通过ProcessState::self()初始化Binder驱动,然后获取BpServiceManager代理对象。在获取服务时,通过getService()获取到包含服务handle的IBinder对象,再通过interface_cast转换为具体的BpHelloService代理对象。发起远程调用时,代理对象将请求参数打包成Parcel数据,通过BpBinder的transact()方法发起跨进程调用,服务端线程通过
2026-02-26 16:51:05
925
原创 Binder 专题9——Binder 服务注册过程分析 C++ 篇
本文摘要主要分析了Binder服务注册过程中Server端的C++实现流程。首先通过ProcessState::self()完成Binder驱动的初始化,包括打开驱动通道和内存映射。接着调用defaultServiceManager()获取ServiceManager代理对象,其中通过getContextObject()获取IBinder接口。最后Server端通过addService()注册服务并启动线程池等待远程调用。整个过程展现了Binder机制中服务注册的核心步骤,包括驱动初始化、代理对象获取和服务
2026-02-26 16:24:14
998
原创 Binder 专题8——Binder 程序示例之 C++ 篇
本文介绍了使用Android C++实现Binder通信的完整流程。首先定义IHelloService接口继承IInterface,声明服务功能;然后实现服务端BnHelloService类处理客户端请求;接着实现客户端BpHelloService代理类进行远程调用;最后分别编写服务端和客户端程序,通过ServiceManager注册和获取服务。整个过程涵盖了Binder通信的核心步骤,包括接口定义、服务实现、代理类封装以及进程间通信的建立,为Android系统级开发提供了基础框架参考。
2026-02-26 14:59:40
715
原创 Binder 专题7——Binder 驱动分析之 ServiceManager 启动过程
本文分析了Android Binder驱动中ServiceManager的启动过程。首先介绍了ServiceManager应用层代码,包括打开Binder驱动、注册为context_manager和进入循环等待远程调用三个关键步骤。然后详细解析了Binder驱动的初始化过程,包括通过misc_register注册设备驱动、使用Linux内核的Shrinker机制管理内存回收,以及初始化LRU链表用于内存页回收。文章重点剖析了内核态的数据结构变化和执行流程,特别是内存管理子系统如何通过回调函数binder_s
2026-02-26 14:41:20
607
原创 Binder 专题6——Binder 驱动框架设计与分析
Binder 驱动框架设计与分析摘要 Binder是Android的核心跨进程通信(IPC)机制,采用RPC(远程过程调用)架构,包含Client、Server和ServiceManager三个角色。其核心原理是通过内核共享空间实现进程间数据传输,借助mmap优化为单次拷贝。Binder驱动在内核中以binder_node表示服务实体,binder_proc描述进程信息,binder_ref作为服务引用。寻址过程分为两种:ServiceManager通过全局context定位,普通服务通过注册/查询机制实现
2026-02-26 10:47:28
990
原创 Binder 专题5——Binder 服务获取与使用过程分析 C 语言篇
本文分析了Binder机制中客户端获取服务的过程。客户端通过svcmgr_lookup发起远程调用获取服务的handle值,构造binder_io数据后调用binder_call与服务器通信。ServiceManager被唤醒后解析数据,通过binder_parse处理BR_TRANSACTION命令,最终调用svcmgr_handler回调函数完成服务查找。整个过程展示了Binder跨进程通信的核心流程,包括数据封装、远程调用和回调处理。
2026-02-25 17:31:12
819
原创 Binder 专题4——Binder程序示例 C 语言篇
本文介绍了Binder驱动在C语言层的应用实现,主要聚焦应用层与Binder驱动的交互流程。首先阐述了Binder驱动通过open()、mmap()和ioctl()等系统调用提供的接口功能。接着详细说明了使用frameworks/native/cmds/servicemanager下的binder.c进行应用程序开发的方法,包括binder_open、binder_call等关键函数的封装。 重点分析了Server端的实现过程:定义服务函数、编写服务回调函数处理远程调用请求,以及主函数流程(初始化Binde
2026-02-25 16:56:11
676
原创 Binder 专题3——Binder 基本原理
本文介绍了Android Binder框架的基本原理和工作流程。Binder是一个RPC(远程过程调用)框架,通过内核地址空间实现跨进程数据传输。其核心原理包括:1)利用内核共享内存减少数据拷贝次数;2)通过Handle和Code标识目标进程与函数;3)采用标准的打包/解析数据格式。应用层工作流程涉及Binder服务端、客户端和服务管家(ServiceManager)三个角色,包括服务注册、查询和远程调用三个关键步骤。Binder驱动为整个机制提供底层支持,实现了进程间的高效通信。
2026-02-25 15:40:00
748
原创 Binder 专题2——学习 Binder 的预备知识
本文介绍了Linux驱动开发的基础知识,包括如何编写和编译一个简单的内核模块,以及Linux中文件读写的基本原理。主要内容分为三部分: 内核模块开发:通过一个"Hello World"示例演示了内核模块的基本结构,包括初始化函数(hello_init)和退出函数(hello_exit)的编写方法,以及如何将模块编译进内核或生成独立模块文件。 文件系统接口:解释了Linux中"一切皆文件"的设计理念,介绍了open、read、write、ioctl和close等关键文件
2026-02-25 14:43:24
876
原创 Binder 专题1——如何深入掌握 Binder
文章摘要 本文系统介绍了Android Binder框架的学习路径,从基础理论到各层实现。首先阐述了学习Binder的必要性,包括系统服务开发和应用问题排查。然后提出了需要掌握的预备知识,如Linux驱动开发、虚拟内存等。文章详细讲解了Binder的学习步骤:从基本原理理解,到C层封装实现,再到驱动层核心机制分析,最后深入C++和Java层的具体实现。特别强调了Binder在IPC和RPC方面的工作原理,以及常见疑难问题的分类和解决方法,为Android开发者提供了全面的Binder学习指南。
2026-02-25 11:15:45
494
原创 Android 日志系统7——Android 平台日志丢失问题分析
摘要 本文分析了Android平台日志丢失的常见原因及典型案例,主要包括:1)业务日志输出频率过高导致socket处理能力不足;2)整机负载过高导致logd无法获取CPU资源;3)存储异常导致日志无法落盘;4)低内存导致日志进程被杀。同时指出日志打印会带来跨进程通信、内存、CPU、IO等多方面资源消耗,建议在正式版本中规范日志打印,建立故障检测机制,避免影响系统性能。通过典型案例分析和思维导图,为工程师提供了日志丢失问题的系统分析方法。
2026-02-12 15:13:31
1090
原创 Android 日志系统6——logd 读日志过程分析
本文分析了Android logd服务中LogReader的初始化过程。LogReader在main函数中被创建,负责监听/dev/socket/logdr套接字。其初始化过程包括:获取日志套接字描述符、初始化SocketListener父类、设置监听参数。随后启动监听线程,通过poll机制等待客户端连接或命令管道事件。当有新连接时,会触发后续处理流程将日志缓冲区内容写入客户端。整个初始化过程完成了日志读取服务的基础设施搭建,为后续日志读取功能做好准备。
2026-02-12 14:50:53
924
原创 Android 日志系统5——logd 写日志过程分析二
文章摘要: 本文分析了Android日志系统logd中日志写入的详细过程。首先,SocketListener通过onDataAvailable()方法接收应用程序发送的日志数据,包括设置线程名称、获取客户端身份凭证、处理特殊值等步骤。然后,日志数据被写入LogBuffer,该过程包含四个关键步骤:数据校验、使用状态机去重、实际写入操作以及必要时删除旧日志以控制总量。文章详细展示了日志从应用程序通过socket传输到最终存储的完整流程,涉及关键的数据结构和系统调用,如prctl、recvmsg等。
2026-02-12 13:57:36
557
原创 Android 日志系统4——logd 写日志过程分析一
本文摘要: 文章分析了Android logd服务中LogBuffer的初始化过程。LogBuffer是日志系统的核心缓冲区,负责存储和管理所有日志条目。初始化过程包括:1) 创建LastLogTimes列表;2) 初始化读写锁;3) 为每种日志类型(MAIN/RADIO/EVENTS等)初始化lastLoggedElements和droppedElements指针;4) 设置各日志类型的缓冲区大小;5) 处理时间格式变化时的日志时间戳转换。文章详细介绍了LogBuffer的数据结构,包括日志类型枚举、元素
2026-02-12 13:34:03
678
原创 Android 日志系统3——写日志过程分析
本文分析了Android系统中日志写入的客户端接口流程。首先介绍了Java层的Log.java等接口封装,通过JNI调用Native层实现。详细追踪了从Log.d()调用到println_native()的JNI实现过程,核心是通过__android_log_buf_write()函数处理日志信息,最终转换为iovec结构并通过write_to_log函数指针写入。Native层也提供了类似的日志写入方式,整体流程都是建立socket连接后发送数据。文章梳理了日志从应用层到Native层的完整传递路径,揭示
2026-02-11 17:13:18
790
原创 Android 日志系统2——logd 守护进程
文章摘要:本文分析了Android系统中logd守护进程的初始化过程。logd通过system/core/logd/logd.rc定义了两个服务,初始化了三个socket连接和两个内核日志文件接口。在system/core/logd/main.cpp中,程序首先处理reinit参数,然后获取/proc/kmsg和/dev/kmsg文件描述符,用于与内核日志系统通信。最后初始化多个信号量并创建线程,为后续日志处理做好准备。整个初始化过程确保了系统日志服务的可靠运行和日志信息的完整收集。
2026-02-11 16:30:40
878
原创 Android 日志系统1——整体框架
Android日志系统框架概述 Android日志系统包含多种日志类型:main(应用层日志)、radio(无线通信日志)、events(系统诊断日志)、system(系统应用日志)和crash(崩溃日志)。应用层通过Java的android.util.Log或Native的__android_log_print写入日志,内核层使用printk函数记录日志到/proc/kmsg。系统启动时logd进程会创建三个核心线程:LogListener(接收应用日志写入请求)、LogReader(处理logcat读取
2026-02-11 16:13:05
890
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅