上篇我们在update_engine启动时,分析了update_engine日志logging的启动和log文件的操作。这篇我们继续来研究update_engine_daemon的启动过程。因为updateEngineDaemon是继承brillo::Daemon的。从Daemon.Run()可以看到会调用onInit()函数。
int UpdateEngineDaemon::OnInit() {
subprocess_.Init(this);
//父类初始化
int exit_code = Daemon::OnInit();
//Binder初始化
android::BinderWrapper::Create();
binder_watcher_.Init();
//DaemonStateAndroid的初始化
DaemonStateAndroid* daemon_state_android = new DaemonStateAndroid();
daemon_state_.reset(daemon_state_android);
LOG_IF(ERROR, !daemon_state_android->Initialize())
<< "Failed to initialize system state.";
//初始化BinderUpdateEngineAndroidService
binder_service_ = new BinderUpdateEngineAndroidService{
daemon_state_android->service_delegate()};
auto binder_wrapper = android::BinderWrapper::Get();
if (!binder_wrapper->RegisterService(binder_service_->ServiceName(),
binder_service_)) {
LOG(ERROR) << "Failed to register binder service.";
}
daemon_state_->AddObserver(binder_service_.get());
//启动updater
daemon_state_->StartUpdater();
updateEngineDaemon的onInit()里大致做了三件事情:1. 初始化DaemonStateAndroid 2. 初始化BinderUpdateEngineAndroidService 3.启动startUpdater.
初始化DaemonStateAndroid
bool DaemonStateAndroid::Initialize() {
//初始化boot_control
boot_control_ = boot_control::CreateBootControl();
//创建硬件相关接口,主要以属性操作为主
hardware_ = hardware::CreateHardware();