1.[UVM源代码研究] 如何定制一款个性化的源码打印格式
2.å¦ä½å¯å¨ä¸ä¸ªè¢«homeçandroidåºç¨ç¨åº
3.三分钟带你了解Android 系统启动流程详解
4.Androidç³»ç»å¯å¨-SystemServerè¿ç¨
[UVM源代码研究] 如何定制一款个性化的打印格式
使用默认的打印格式时,执行如下代码:
实际打印结果格式如下:
查看UVM源代码,分析我们首先定位`uvm_info宏定义的源码位置:
这段代码对uvm_info/uvm_warning/uvm_error/uvm_fatal等宏进行了描述,实际上是分析对uvm_report_*函数的封装。以`uvm_info为例,源码分析其执行过程,分析cci副图公式源码其中使用了全局函数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的opls-da源码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对应的股票源码汇总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__被替换为当前文件的行号,以十进制数字形式存在。
如果需要定义个性化的PHP报备系统源码打印格式,可以通过从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驱å¨å»å¯å¨æå¡ã