本站提供最佳dw写网站源码服务,欢迎转载和分享。

【深入react技术栈源码】【社区管理app 源码】【aic智能链源码】systemserver源码分析

2024-12-26 03:40:45 来源:winxp 源码 分类:娱乐

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为例,源码分析其执行过程,分析深入react技术栈源码其中使用了全局函数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的社区管理app 源码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对应的aic智能链源码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__被替换为当前文件的行号,以十进制数字形式存在。

       如果需要定义个性化的同城分类网站源码打印格式,可以通过从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进行调用。接下来,我们通过一个例子来看看如何实现个性化打印的金戈铁马分时源码定制。

       首先,我们定制自己的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驱动去启动服务。

【本文网址:http://581.net.cn/html/97b203497868.html 欢迎转载】

copyright © 2016 powered by 皮皮网   sitemap