1.面试 | 再也不怕被问 Binder 机制了
2.一文总结Android系统服务大管家-ServiceManager
3.androidåLinuxçåºå«ï¼
4.深度分析Binder线程池的内核启动流程
5.面试中常被问到的Framework 底层原理!
6.AndroidFramework ä¹å¯å¨ ServiceManager
面试 | 再也不怕被问 Binder 机制了
Binder机制是源码源码Android特有的进程间通信(IPC)方式,它基于C/S架构,分析由运行在用户空间的内核Client、Server、源码源码Service Manager组件,分析掌上神器源码以及运行在内核空间的内核Binder驱动组成。完整过程包括:通过内存映射技术减少数据拷贝次数,源码源码发送方进程也做内存映射可以实现数据0拷贝传输,分析但考虑到性能和复杂性,内核Binder方式更适合Android。源码源码
mmap内存映射原理是分析在进程的用户空间和内核空间之间建立映射关系,实现文件磁盘地址与进程虚拟地址空间中的内核虚拟地址一一对映,使得进程可以采用指针方式读写操作内存,源码源码系统自动回写脏页面到磁盘,分析完成文件操作而无需再调用read、write等系统调用函数。同时,内核空间对这段区域的修改直接反映用户空间,实现不同进程间的文件共享。
在进程间通信(IPC)场景下使用mmap时,通常只需要在进程的用户空间和内核空间之间建立映射关系,不一定需要映射到外部存储介质,除非希望将共享内存内容持久化到磁盘上。
当使用匿名内存映射进行进程间通信时,创建一段内核空间内存并在进程的用户空间与之建立映射关系,允许多个进程共享同一段内核空间内存,实现数据共享和同步。独步武林源码匿名内存映射不与任何文件关联,仅在进程间实现高效数据传输。
在使用mmap进行进程间通信时,创建匿名内存映射,不映射到外部存储介质,仅在用户空间与内核空间之间建立映射关系。这允许多个进程共享内核空间内存,提高数据访问效率和性能。
在实际应用中,使用带有回调接口(Callback)的方法参数调用服务端进程提供的方法时,方法调用线程和回调线程是否相同取决于服务端实现。通常服务端采用异步处理方式,将请求放入队列或线程池中处理,调用回调接口,线程可能不相同。
对于oneway接口调用,即使服务端立即在当前线程中处理请求并调用回调接口,客户端的调用也不会阻塞。oneway调用是单向异步的,客户端调用后立即返回,不会等待服务端响应。
Intent传递参数在同一个进程中的两个Activity间,由于涉及Binder IPC通信,Intent数据携带大小会受到Binder事务大小限制。通常限制在1MB左右,超过限制会抛出异常。解决方法包括优化数据结构、仁寿来源码使用事件总线或回调接口传递大对象。
为了深入理解Android框架,可参考《Android Framework核心知识点》手册,内容涵盖Init、Zygote、SystemServer、Binder、Handler、AMS、PMS、Launcher等知识点,以及相关源码分析资料,帮助快速掌握Android框架核心。
一文总结Android系统服务大管家-ServiceManager
本文以源码文件为切入点,旨在解析Android系统服务大管家 - ServiceManager的具体运作。首先介绍ServiceManager简介,定义了其为C/C++编写的系统服务,并说明其源码位于/framework/native/cmds/servicemanager,通过Android.bp文件明确,该服务以程序方式构建,启动入口位于main.cpp的main()函数。运行期间,ServiceManager将不断执行looper->pollAll(-1)操作,并默认依托于设备节点/dev/binder,同时也允许通过参数设置自定义节点。ServiceManager作为binder机制的核心组件,负责实现进程间通信。macb指标源码
文章接下来指出在Android.bp文件中,ServiceManager对应程序名为servicemanager,同样存在vndservicemanager程序。两者的源码一致,主要差异在于rc文件,vndservicemanager通过/dev/vndbinder作为binder驱动。在Android启动时,vndservicemanager和servicemanager都被init拉起,它们的功能区别体现在如何指定binder驱动路径。
文章深入探讨ServiceManager的启动过程。首先介绍init进程由内核管理,该进程在启动时,依据init.rc文件拉起关键服务进程,其中包括ServiceManager。在特定目录下(/framework/native/cmds/servicemanager/),存在servicemanager.rc文件,这是servicemanager初始化的配置文件。
进入ServiceManager详细剖析阶段。主要步骤包括获取驱动名称、初始化进程状态、创建ServiceManager实例、设置上下文对象、创建并启动looper,并执行pollAll操作。其中获取驱动名称步骤依据命令行参数或默认采用/dev/binder。初始化进程状态涉及调用initWithDriver()设置libbinder支持特定驱动,同时为进程配置参数。大地之手源码创建ServiceManager实例并作为上下文对象,随后创建并启动looper,执行pollAll(-1)完成核心服务功能实现。
文章最后指出ServiceManager的唤醒时机,通常发生在系统启动、服务注册、通信调用等场景。在Android系统中,ServiceManager的作用主要为实现应用程序与系统组件之间通过Binder机制的跨进程通信,访问和管理系统级服务,从而提供丰富的功能扩展性和灵活性。
androidåLinuxçåºå«ï¼
æ以ä¸ä¸ç¹åºå«ï¼1ãAndroid没ææ¬å°çªå£ç³»ç»ï¼èLinuxæ¯æXçªå£ç³»ç»ã
2ãAndroid没æglibcæ¯æï¼èLinuxæ¯æglibcæ¯æçã
3ãAndroidæ¯æèªå·±ä¸æç驱å¨ç¨åºã
è½ç¶AndroidåºäºLinuxå æ ¸ï¼ä½æ¯å®ä¸Linuxä¹é´è¿æ¯æå¾å¤§çå·®å«ã
æ©å±èµæ
Androidä¸æç驱å¨ç¨åº
1ãAndroid Binder åºäºOpenBinderæ¡æ¶çä¸ä¸ªé©±å¨ï¼ç¨äºæä¾ Androidå¹³å°çè¿ç¨é´éä¿¡(InterProcess Communicationï¼IPC)åè½ãæºä»£ç ä½äºdrivers/staging/android/binder.cã
2ãAndroidçµæºç®¡ç(PM) ä¸ä¸ªåºäºæ åLinuxçµæºç®¡çç³»ç»çè½»é级Androidçµæºç®¡ç驱å¨ï¼é对åµå ¥å¼è®¾å¤åäºå¾å¤ä¼åãæºä»£ç ä½äºï¼
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
3ãä½å å管çå¨(Low Memory Killer) æ¯Linuxçæ åçOOM(Out Of Memory)æºå¶æ´å çµæ´»ï¼å®å¯ä»¥æ ¹æ®éè¦ææ»è¿ç¨ä»¥éæ¾éè¦çå åãæºä»£ç ä½äº drivers/staging/ android/lowmemorykiller.cã
4ãå¿åå ±äº«å å(Ashmem) 为è¿ç¨é´æä¾å¤§åå ±äº«å åï¼åæ¶ä¸ºå æ ¸æä¾åæ¶å管çè¿ä¸ªå åçæºå¶ãæºä»£ç ä½äºmm/ashmem.cã
5ãAndroid PMEM(Physical) PMEMç¨äºåç¨æ·ç©ºé´æä¾è¿ç»çç©çå ååºåï¼DSPåæäºè®¾å¤åªè½å·¥ä½å¨è¿ç»çç©çå åä¸ãæºä»£ç ä½äºdrivers/misc/pmem.cã
6ãAndroid Logger ä¸ä¸ªè½»é级çæ¥å¿è®¾å¤ï¼ç¨äºæåAndroidç³»ç»çåç§æ¥å¿ãæºä»£ç ä½äºdrivers/staging/android/logger.cã
7ãAndroid Alarm æä¾äºä¸ä¸ªå®æ¶å¨ï¼ç¨äºæ设å¤ä»ç¡ç ç¶æå¤éï¼åæ¶å®è¿æä¾äºä¸ä¸ªå³ä½¿å¨è®¾å¤ç¡ç æ¶ä¹ä¼è¿è¡çæ¶éåºåãæºä»£ç ä½äºdrivers/rtc/alarm.cã
8ãUSB Gadgeté©±å¨ ä¸ä¸ªåºäºæ å Linux USB gadget驱å¨æ¡æ¶ç设å¤é©±å¨ï¼AndroidçUSB驱å¨æ¯åºäºgaegetæ¡æ¶çãæºä»£ç ä½äºdrivers/usb/gadget/ã
9ãAndroid Ram Console 为äºæä¾è°è¯åè½ï¼Androidå 许å°è°è¯æ¥å¿ä¿¡æ¯åå ¥ä¸ä¸ªè¢«ç§°ä¸ºRAM Consoleç设å¤éï¼å®æ¯ä¸ä¸ªåºäºRAMçBufferãæºä»£ç ä½äºdrivers/staging/android / ram_console.cã
ãAndroid timed device æä¾äºå¯¹è®¾å¤è¿è¡å®æ¶æ§å¶çåè½ï¼ç®åæ¯ævibratoråLED设å¤ãæºä»£ç ä½äºdrivers/staging/android /timed_output.c(timed_gpio.c)ã
åèèµæï¼ç¾åº¦ç¾ç§ââAndroid
ç¾åº¦ç¾ç§ââlinux
深度分析Binder线程池的启动流程
理论基础Binder
Binder它是Android中的一种进程间通信机制,它主要采用的是CS架构模式。Binder框架中主要涉及到4个角色Client、Server、ServiceManager及Binder驱动,其中Client、Server、ServiceManager运行在用户空间,Binder驱动运行在内核空间。
线程池线程池它是一种用于多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
简单的说:线程池就是创建一些线程,它们的集合称为线程池。
Binder线程池启动流程我们知道一个新的app应用程序进程在创建完成之后,它会通过调用RunTimeInit类的静态成员函数zygoteInitNative来进行启动Binder线程池。
Binder线程池启动过程中,主要调用几个关键函数:ZygoteInitNative--->onZygoteInit--->startThreadPool。
下面的源码分析主要是以android5.0版本为例。
ZygoteInitNative源码分析由于ZygoteInitNative函数是java实现的代码,实践上最终调用的是由C++实现的JNI方法。以下代码来源于系统的/frameworks/base/core/jni/androidRuntime.cpp文件中
staticvoidcom_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv*env,jobjectclazz){ //gCurRuntime是个全局的变量,后面跟上的是另外实现的方法。gCurRuntime->onZygoteInit();}onZygoteInit源码分析onZygoteInit函数在需要源码的位置:/frameworks/base/cmds/app_process/app_main.cpp文件中。
该函数是个虚函数,并且是一个无返回值和无参数的函数virtualvoidonZygoteInit(){ //Re-enabletracingnowthatwe'renolongerinZygote.atrace_set_tracing_enabled(true);//获取进程的状态信息sp<ProcessState>proc=ProcessState::self();//打印日志信息ALOGV("Appprocess:startingthreadpool.\n");//启动线程池proc->startThreadPool();}startThreadPool源码分析startThreadPool系统实现在\frameworks\native\libs\binder\ProcessState.cpp文件中。
每一个支持Binder进程间通信机制的进程内都有一个唯一的ProcessState对象,当这个ProcessState对象的成员函数StartThreadPool函数被第一次调用的时候,它就会在当前进程中启动一个线程池,并将mThreadPoolStarted这个成员变量设置为true。
//该函数是个无参数,无返回值的函数voidProcessState::startThreadPool(){ AutoMutex_l(mLock);//判断线程池是否启动状态,启动的话就将标志信息设置为true属性。if(!mThreadPoolStarted){ mThreadPoolStarted=true;spawnPooledThread(true);}}总结Binder在android底层中是一个非常重要的机制,我们在实际的项目调用过程中,我们在app应用程序中只要实现自己的Binder本地对象的时候,跟其他服务一样,只需要将它进行启动起来,并且进行注册到ServerMananger就可以了。至于内部的实现一般是不需要去关心的。
面试中常被问到的Framework 底层原理!
Android 开发领域对技术的要求日益提高,不再局限于对四大组件和基础开发技能的了解。现在的公司更加注重候选人的技术深度和对源码原理的理解,尤其在大型企业的面试中,对 Android Framework 底层原理的考察尤为突出。
Android 的进程通信机制主要通过 Binder 实现,而线程通信则依赖于 Handler。这两个机制不仅是 Android 开发的基石,也是面试中的重要知识点。
以 Handler 为例,了解其源码结构有助于深入理解相关概念。
Binder 作为 Android 的主要跨进程通信方式,包括 BinderProxy、BpBinder 等多种实体,以及 ProcessState、IPCThreadState 等封装。它贯穿 Java、Native 层,涉及用户态、内核态,与 Service、AIDL 等紧密相关,向下则与 mmap、Binder 驱动设备相连,是一个庞大而复杂的机制。
面试中,面试官可能会问及基于 mmap 的拷贝实现方式。通过图形化解释,我们可以更好地理解这一过程:Client 和 Server 处于不同进程,拥有不同的虚拟地址规则,无法直接通信。通过映射页框,可以将物理内存分别与 Client 和 Server 的虚拟内存块进行映射,实现一次数据拷贝。
精通 Framework 不仅需要对底层原理有深入了解,还需要将 Framework 知识应用于实践,如 Android App 的启动机制、AMS、PMS、WMS 等。
许多学习者和实践者在 Android Framework 面临困扰,但很少人能够逆向分析并找到最优解决方案。Framework 是 Android 开发的深水区,也是衡量程序员能力的重要标准。
为了帮助大家节省学习周期,我整理了《Android Framework 源码解析》这份文档,希望对大家在技术道路上有所帮助。完整版文档已在 GitHub 收录,请参考学习。
AndroidFramework ä¹å¯å¨ ServiceManager
æ¬ææºç åºäº Android ï¼æ¶åç¸å ³æºç å¦ä¸ãServiceManagaer æ¯ Binder çå®æ¤è¿ç¨ï¼å¨ Binder æºå¶ä¸èµ·çéè¦çä½ç¨ãæ¬æå°ä»æºç çè§åº¦å¯¹å ¶è¿è¡åæï¼æ´ä½æµç¨å¦ä¸ï¼
æ¶åºå¾å¦ä¸ã
å æ¥çç ServiceManager æ¯å¦ä½å¯å¨çï¼
å¨ Zygote ä¸æä¸è¯´è¿ï¼ init è¿ç¨å¯å¨ç第äºé¶æ®µä¼è§£æ init.rc æ件ã
å¨è¿ä¹åä¼è§¦å trigger init ã
ç»å init.rc çç action init åäºä»ä¹ã
å½è§¦å trigger init åï¼ä¼å¯å¨ servicemanager æå¡ï¼å ¶å£°æå¦ä¸ã
对åºçæ§è¡æ件为 /system/bin/servicemanager ï¼å¨ç¼è¯åä½äº frameworks/native/cmds/servicemanager ä¸ï¼æ¥çç Android.bp ã
å ¶å¯¹åºçæºç 为 service_manager.c å binder.c ï¼å ¥å£å½æ° main() ä½äº servicemanager.c ã
å¯å¨å® ServiceManager åä¼æå¼ Binder 驱å¨ã
å¨ main() ä¸é¦å è°ç¨ binder_open() ã
binder_open() 主è¦åäºå¦ä¸äºæ ï¼
ç»ç»æä½ binder_state åé å åã
ç³»ç»è°ç¨ open() æå¼ /dev/binder ï¼å¦ææå¼é©±å¨å¤±è´¥ï¼åæ§è¡ fail_open éæ¾å åã
ç®åç解éä¸ä¸ä»ä¹æ¯ç³»ç»è°ç¨ï¼
ç±äºéè¦éå¶ä¸åçç¨åºä¹é´ç访é®è½åï¼é²æ¢ç¨åºè·åå«çç¨åºçå åæ°æ®ï¼ CPU åååºä¸¤ä¸ªæéç级ï¼ç¨æ·æå å æ ¸æã
ææçç¨æ·ç¨åºé½æ¯è¿è¡å¨ç¨æ·æï¼ä½ææ¶éè¦åä¸äºå æ ¸æçäºæ ï¼èå¯ä¸å¯ä»¥åè¿äºäºæ çå°±æ¯æä½ç³»ç»ï¼æ以ç¨åºéè¦åæä½ç³»ç»å起请æ±ï¼ä»¥ç¨åºçååæ¥æ§è¡è¿äºæä½ãè¿æ¶å°±éè¦ä¸ä¸ªä»ç¨æ·æåæ¢å°å æ ¸æä½ä¸è½æ§å¶å æ ¸æä¸æ§è¡çæºå¶ï¼è¿ç§æºå¶å°±æ¯ ç³»ç»è°ç¨ã
ç³»ç»è°ç¨ ioctl() ä¼ å ¥ BINDER_VERSION å½ä»¤è·å Binder 驱å¨çæ¬ï¼å¯¹æ¯çæ¬æ¯å¦ä¸è´ï¼ä¸ä¸è´åæ§è¡ fail_open éæ¾å åã
ç³»ç»è°ç¨ mmap() æ å° kb çå å空é´ï¼å³æ Binder 驱å¨æ件ç kb æ å°å°å å空é´ä¾ ServiceManager 使ç¨ï¼å åæ å°å¤±è´¥åæ§è¡ fail_map ï¼å ³é fd 并éæ¾å åã
ServiceManager è¿ç¨ mmap çå å大å°å¯ä»¥éè¿ adb shell å½ä»¤æ¥çã
å¯ä»¥çå°å åæ å°å°å为 0xff ~ 0xf ï¼å·®ä¸º 0x å³åè¿å¶ç kb ã
æå¼ Binder 驱å¨åä¼å° ServiceManager 设置为ä¸ä¸æ管çè ã
è°ç¨ binder_become_context_manager() ã
android æ°å¢ BINDER_SET_CONTEXT_MGR_EXT å½ä»¤æ¥è®¾ç½®å®å ¨çä¸ä¸æ管çè ï¼å¦æ设置失败ï¼å使ç¨åæç BINDER_SET_CONTEXT_MGR å½ä»¤æ¥è®¾ç½®ä¸ä¸æ管çè ï¼ä¸¤è åºå«å¨äºæ¯å¦æºå¸¦åæ°ã
æåä¼è¿å ¥å¾ªç¯ï¼ä» Binder 驱å¨è¯»åå解ææ°æ®ã
è°ç¨ binder_loop() è¿å ¥å¾ªç¯ï¼ä¸æå°éè¿ç³»ç»è°ç¨ ioctl() ä» Binder 驱å¨è¯»åæ°æ®ï¼å¹¶éè¿ binder_parse() è¿è¡æ°æ®è§£æã
注æè¿éè°ç¨ binder_loop() ä¼ å ¥ç svcmgr_handler() ï¼åé¢ä¼ä½¿ç¨å°ã
binder_write() ä¼å°è£ struct binder_write_read ï¼å¹¶éè¿ç³»ç»è°ç¨ ioctl() å°å¯¹åºçå½ä»¤ä¼ éç» Binder 驱å¨ã
binder_parse() ç¨æ¥è§£æä» Binder 驱å¨è¯»åå°çæ°æ®ï¼ç¶åæ ¹æ®ä¸åçå½ä»¤æ§è¡å¯¹åºçæä½ã
å 为 cmd å½ä»¤å¯è½æå¤ä¸ªï¼æ以éè¿ while 循ç¯æ¯æ¬¡å¤çä¸ä¸ª cmd å½ä»¤ï¼å¤ cmd çç»æ大è´å¦ä¸å¾æ示ã
è¿ééç¹çä¸ BR_TRANSACTION å½ä»¤ã
BR_TRANSACTION æ¯ Binder 驱å¨å Server 端åé请æ±æ°æ®ã
binder_transaction_data çç»æå¦ä¸ï¼å ¶è¡¨æäº transcation ä¼ è¾çå ·ä½è¯ä¹ï¼è¯ä¹ç è®°å½å¨ code ä¸ï¼ä¸åè¯ä¹ç æºå¸¦çæ°æ®æ¯ä¸åçï¼è¿äºæ°æ®ç± data æå®ã
å¨è§£æå® binder_transaction_data çå ·ä½è¯ä¹åï¼ä¼è°ç¨åé¢ä¼ ç» binder_loop() ç svcmgr_handler() ï¼å ¶å®å°±æ¯ switch case è¯ä¹ç åä¸åçäºæ ã
ServiceManager çåè½å ¶å®å¾ç®åï¼
è³æ¤ ServiceManager å°±åæå®äºã
史上最全!Android .0 最新Framework精编内核解析
在Android开发的征途中,无论走了多久,进阶或转型都是必经之路。深入理解Android Framework,是每个开发者进阶路上的必备神器。因为,底层知识的深度与广度,算法与数据结构的精妙,基本编程理论的基石,良好的编码习惯,解决问题的能力,以及持续学习的热情,都是创新者不可或缺的素质。社会呼唤的,不仅仅是熟练的编程工匠,更是能够洞察原理、推动创新的创想者。 如何提升这方面的技能?答案就在这里——我们精心编撰的Android .0 Framework精编内核解析,深入剖析系统启动流程、Binder交互、Handler消息传递、Activity Manager Service(AMS)和Window Manager Service(WMS)等核心模块,从浅显易懂的入门到深入细致的原理解析,一步步引领你成为底层原理的掌握者!系统启动揭秘
- 第一章:从系统启动概览到Zygote机制,一步步揭示Android启动流程的奥秘。
- 第二章:Binder详解,从宏观认识,到驱动机制,再到服务管理和面试题全解析。
消息传递与服务管理
- 第三章:Handler的源码解析,理解其工作原理,掌握面试中的热点问题。
- 第四章:AMS的全面剖析,包括架构、通信方式,面试专题深入讲解。
窗口管理服务
- 第五章:WMS详解,从Activity窗口管理到壁纸窗口显示,剖析每个环节的关键作用。
权限管理与系统组件
- 第六章:PKMS源码解读,理解权限管理和Package Manager Service的运作。
这些深入剖析的内容并非止步于此,完整的《Android Framework开发揭秘》PDF文档,为你的学习旅程提供详尽的指南。点击获取,助你高效掌握,领先一步成为Android框架的高手。 最后,愿这份指南成为你攀登技术高峰的垫脚石,祝愿你的职业生涯熠熠生辉,实现每一个心之所向的offer!