Die Android Q-Taste startet den Wiederherstellungsmodus
LINUX/android/bootable/bootloader/lk/app/aboot/aboot.c
LINUX/android/bootable/bootloader/lk/app/aboot/recovery.c LINUX
/android/bootable/recovery/recovery.cpp
LINUX/ android/bootable/recovery/recovery_main.cpp
LINUX/android/bootable/recovery/recovery_ui/ui.cpp
Drücken Sie die Taste, um lk zu starten, zu laden und verschiedene Image-Dateien (Boot oder Wiederherstellung) entsprechend unterschiedlichen Informationen zu laden
Artikelverzeichnis
Vorwort
Tipp: Hier können Sie den allgemeinen Inhalt hinzufügen, der in diesem Artikel aufgezeichnet werden soll:
Beispiel: Bei der Entwicklung von Android-Projekten, wenn es um OTA-Upgrades geht, werden häufig Wiederherstellungsinhalte verwendet. In diesem Artikel wird hauptsächlich der Vorgang erläutert, bei dem die Tasten gedrückt werden, um Receovry einzugeben.
Tipp: Im Folgenden finden Sie den Text dieses Artikels. Die folgenden Fälle dienen als Referenz
1. Einführung in die Wiederherstellung
Android verwendet den Wiederherstellungsmodus, um Werkseinstellungen, OTA-Upgrades, Patch-Upgrades und Firmware-Upgrades wiederherzustellen.
Das Upgrade führt im Allgemeinen das benutzerdefinierte Upgrade aus, indem das Skript META-INF/com/google/android/update-script im Upgrade-Paket ausgeführt wird. Das Skript enthält eine Reihe von UI-Steuerelementen und Dateisystembetriebsbefehlen, die das Wiederherstellungssystem erkennen kann, z als write_raw_image (FLASH-Partition schreiben), copy_dir (Verzeichnis kopieren). Das Paket wird im Allgemeinen auf die SDCARD- und CACHE-Partitionen heruntergeladen. .
2. Relevantes Dateiverzeichnis
LINUX/android/bootable/bootloader/lk/app/aboot/aboot.c
LINUX/android/bootable/bootloader/lk/app/aboot/recovery.c
LINUX/android/bootable/recovery/recovery.cpp
LINUX/android/bootable /recovery/recovery_main.cpp
LINUX/android/bootable/recovery/recovery_ui/ui.cpp
1. Schaltfläche „Erkennen“.
Der Code lautet wie folgt (Beispiel):
unsigned char *update_cmdline(const char * cmdline)
{
........
检测系统是否从emmc启动
if (target_is_emmc_boot()) {
}
检测HOMW按键和音量按键是否按下
if (keys_get_state(KEY_VOLUMEUP) && keys_get_state(KEY_VOLUMEDOWN))
{
dprintf(ALWAYS,"dload mode key sequence detected\n");
reboot_device(EMERGENCY_DLOAD);
dprintf(CRITICAL,"Failed to reboot into dload mode\n");
boot_into_fastboot = true;
}
if (!boot_into_fastboot)
{
if (keys_get_state(KEY_HOME) || keys_get_state(KEY_VOLUMEUP))
-----当按下音量+时,记录此时进入recovery模式
boot_into_recovery = 1;
if (!boot_into_recovery &&
(keys_get_state(KEY_BACK) || keys_get_state(KEY_VOLUMEDOWN)))
boot_into_fastboot = true;
}
系统未启动,如何检测VolumeUp按键被按下?
LINUX/android/bootable/msm8952/init.c
#define TLMM_VOL_UP_BTN_GPIO_8937 38 对应引脚的GPIO
static void target_keystatus()
{
keys_init();
if(target_volume_down())
keys_post_event(KEY_VOLUMEDOWN, 1);
if(target_volume_up())
keys_post_event(KEY_VOLUMEUP, 1);
}
/* Return 1 if vol_up pressed */
int target_volume_up()
{
if(platform_is_msm8937() || platform_is_msm8917()){
vol_up_gpio = TLMM_VOL_UP_BTN_GPIO_8937;
}
/* Get status of GPIO */
status = gpio_status(vol_up_gpio);
/* Active low signal. */
return !status;
}
保存按键message
LINUX/android/bootable/bootloader/bootloader/lk/dev/keys/keys.c
static unsigned long key_bitmap[BITMAP_NUM_WORDS(MAX_KEYS)];
if (value)
bitmap_set(key_bitmap, code);
else
bitmap_clear(key_bitmap, code);
........
2. Starten Sie den Wiederherstellungsdienst
Der Code lautet wie folgt (Beispiel):
LINUX/android/bootable/recoveryAndroid.bp
cc_binary {
name: "recovery",
recovery: true,
defaults: [
"libinstall_defaults",
"librecovery_defaults",
],
srcs: [
"recovery_main.cpp",
],
LINUX/android/bootable/recovery/recovery_main.cpp
int main(int argc, char** argv) {
auto ret = fastboot ? StartFastboot(device, args) : start_recovery(device, args);
}
LINUX/android/bootable/recovery/recovery.cpp
recover界面显示列表信息
Device::BuiltinAction start_recovery(Device* device, const std::vector<std::string>& args) {
static constexpr struct option OPTIONS[] = {
{
"fastboot", no_argument, nullptr, 0 },
{
"fsck_unshare_blocks", no_argument, nullptr, 0 },
{
"just_exit", no_argument, nullptr, 'x' },
{
"locale", required_argument, nullptr, 0 },
{
"prompt_and_wipe_data", no_argument, nullptr, 0 },
{
"reason", required_argument, nullptr, 0 },
{
"rescue", no_argument, nullptr, 0 },
{
"retry_count", required_argument, nullptr, 0 },
{
"security", no_argument, nullptr, 0 },
{
"show_text", no_argument, nullptr, 't' },
{
"shutdown_after", no_argument, nullptr, 0 },
{
"sideload", no_argument, nullptr, 0 },
{
"sideload_auto_reboot", no_argument, nullptr, 0 },
{
"update_package", required_argument, nullptr, 0 },
{
"wipe_ab", no_argument, nullptr, 0 },
{
"wipe_cache", no_argument, nullptr, 0 },
{
"wipe_data", no_argument, nullptr, 0 },
{
"wipe_package_size", required_argument, nullptr, 0 },
{
nullptr, 0, nullptr, 0 },
};
USER版本无法通过按键进入Recovery模式
if (is_ro_debuggable()) {
ui->ShowText(true);
}
status = INSTALL_NONE; // No command specified
recovery模式异常,显示No Command界面
ui->SetBackground(RecoveryUI::NO_COMMAND);
status = INSTALL_NONE;
}