Android P update_engine分析 -- logging启动

Posted Give.Me.Five

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android P update_engine分析 -- logging启动相关的知识,希望对你有一定的参考价值。

UpdateEngine的启动

UpdateEngine的启动是从Update_Engine.rc启动的。

service update_engine /system/bin/update_engine --logtostderr --logtofile --foreground
    class late_start
    user root
    group root system wakelock inet cache
    writepid /dev/cpuset/system-background/tasks
    disabled

on property:ro.boot.slot_suffix=*
    enable update_engine

update_engine 默认是不启动的,当有设置属性ro.boot.slot_suffix时,就enable update_engine了,也就是启动Update_eingine了。如果使用AB分区的模式的,这个属性是一定要设置的。此属性一般也是bootloader启动时,从misc分区中读取了哪个Slot是当前可以启动的,然后设置此属性。

update_engine的log保存

  bool log_to_system = FLAGS_logtostderr;
  bool log_to_file = FLAGS_logtofile || !FLAGS_logtostderr;
  chromeos_update_engine::SetupLogging(log_to_system, log_to_file);

在update_engine.rc里,启动项里有带–logtostderr --logtofile,所以当前log_to_system 和 log_to_file 都是true。

void SetupLogging(bool log_to_system, bool log_to_file) {
  logging::LoggingSettings log_settings;
  log_settings.lock_log = logging::DONT_LOCK_LOG_FILE;
  log_settings.logging_dest = static_cast<logging::LoggingDestination>(
      (log_to_system ? logging::LOG_TO_SYSTEM_DEBUG_LOG : 0) |
      (log_to_file ? logging::LOG_TO_FILE : 0));
  log_settings.log_file = nullptr;

  string log_file;
  if (log_to_file) {
  	//先删除此目录下的log文件
    log_file = SetupLogFile(kSystemLogsRoot);
    log_settings.delete_old = logging::APPEND_TO_OLD_LOG_FILE;
    log_settings.log_file = log_file.c_str();
  }
  //调用libchrome里的logging
  logging::InitLogging(log_settings);

logging::InitLogging(log_settings) 调用的并不是android 自带的logger机制里的方法,而是libchrome里的logging。因为本身update_engine 这个工程就是最早用于chrome里的,后面才移植到Android里来升级AB分区的。这里说明下保存log的文件路径kSystemLogsRoot为/data/misc/update_engine_log。

inline bool InitLogging(const LoggingSettings& settings) {
  return BaseInitLoggingImpl(settings);
}
bool BaseInitLoggingImpl(const LoggingSettings& settings) {
  ...
  //将log路径赋值给g_log_file_name
  *g_log_file_name = settings.log_file;
  //初始化log文件句柄
  return InitializeLogFileHandle();
}  
bool InitializeLogFileHandle() {
	...
	g_log_file = fopen(g_log_file_name->c_str(), "a");
	...

在InitLogging的函数的系列调用 中,最后通过fopen的方式打开g_log_file_name, 后面再通过追加写入的方式,去保存update的log。

UpdateEngineDaemon的启动

在Main.cc的main函数里主要做了两个事,一个是启动logging, 第二个就是运行update_engine_daemon。

int main(int argc, char** argv) {
	...
	//初始化
	chromeos_update_engine::Terminator::Init();
  	brillo::FlagHelper::Init(argc, argv, "Chromium OS Update Engine");
  	//logging 启动
  	bool log_to_system = FLAGS_logtostderr;
  	bool log_to_file = FLAGS_logtofile || !FLAGS_logtostderr;
  	chromeos_update_engine::SetupLogging(log_to_system, log_to_file);
  	...
  	//运行update_engine_daemon
	chromeos_update_engine::UpdateEngineDaemon update_engine_daemon;
  	int exit_code = update_engine_daemon.Run();

下一篇我们继续来分析update_engine_daemon的运行。

以上是关于Android P update_engine分析 -- logging启动的主要内容,如果未能解决你的问题,请参考以下文章

Android P update_engine分析--升级核心DeltaPerformer的分析

Android P update_engine分析--升级核心DeltaPerformer的分析

Android P update_engine分析--升级核心DeltaPerformer的分析

Android P update_engine分析--升级核心DeltaPerformer的分析

Android P update_engine分析-- PostinstallRunnerAction的工作

Android P update_engine分析-- PostinstallRunnerAction的工作