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为例,源码分析其执行过程,分析sqlcipher 源码分析其中使用了全局函数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的空间社区源码正版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对应的mvc日程管理源码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驱å¨å»å¯å¨æå¡ã