b2g process: XREMain::XRE_mainRun

本文深入剖析了B2G进程的主要模块与启动流程,详细解释了从XRE_main到XRE_mainRun的各阶段功能,包括XPCOM初始化、线程启动、组件管理、内存管理等关键步骤。

b2g process 中到后面主要的几个大模块:

结构图抄自:https://blog.youkuaiyun.com/zembers/article/details/48495627

|-XRE_main
|
|-XREMain::XRE_main
       |
       |-new ScopedAppData(aAppData);
       |
       |-XREMain::XRE_mainInit
       |
       |-XREMain::XRE_mainStartup
       |
       |-mScopedXPCOM = MakeUnique<ScopedXPCOMStartup>();
       |
       |-mScopedXPCOM->Initialize();          (toolkit/xre/nsAppRunner.cpp)
       |           |
       |           |-NS_InitXPCOM2                       (xpcom/build/XPCOMInit.cpp)
       |                  |
       |                  |-sMessageLoop = new MessageLoopForUI(MessageLoop::TYPE_MOZILLA_UI);
       |                  |
       |                  |-ioThread = MakeUnique<BrowserProcessSubThread>(BrowserProcessSubThread::IO);
       |                  |-ioThread->StartWithOptions
       |                  |
       |                  |-nsThreadManager::get()->Init();
       |                  |
       |                  |-nsTimerImpl::Startup();
       |                  |
       |                  |-nsComponentManagerImpl::gComponentManager = new nsComponentManagerImpl();
       |                  |
       |                  |-nsCycleCollector_init
       |                  |
       |                  |-nsCycleCollector_startup
       |                  |
       |                  |-JS_Init
       |                  |
       |                  |-nsComponentManagerImpl::gComponentManager->Init();(xpcom/components/nsComponentManager.cpp)
       |                  |     |
       |                  |     |-nsComponentManagerImpl::InitializeStaticModules()
       |                  |     |
       |                  |     |-RegisterModule(...)
       |                  |     |
       |                  |     |-greOmnijar =mozilla::Omnijar::GetReader(mozilla::Omnijar::GRE);
       |                  |     |
       |                  |     |-cl->location.Init(greOmnijar, "chrome.manifest");
       |                  |     |
       |                  |     |-nsComponentManagerImpl::RereadChromeManifests
       |                  |               |
       |                  |               |-nsComponentManagerImpl::RegisterManifest
       |                  |                       |
       |                  |                       |-DoRegisterManifest
       |                  |                                |
       |                  |                                |-ParseManifest
       |                  |                                      |
       |                  |                                      |-...
       |                  |                                      |
       |                  |                                      |-nsComponentManagerImpl::ManifestContract 
       |                  |
       |                  |-XPTInterfaceInfoManager::GetSingleton();
       |                  |
       |                  |-nsDirectoryService::gService->RegisterCategoryProviders();
       |                  |
       |                  |-SharedThreadPool::InitStatics();
       |                  |
       |                  |-AbstractThread::InitStatics();
       |                  |
       |                  |-mozilla::scache::StartupCache::GetSingleton();
       |                  |
       |                  |-mozilla::AvailableMemoryTracker::Activate();
       |                  |
       |                  |-NS_CreateServicesFromCategory(...)
       |                  |
       |                  |-mozilla::HangMonitor::Startup();
       |                  |
       |                  |-mozilla::BackgroundHangMonitor::Startup();
       |                  |
       |                  |-sMainHangMonitor = new mozilla::BackgroundHangMonitor
       |                  
       |-XREMain::XRE_mainRun()
                |
                |-mozilla::ipc::ProcLoaderClientGeckoInit();
                |
                |-mScopedXPCOM->SetWindowCreator(mNativeApp);
                |
                |-startupNotifier->Observe(nullptr, APPSTARTUP_TOPIC, nullptr);
                |
                |-mDirProvider.DoStartup();
                |
                |-cmdLine->Init(...)
                |
                |-obsService->NotifyObservers(cmdLine, "command-line-startup", nullptr);
                |
                |-appStartup->CreateHiddenWindow();
                |
                |-obsService->NotifyObservers(nullptr, "final-ui-startup", nullptr);
                |
                |-cmdLine->Run();     (toolkit/components/commandlines/nsCommandLine.cpp)
                |          |
                |          |- nsCommandLine::EnumerateValidators
                |          |
                |          |-nsCommandLine::EnumerateHandlers
                |                  |
                |                  |-EnumRun
                |                        |
                |                        |-nsICommandLineHandler->Handle   (first page will be loaded in here)        
                |                                  
                |-mNativeApp->Enable();
                |
                |-appStartup->Run();     (toolkit/components/startup/nsAppStartup.cpp)
                          |
                          |-mAppShell->Run();         (widget/gonk/nsAppShell.cpp->widget/nsBaseAppShell.cpp)
                                   |
                                   |-MessageLoop::current()->Run();  // run forever~~~~~

main()->RunProcesses()->b2g_main()->do_main()->XRE_main()->XREMain::XRE_main()->XREMain::XRE_mainRun()

分析XREMain::XRE_mainRun()做的工作:

gecko/toolkit/xre/nsAppRunner.cpp

https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICommandLine

comandline 什么鬼?如何使用,有什么用?浏览器上用的?对一些扩展应用进行设置查看???

把默认设置等迁移migration过来?

XRE_mainRun()主要工作:

 

XREMain::XRE_mainRun()
|
|-mozilla::ipc::ProcLoaderClientGeckoInit();//初始化ProcLoaderClientGecko
|
|-mScopedXPCOM->SetWindowCreator(mNativeApp);
|
|-startupNotifier->Observe(nullptr, APPSTARTUP_TOPIC, nullptr);
|
|-mDirProvider.DoStartup();//启动
|
|-cmdLine->Init(...)//cmdLine初始化
|
|-obsService->NotifyObservers(cmdLine, "command-line-startup", nullptr);//启动对commandline通知观察监听,
|
|-appStartup->CreateHiddenWindow();//appStartup 创建window
|
|-obsService->NotifyObservers(nullptr, "final-ui-startup", nullptr);//启动对ui通知观察监听
|
|-cmdLine->Run();     (toolkit/components/commandlines/nsCommandLine.cpp)//运行cmdline
|          |
|          |- nsCommandLine::EnumerateValidators//枚举验证器?
|          |
|          |-nsCommandLine::EnumerateHandlers//枚举处理程序
|                  |
|                  |-EnumRun//运行枚举
|                        |
|                        |-nsICommandLineHandler->Handle   (first page will be loaded in here)      //cmdline处理器处理事情? 
|                                  
|-mNativeApp->Enable();//使能nativeapp
|
|-appStartup->Run();     (toolkit/components/startup/nsAppStartup.cpp)//开始启动窗口?是gaia了吗?
          |
          |-mAppShell->Run();         (widget/gonk/nsAppShell.cpp->widget/nsBaseAppShell.cpp)//获取当前的线程并messageloop?
                   |
                   |-MessageLoop::current()->Run();  // run forever~~~~~

 

widget/nsBaseAppShell.cpp

// nsIAppShell methods:

NS_IMETHODIMP
nsBaseAppShell::Run(void)
{
    //P_LOGI(SEPARATOR_LINE);
  NS_ENSURE_STATE(!mRunning);  // should not call Run twice
  mRunning = true;
//P_LOGI("  nsIThread *thread = NS_GetCurrentThread()--->");
  nsIThread *thread = NS_GetCurrentThread();
//P_LOGI("  MessageLoop::current()->Run()--->");
  MessageLoop::current()->Run();
//P_LOGI("  NS_ProcessPendingEvents(thread)  NS_ProcessPendingEvents(thread)-->");
  NS_ProcessPendingEvents(thread);

  mRunning = false;
  return NS_OK;
}

两次对NS_InitXPCOM2的调用:

一次是b2g ,一次是nuwa??

(2)

gecko/toolkit/xre/nsEmbedFunctions.cpp:172, Fuc:XRE_InitEmbedding2

gecko/toolkit/xre/nsEmbedFunctions.cpp:196, Fuc:XRE_InitEmbedding2    rv = NS_InitXPCOM2(nullptr, aAppDirectory, gDirServiceProvider)-->
gecko/xpcom/build/XPCOMInit.cpp:512, Fuc:NS_InitXPCOM2

 

 

 

 

 

 

ProcLoaderClientGeckoInit()-->

(1)sProcLoaderParent->Open(transport,
                          sProcLoaderPid,
                          XRE_GetIOMessageLoop(),
                          ParentSide);

(2)  sProcLoaderLoop = MessageLoop::current();

 

 

 

gecko/toolkit/xre/nsAppRunner.cpp:1584, Fuc:Initialize  startup xpcom seccessed?? call do_QueryInterface(mServiceManager)-->
gecko/toolkit/xre/nsAppRunner.cpp:4463, Fuc:XRE_main  call XRE_mainRun--->
gecko/toolkit/xre/nsAppRunner.cpp:4060, Fuc:XRE_mainRun  ----------------------------------
gecko/toolkit/xre/nsAppRunner.cpp:4065, Fuc:XRE_mainRun  call mozilla::ipc::ProcLoaderClientGeckoInit()--->
gecko/ipc/glue/ProcessUtils_linux.cpp:231, Fuc:ProcLoaderClientGeckoInit  ----------------------------------
gecko/ipc/glue/ProcessUtils_linux.cpp:251, Fuc:ProcLoaderClientGeckoInit    sProcLoaderParent = new ProcLoaderParent()
gecko/ipc/glue/ProcessUtils_linux.cpp:253, Fuc:ProcLoaderClientGeckoInit  sProcLoaderParent->Open(transport,sProcLoaderPid,XRE_GetIOMessageLoop(),ParentSide)   
gecko/ipc/glue/ProcessUtils_linux.cpp:258, Fuc:ProcLoaderClientGeckoInit  call  sProcLoaderLoop = MessageLoop::current()--->
gecko/toolkit/xre/nsAppRunner.cpp:4090, Fuc:XRE_mainRun  call SetWindowCreator--->
gecko/toolkit/xre/nsAppRunner.cpp:4096, Fuc:XRE_mainRun    nsCOMPtr<nsIPrefService> prefs = do_GetService('@mozilla.org/preferences-service;1', &rv)
gecko/toolkit/xre/nsAppRunner.cpp:4112, Fuc:XRE_mainRun  set of CrashReporter after xpcom Initialization,here? again?
gecko/toolkit/xre/nsAppRunner.cpp:4134, Fuc:XRE_mainRun  startupNotifier ,do_CreateInstance --
gecko/toolkit/xre/nsAppRunner.cpp:4141, Fuc:XRE_mainRun  call appStartup  (do_GetService(NS_APPSTARTUP_CONTRACTID))
gecko/toolkit/xre/nsAppRunner.cpp:4147, Fuc:XRE_mainRun  gDoMigration = true --->
gecko/toolkit/xre/nsAppRunner.cpp:4148, Fuc:XRE_mainRun  do sth about GetAppDir,GetFile(XRE_APP_DISTRIBUTION_DIR),EnableProfileMigrator,ect.
gecko/toolkit/xre/nsAppRunner.cpp:4183, Fuc:XRE_mainRun  ---Profile Migration--- infact not execu
gecko/toolkit/xre/nsAppRunner.cpp:4210, Fuc:XRE_mainRun  call mDirProvider.DoStartup()--->
gecko/toolkit/xre/nsAppRunner.cpp:4223, Fuc:XRE_mainRun  call appStartup->GetShuttingDown()-->
gecko/toolkit/xre/nsAppRunner.cpp:4233, Fuc:XRE_mainRun  mShuttingDown = false,call cmdLine = do_CreateInstance('@mozilla.org/toolkit/command-line;1')
gecko/toolkit/xre/nsAppRunner.cpp:4236, Fuc:XRE_mainRun   call rv = cmdLine->Init(gArgc, gArgv, workingDir)-->
gecko/toolkit/xre/nsAppRunner.cpp:4246, Fuc:XRE_mainRun  obsService = mozilla::services::GetObserverService(), call obsService->NotifyObservers(cmdLine, 'command-line-startup', nullptr)
gecko/toolkit/xre/nsAppRunner.cpp:4262, Fuc:XRE_mainRun    SaveStateForAppInitiatedRestart()--->
gecko/toolkit/xre/nsAppRunner.cpp:4276, Fuc:XRE_mainRun  mShuttingDown = false,call rv = appStartup->CreateHiddenWindow()-->
gecko/toolkit/xre/nsAppRunner.cpp:4307, Fuc:XRE_mainRun  call obsService =mozilla::services::GetObserverService()-->
gecko/toolkit/xre/nsAppRunner.cpp:4312, Fuc:XRE_mainRun  appStartup->DoneStartingUp()-->
gecko/toolkit/xre/nsAppRunner.cpp:4314, Fuc:XRE_mainRun   call   appStartup->GetShuttingDown(&mShuttingDown)
gecko/toolkit/xre/nsAppRunner.cpp:4319, Fuc:XRE_mainRun   mShuttingDown = false,   rv = cmdLine->Run()
gecko/toolkit/xre/nsAppRunner.cpp:4323, Fuc:XRE_mainRun   call   appStartup->GetShuttingDown(&mShuttingDown)
gecko/toolkit/xre/nsAppRunner.cpp:4346, Fuc:XRE_mainRun  not get here?
gecko/toolkit/xre/nsAppRunner.cpp:4355, Fuc:XRE_mainRun  appStartup->Run()-->
gecko/ipc/glue/ProcessUtils_linux.cpp:321, Fuc:ProcLoaderLoad  ----------------------------------
gecko/ipc/glue/ProcessUtils_linux.cpp:627, Fuc:ProcLoaderServiceRun  call BackgroundHangMonitor::Allow()--->
gecko/ipc/glue/ProcessUtils_linux.cpp:629, Fuc:ProcLoaderServiceRun  call XRE_DeinitCommandLine--->
gecko/ipc/glue/ProcessUtils_linux.cpp:636, Fuc:ProcLoaderServiceRun  call task->DoWork()--->
gecko/ipc/glue/ProcessUtils_linux.cpp:449, Fuc:DoWork  ----------------------------------
gecko/ipc/glue/ProcessUtils_linux.cpp:465, Fuc:DoWork    call SetCurrentProcessPrivileges(mPrivs)--->
gecko/ipc/glue/ProcessUtils_linux.cpp:469, Fuc:DoWork   Start Nuwa (main function),call int ret = content_process_main(argc, argv)--->
gecko/toolkit/xre/nsAppRunner.cpp:4580, Fuc:XRE_InitCommandLine  ----------------------------------
gecko/toolkit/xre/nsAppRunner.cpp:4592, Fuc:XRE_InitCommandLine  XRE_GetBinaryPath(aArgv:/system/b2g/plugin-container)--->
gecko/toolkit/xre/nsAppRunner.cpp:4649, Fuc:XRE_InitCommandLine  mozilla::Omnijar::Init(greOmni, appOmni)-->
gecko/ipc/glue/ProcessChild.cpp:46, Fuc:ProcessChild  >>>>>>>>>>>>>>>>>>>>>>>>>>>st.func
gecko/ipc/glue/ProcessUtils_linux.cpp:273, Fuc:ProcLoaderClientDeinit  ----------------------------------

 

 

 

 

 

 

 

物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<think>嗯,用户的问题是关于如何解决Firefox启动时出现的警告,特别是涉及dbus-launch未找到以及GLib警告无法创建DBus代理的问题。我需要先理解这些错误的原因,然后找出解决方法。 首先,根据用户提供的引用[1]和[3],类似的问题通常与DBus服务或X11转发配置有关。比如引用[1]中提到LIBDBUSMENU-GLIB警告,可能是因为无法连接到会话总线。引用[3]则指出图形界面程序需要Xmanager处理X11转发,或者需要正确配置SSH隧道。不过用户现在是在本地环境运行Firefox,可能不是X11转发的问题,而是缺少必要的DBus组件。 接下来,用户提到的错误是“dbus-launch not found”和GLib警告。这通常意味着系统没有安装dbus-launch工具,或者DBus服务没有正确启动。在Linux系统中,dbus-launch属于dbus-x11或dbus-user-session包。例如,在Ubuntu/Debian上,可能需要安装这些包。因此,第一步应该是检查这些软件包是否已安装,如果没有,就安装它们。 另外,引用[2]提到卸载Python可能导致系统组件损坏,但用户的问题可能不是卸载Python引起的,而是单纯的缺少依赖包。不过需要注意,如果用户之前误删除了某些依赖,可能需要修复包管理器状态,比如使用apt --fix-broken install。 可能的解决步骤包括: 1. 安装dbus-x11和dbus-user-session包。 2. 确保DBus服务已启动并运行。 3. 在启动Firefox时显式调用dbus-launch。 4. 检查环境变量,如DISPLAY是否正确设置,尤其是在远程或WSL环境下。 5. 如果问题依旧,可能需要重新安装Firefox或修复系统依赖。 另外,用户是否在使用WSL?引用[1]提到WSL下使用VcXsrv启动Chromium的问题,类似地,Firefox在WSL中运行时可能需要X服务器配置,并正确导出DISPLAY变量。如果用户是在WSL中,可能需要先启动X服务器,并设置export DISPLAY=:0,然后再运行Firefox。同时,安装必要的图形库和DBus组件。 总结解决方案的步骤: 1. 安装缺失的DBus相关包。 2. 确保DBus服务运行。 3. 配置X服务器(如适用)。 4. 启动Firefox时使用dbus-launch。 5. 检查环境变量和依赖项。</think>### 分步解决方案 **问题分析**: Firefox启动时出现`dbus-launch not found`和GLib警告,通常是由于DBus服务未正确配置或相关依赖缺失导致。DBus是Linux系统中用于进程间通信的核心服务,Firefox等图形界面程序依赖DBus实现功能模块交互[^1][^3]。 --- ### 步骤1:安装DBus相关依赖 1. **更新软件包列表** ```bash sudo apt update ``` 2. **安装`dbus-x11`和`dbus-user-session`** ```bash sudo apt install dbus-x11 dbus-user-session ``` 3. **验证安装** 运行以下命令检查`dbus-launch`是否可用: ```bash which dbus-launch ``` 正常应返回路径:`/usr/bin/dbus-launch` --- ### 步骤2:启动DBus服务 1. **手动启动DBus会话** 对于临时测试,可通过以下命令启动DBus环境: ```bash eval $(dbus-launch) ``` 2. **永久配置(推荐)** 确保系统服务已启用DBus: ```bash sudo systemctl enable dbus sudo systemctl start dbus ``` --- ### 步骤3:修复Firefox启动命令 通过`dbus-launch`显式启动Firefox: ```bash dbus-launch firefox ``` 若需以管理员权限运行: ```bash dbus-launch sudo firefox ``` --- ### 步骤4:检查X11转发配置(仅限远程/WSL环境) 若在**WSL或SSH远程连接**中使用,需确保: 1. X服务器(如VcXsrv)已正确运行[^1]。 2. 设置环境变量: ```bash export DISPLAY=:0 ``` --- ### 步骤5:修复系统依赖(可选) 若曾误删关键组件(如引用[2]所述),尝试修复依赖: ```bash sudo apt --fix-broken install sudo apt install --reinstall firefox ``` --- ### 验证解决 重新启动Firefox,观察警告是否消失: ```bash dbus-launch firefox ``` --- ### 补充说明 - **WSL图形界面问题**:若在WSL中运行,需完整配置X11转发和图形库支持。 - **系统完整性**:避免直接卸载系统关键组件(如Python),可能导致依赖断裂[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值