Die Android Q-Taste startet den Wiederherstellungsmodus

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


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;
  }


Je suppose que tu aimes

Origine blog.csdn.net/weixin_45080805/article/details/115260997
conseillé
Classement