1.Androidç³»ç»å¯å¨-SystemServerè¿ç¨
2.AndroidFramework ä¹å¯å¨ ServiceManager
3.深度分析Binder线程池的源码启动流程
4.Android Framework源码解析,看这一篇就够了
Androidç³»ç»å¯å¨-SystemServerè¿ç¨
ç¸å ³æºç æ件ï¼æ ¹æ®ä¸ç¯ Androidç³»ç»å¯å¨-Zygoteè¿ç¨
æç« ï¼å¨Zygoteè¿ç¨å¯å¨æ¶ï¼ä¼è°ç¨ ZygoteInit.main() æ¹æ³ï¼å ¶ä¸åå«ä¼è°ç¨ registerZygoteSocketãpreload ãstartSystemServer ãrunSelectLoop æ¥å建æå¡Socketãæåå è½½èµæºãå建SystemServerè¿ç¨ã循ç¯å建åè¿ç¨ã
æ¬ç¯æç« è®²è§£ startSystemServer() æ¹æ³ï¼å¨startSystemServer()æ¹æ³ä¸ä¸»è¦å®æ两件äºï¼
· å建SystemServerè¿ç¨
· SystemServerè¿ç¨å¯å¨ç³»ç»æå¡
ä¸å¾åæ¯startSystemServeræ¹æ³çå建è¿ç¨ï¼å éè¿ Zygote.forkSystemServe å»å建SystemServerè¿ç¨ï¼å建SystemServerè¿ç¨ä¹å,源码éè¿ handleSystemServerProcess() å¨SystemServerè¿ç¨ä¸å»å¯å¨æå¡ã
Zygote.forkSystemServerï¼
å建 SystemServer è¿ç¨æ¯éè¿ com.android.internal.os. Zygote ç nativeForkSystemServer æ¬å°æ¹æ³å建çï¼JNIæ¹æ³ç注åå¨ AndroidRuntime ä¸ï¼éè¿æ¥è¯¢[å å]_[ç±»å]å¯ä»¥ç¥é对åºçæ¹æ³ä¸ºï¼com_android_internal_os_Zygote.cppç±»çcom_android_internal_os_Zygote_nativeForkAndSpecialize()æ¹æ³ãæåéè¿ ForkAndSpecializeCommon æ¹æ³ fork() å建SystemServerè¿ç¨ã
handleSystemServerProcess(parsedArgs)
éè¿ä¸è¿ä¸²çåæå¾ç¥ï¼ä¸æ¯éè¿ nativeZygoteInit å»å¯å¨Bind,äºæ¯éè¿ applicationInit æ¹æ³éè¿å¼å¸¸å»åå°æ§è¡ SystemServer.main æ¹æ³ï¼è¿é为ä»ä¹éè¦éè¿å¼å¸¸å»åå°æ§è¡æ¹æ³å¢ï¼ä¸ºä»ä¹ä¸ç´æ¥åå°æ§è¡æ¹æ³ï¼å ¶å®æ¯ä¸ºäºæ¸ 空æ çä¿¡æ¯ãå°è¿é并没æå¯å¨æå¡ï¼æ¥ä¸æ¥ç SystemServer.main æ¹æ³æ¯å¯å¨æå¡çå¼å§ã
SystemServer.main
SystemServeræ§è¡ main() æ¹æ³åè°ç¨ run æ¹æ³ï¼ä¹ååå«è°ç¨ startBootstrapServices ã startCoreServices ã startOtherServices å¼å§å¯å¨å¾å¤æå¡ï¼å常è§çActivityManagerServiceãPackageManagerServiceãWindowManagerServiceãInputManagerServicæå¡é½å¨è¿éå¼å¯ã
å¼å¯æå¡æ两ç§æ¹å¼ï¼
ä½æ¯åç°æç»é½æ¯è°ç¨å°LocalServices.addServiceè¿ç§æ¹æ³ã
å¯è§å¯å¨æå¡æ¯é Binder驱å¨å»å¼å¯çã
é¦å éè¿JNIç注åæ¹æ³å»å建SystemServerè¿ç¨ï¼å建è¿ç¨ä¹åï¼å¼å§å¤çSystemServerè¿ç¨ï¼éè¿å¼å¸¸åå°è°ç¨SystemServerçmainæ¹æ³ï¼ä¸»è¦å®æ两件äºï¼ä¸ãå¯å¨Binder驱å¨çº¿ç¨ï¼äºãå¼å¯æå¡(AMSãPMSãWMSãIMSç)ï¼æåéè¿Binder驱å¨å»å¯å¨æå¡ã
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 å°±åæå®äºã
深度分析Binder线程池的启动流程
理论基础Binder
Binder它是Android中的一种进程间通信机制,它主要采用的源码是CS架构模式。Binder框架中主要涉及到4个角色Client、源码Server、源码ServiceManager及Binder驱动,源码sipdroid 源码编译其中Client、源码Server、源码ServiceManager运行在用户空间,源码Binder驱动运行在内核空间。源码
线程池线程池它是源码一种用于多线程处理形式,处理过程中将任务添加到队列,源码然后在创建线程后自动启动这些任务。源码php云控源码线程池线程都是源码后台线程。每个线程都使用默认的源码堆栈大小,以默认的优先级运行,并处于多线程单元中。
简单的说:线程池就是创建一些线程,它们的集合称为线程池。
Binder线程池启动流程我们知道一个新的app应用程序进程在创建完成之后,它会通过调用RunTimeInit类的静态成员函数zygoteInitNative来进行启动Binder线程池。
Binder线程池启动过程中,主要调用几个关键函数:ZygoteInitNative--->onZygoteInit--->startThreadPool。
下面的源码分析主要是以android5.0版本为例。
ZygoteInitNative源码分析由于ZygoteInitNative函数是mysql如何源码安装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就可以了。至于内部的实现一般是不需要去关心的。
Android Framework源码解析,看这一篇就够了
深入解析Android Framework源码,理解底层原理是Android开发者的关键。本文将带你快速入门Android Framework的导航收录系统源码层次架构,从上至下分为四层,掌握Android系统启动流程,了解Binder的进程间通信机制,剖析Handler、AMS、WMS、Surface、SurfaceFlinger、PKMS、InputManagerService、DisplayManagerService等核心组件的工作原理。《Android Framework源码开发揭秘》学习手册,全面深入地讲解Android框架初始化过程及主要组件操作,适合有一定Android应用开发经验的开发者,旨在帮助开发者更好地理解Android应用程序设计与开发的核心概念和技术。通过本手册的学习,将能迅速掌握Android Framework的关键知识,为面试和实际项目提供有力支持。
系统启动流程分析覆盖了Android系统层次角度的三个阶段:Linux系统层、Android系统服务层、Zygote进程模型。理解这些阶段的关键知识,对于深入理解Android框架的启动过程至关重要。
Binder作为进程间通信的重要机制,在Android中扮演着驱动的角色。它支持多种进程间通信场景,包括系统类的打电话、闹钟等,以及自己创建的WebView、视频播放、音频播放、大图浏览等应用功能。
Handler源码解析,揭示了Android中事件处理机制的核心。深入理解Handler,对于构建响应式且高效的Android应用至关重要。
AMS(Activity Manager Service)源码解析,探究Activity管理和生命周期控制的原理。掌握AMS的实现细节,有助于优化应用的用户体验和性能。
WMS(Window Manager Service)源码解析,了解窗口管理、布局和显示策略的实现。深入理解WMS,对于构建美观且高效的用户界面至关重要。
Surface源码解析,揭示了图形渲染和显示管理的核心。Surface是Android系统中进行图形渲染和显示的基础组件,掌握其原理对于开发高质量的图形应用至关重要。
基于Android.0的SurfaceFlinger源码解析,探索图形渲染引擎的实现细节。SurfaceFlinger是Android系统中的图形渲染核心组件,理解其工作原理对于性能优化有极大帮助。
PKMS(Power Manager Service)源码解析,深入理解电池管理策略。掌握PKMS的实现,对于开发节能且响应迅速的应用至关重要。
InputManagerService源码解析,揭示了触摸、键盘输入等事件处理的核心机制。深入理解InputManagerService,对于构建响应式且用户体验优秀的应用至关重要。
DisplayManagerService源码解析,探究显示设备管理策略。了解DisplayManagerService的工作原理,有助于优化应用的显示性能和用户体验。
如果你对以上内容感兴趣,点击下方卡片即可免费领取《Android Framework源码开发揭秘》学习手册,开始你的Android框架深入学习之旅!
2024-11-18 22:34
2024-11-18 22:33
2024-11-18 22:31
2024-11-18 22:22
2024-11-18 21:55
2024-11-18 21:40
2024-11-18 20:57
2024-11-18 20:46