欢迎来到【beta版源码】【kotlin 项目源码】【guava 的源码】systemserver源码分析-皮皮网网站!!!

皮皮网

【beta版源码】【kotlin 项目源码】【guava 的源码】systemserver源码分析-皮皮网 扫描左侧二维码访问本站手机端

【beta版源码】【kotlin 项目源码】【guava 的源码】systemserver源码分析

2024-11-26 17:30:58 来源:{typename type="name"/} 分类:{typename type="name"/}

1.[UVM源代码研究] 如何定制一款个性化的源码打印格式
2.如何启动一个被home的android应用程序
3.三分钟带你了解Android 系统启动流程详解
4.Android系统启动-SystemServer进程

systemserver源码分析

[UVM源代码研究] 如何定制一款个性化的打印格式

       使用默认的打印格式时,执行如下代码:

       实际打印结果格式如下:

       查看UVM源代码,分析我们首先定位`uvm_info宏定义的源码位置:

       这段代码对uvm_info/uvm_warning/uvm_error/uvm_fatal等宏进行了描述,实际上是分析对uvm_report_*函数的封装。以`uvm_info为例,源码分析其执行过程,分析beta版源码其中使用了全局函数uvm_report_enabled。源码

       这里又调用了uvm_root中定义的分析uvm_report_enabled函数。需要注意的源码是,在uvm_root中并未找到这个函数的分析定义。经过查找源代码,源码发现uvm_report_object中定义了uvm_report_enabled。分析

       为什么要通过uvm_root实例调用这个函数呢?这需要了解uvm类库的源码继承关系。通过分析,分析我们发现通过调用uvm_root中uvm_report_enabled的源码函数,是因为uvm_root支持单例模式,可以获取uvm_root的单例句柄执行uvm_report_object中定义的自动继承的函数,避免了创建额外的实例。

       接下来分析函数执行过程,原本简单的获取severity对应的verbosity阈值设置,却涉及了severity的kotlin 项目源码override问题。我们可以通过调用函数或运行时传入参数来对severity进行override。

       所有severity的override都记录在uvm_pool键值对severity_id_verbosities中。

       severity和verbosity枚举类型定义如下:

       回到uvm_report_object中行的代码,可以认为调用`uvm宏传入的verbosity值如果大于设置的verbosity阈值,则uvm_report_enabled返回0。另外行还有一种函数返回0的情况。

       关于uvm_action和verbosity的设置类似,不再展开。执行`uvm_info系列宏时,不仅需要考虑severity对应的guava 的源码verbosity_level的设置是否大于阈值,还需要考虑对severity设置的行为是否为UVM_NO_ACTION来判断uvm_report_enabled的返回值。

       本质上,执行的是uvm_report_server中的compose_message函数,该函数规定了uvm_info系列宏的打印格式。

       这个函数的参数filename和line是我们调用uvm_report_info传入的`uvm_file和`uvm_line。

       `__FILE__和`__LINE__是systemverilog的编译指令,在编译阶段被替换:`__FILE__被替换为当前文件的文件名,以字符串形式存在;`__LINE__被替换为当前文件的行号,以十进制数字形式存在。

       如果需要定义个性化的codeigniter 加密源码打印格式,可以通过从uvm_report_server继承一个类重写compose_message函数实现。需要注意的是,这里不能用set_type_override_by_type/name,因为uvm_report_server类没有使用uvm_object_utils注册,也没有实现get_type()函数,所以不能用传统的factory的override方法进行override。好在uvm_report_server已经预留好了子类server的覆盖函数set_server。

       这个静态函数可以直接使用类uvm_report_server进行调用。接下来,我们通过一个例子来看看如何实现个性化打印的bluetooth mesh源码定制。

       首先,我们定制自己的report_server:

       然后,在base_test中实例化并set_server:

       现在,我们来看看最初那句打印的执行情况:

       通过以上步骤,我们便实现了个性化的打印定制,该定制对4种severity同时生效。

如何启动一个被home的android应用程序

       ã€€ã€€Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:

               下面详细分析每一个步骤。

               Step 1. SystemServer.main

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 1。

               Step 2. SystemServer.init1

               è¿™ä¸ªå‡½æ•°æ˜¯ä¸€ä¸ªJNI方法,实现在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 2。

               Step 3. libsystem_server.system_init

               å‡½æ•°system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 3。

               Step 4. AndroidRuntime.callStatic

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/core/jni/AndroidRuntime.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 4。

               Step 5. SystemServer.init2

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 5。

               Step 6. ServerThread.run

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 6。

               Step 7. ActivityManagerService.main

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

       [java] view plaincopy

       public final class ActivityManagerService extends ActivityManagerNative  

               implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {   

           ......  

         

           public static final Context main(int factoryTest) {   

               AThread thr = new AThread();  

               thr.start();  

         

               synchronized (thr) {   

                   while (thr.mService == null) {   

                       try {   

                           thr.wait();  

                       } catch (InterruptedException e) {   

                       }  

                   }  

               }  

         

               ActivityManagerService m = thr.mService;  

               mSelf = m;  

               ActivityThread at = ActivityThread.systemMain();  

               mSystemThread = at;  

               Context context = at.getSystemContext();  

               m.mContext = context;  

               m.mFactoryTest = factoryTest;  

               m.mMainStack = new ActivityStack(m, context, true);  

         

               m.mBatteryStatsService.publish(context);  

               m.mUsageStatsService.publish(context);  

         

               synchronized (thr) {   

                   thr.mReady = true;  

                   thr.notifyAll();  

               }  

         

               m.startRunning(null, null, null, null);  

         

               return context;  

           }  

         

           ......  

       }  

               è¿™ä¸ªå‡½æ•°é¦–先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变量mSelf中,最后初始化其它成员变量,就结束了。

               Step 8. PackageManagerService.main

               è¿™ä¸ªå‡½æ•°å®šä¹‰åœ¨frameworks/base/services/java/com/android/server/PackageManagerService.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 7。执行完这一步之后,系统中的应用程序的所有信息都保存在PackageManagerService中了,后面Home应用程序Launcher启动起来后,就会把PackageManagerService中的应用程序信息取出来,然后以快捷图标的形式展示在桌面上,后面我们将会看到这个过程。

三分钟带你了解Android 系统启动流程详解

       Android系统的核心运行机制——Activity Manager Service (AMS)掌控着系统组件的管理和调度,包括应用进程的生命周期管理。面试中,面试官常问关于启动流程、system_server在Zygote中的角色等问题。以下是对这些核心点的分析:

       1. 系统启动流程:启动从电源按钮按下开始,引导程序执行,分为两个阶段——检测RAM并加载第二阶段程序,接着设置网络等,为内核运行做准备。内核启动后,swapper进程和kthreadd进程相继启动,初始化内存管理和驱动。

       2. Zygote与system_server:system_server并非由init直接启动,而是通过Zygote进程孵化,因为这样可以实现更高效的应用进程创建。Zygote负责孵化应用进程,避免system_server过载。

       3. 死锁与IPC通信:Zygote不采用Binder机制进行进程间通信,可能是因为其设计策略注重性能和效率,避免了复杂的跨进程通信机制。

       4. 深入理解:图示中,Loader层负责引导,Kernel层启动内核和驱动,Native层孵化守护进程和系统服务,如System Server和Media Server。Zygote进程孵化Launcher和各种App进程,提供用户界面和服务。

       掌握Android系统启动流程和底层机制对于开发者至关重要,尤其在竞争激烈的行业中。为了应对挑战,建议系统学习,例如《Android Framework源码开发揭秘》提供深入剖析,涵盖了启动流程、IPC通信、核心组件解析等内容,适合有一定经验的开发者提升技术理解。

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驱动去启动服务。