安卓recovery流程分析(编译、界面、图片)

安卓recovery流程分析(编译、界面、图片)

recovery 界面操作

代码中的GetMenuItems()函数返回了MENU_ITEMS数组的地址,即菜单项的名称数组的地址。具体经过switch和case进行具体的操作

// Return REBOOT, SHUTDOWN, or REBOOT_BOOTLOADER. Returning NO_ACTION

// means to take the default, which is to reboot or shutdown depending

// on if the --shutdown_after flag was passed to recovery.

static Device::BuiltinAction

prompt_and_wait(Device* device, int status) {

for (;;) {

finish_recovery(NULL);

switch (status) {

case INSTALL_SUCCESS:

case INSTALL_NONE:

ui->SetBackground(RecoveryUI::NO_COMMAND);

break;

case INSTALL_ERROR:

case INSTALL_CORRUPT:

ui->SetBackground(RecoveryUI::ERROR);

break;

}

ui->SetProgressType(RecoveryUI::EMPTY);

int chosen_item = get_menu_selection(nullptr, device->GetMenuItems(), 0, 0, device);

// device-specific code may take some action here. It may

// return one of the core actions handled in the switch

// statement below.

Device::BuiltinAction chosen_action = device->InvokeMenuItem(chosen_item);

bool should_wipe_cache = false;

switch (chosen_action) {

case Device::NO_ACTION:

break;

case Device::REBOOT:

case Device::SHUTDOWN:

case Device::REBOOT_BOOTLOADER:

return chosen_action;

case Device::WIPE_DATA:

wipe_data(ui->IsTextVisible(), device);

if (!ui->IsTextVisible()) return Device::NO_ACTION;

break;

case Device::WIPE_CACHE:

wipe_cache(ui->IsTextVisible(), device);

if (!ui->IsTextVisible()) return Device::NO_ACTION;

break;

case Device::APPLY_ADB_SIDELOAD:

case Device::APPLY_SDCARD:

//省略代码……

break;

case Device::VIEW_RECOVERY_LOGS:

choose_recovery_file(device);

break;

case Device::RUN_GRAPHICS_TEST:

run_graphics_test(device);

break;

case Device::MOUNT_SYSTEM:

#ifdef USE_MDTP

if (is_mdtp_activated()) {

ui->Print("Mounting /system forbidden by MDTP.\n");

}

else

#endif

//省略代码……

break;

}

}

}

这段代码定义了一个函数prompt_and_wait,该函数用于提示用户选择一个操作,并等待用户的输入。

函数的参数包括一个指向Device对象的指针device和一个整数status。

函数使用一个无限循环for (;;) {}来不断执行以下操作:

调用finish_recovery(NULL)函数,完成recovery操作的最后步骤。

根据status的值,设置recovery界面的背景和进度条的类型。

如果status的值是INSTALL_SUCCESS或INSTALL_NONE,则将背景设置为RecoveryUI::NO_COMMAND;如果status的值是INSTALL_ERROR或INSTALL_CORRUPT,则将背景设置为RecoveryUI::ERROR。

将进度条的类型设置为RecoveryUI::EMPTY,表示没有进度信息。

调用get_menu_selection函数,显示菜单并等待用户选择。该函数的参数包括一个空指针nullptr,表示不显示标题;device->GetMenuItems(),表示获取设备的菜单项;0,表示不显示菜单的起始索引;0,表示不显示菜单的结束索引;device,表示设备对象。

函数最终返回用户选择的操作,可以是Device::REBOOT、Device::SHUTDOWN或Device::REBOOT_BOOTLOADER。如果用户没有选择任何操作,则返回Device::NO_ACTION,表示采取默认操作,即根据--shutdown_after标志决定是重启还是关机。

recovery 启动流程

参考链接

Recovery启动流程(2)---UI界面【转】-腾讯云开发者社区-腾讯云

https://www.cnblogs.com/xiaolei-kaiyuan/p/5456227.html

android-ramdisk.img分析、recovery.img&boot.img执行过程

我们知道,当我们通过按键或者应用进入recovery模式,实质是kernel后加载recovery.img,kernel起来后执行的第一个进程就是init,此进程会读入init.rc启动相应的服务。在recovery模式中,启动的服务是执行recovery可执行文件,此文件是bootable/recovery/recovery.cpp文件生成,我们就从recovery.cpp文件开始分析。

从recovery.cpp main()中可知,进入recovery后会分析/cache/recovery/command文件,根据内容来设定显示的文字语言

SetLocale函数根据locale判断所用的字体是否属于阿拉伯语系,阿拉伯语的书写习惯是从右到左,如果是阿拉伯语系的话,就设置一个标志,后面根据这个标志决定从右到左显示文字或进度条。关于显示文字的语言通过代码即可查看,这里只简单的列出语言设置的几条主线,不贴出具体的代码(太多了)。