天天看点

Android 9 (P)在user模式下无法使用fastboot烧录怎么破   Android 9(P)在user模式下无法使用fastboot烧录怎么破

   Android 9(P)在user模式下无法使用fastboot烧录怎么破

Android 9 (P)开发适配指南系列博客目录:

Adnroid 9 (P) recovery升级Map of '@/cache/recovery/block.map’failed问题分析指南

Android 9 (P)版本解决VNDK library: XXX’s ABI has EXTENDING CHANGES

Android 9 (P)非SDK API限制调用开发指南

Android 9 (P)适配以太网功能开发指南

Android 9 (P)在user模式下无法使用fastboot烧录怎么破

Android 9 (P)静默安装/卸载App适配终极指南

引言

  吃着火锅唱着歌,进行着Android P(Android 9)的适配,在烧录了Android user版本正式固件以后,为了调试想通过fastboot烧录本地的userdebug版本。可是,可是突然发现fastboot怎么也烧录不了了,烧录不了了。当然不会是fastboot工具坏了,一定是Android版本做了限制。本篇将带领大伙怎么破解。

一.开干

1.1 现象

好吗,老规矩先看现场是什么,如下一直提示fastboot下载失败。当时都要怀疑人生了,想不开都不至于啊。

Z:\ssd\qcom_64\msm8953-9\out\target\product\msm8953_64>paydroidboot.exe flash  vbmeta vbmeta.img
paydroidboot build for xxx Aug 18 2018 09:40:16
target reported max download size of 534773760 bytes
sending 'vbmeta' (4096 bytes)...
OKAY [  0.025s]
writing 'vbmeta'...
FAILED (remote: unknown command)
finished. total time: 0.050s
           
Android 9 (P)在user模式下无法使用fastboot烧录怎么破   Android 9(P)在user模式下无法使用fastboot烧录怎么破

1.2 怎么解决

fastboot是用来和Android的bootloader进行相关交互的,无意中看到bootable/bootloader/lk/makefile的脚本中判断了user版本然后添加了对应的宏控制,有戏。修改一番。完美解决。

diff --git a/bootable/bootloader/lk/makefile b/bootable/bootloader/lk/makefile
index f6da064..4766244 100644
--- a/bootable/bootloader/lk/makefile
+++ b/bootable/bootloader/lk/makefile
@@ -60,9 +60,9 @@ ifeq ($(SIGNED_KERNEL),1)
   CFLAGS += -D_SIGNED_KERNEL=1
 endif
 
-ifeq ($(TARGET_BUILD_VARIANT),user)
-  CFLAGS += -DDISABLE_FASTBOOT_CMDS=1
-endif
+#ifeq ($(TARGET_BUILD_VARIANT),user)
+#  CFLAGS += -DDISABLE_FASTBOOT_CMDS=1
+#endif
 
 ifeq ($(APPEND_CMDLINE),1)
   CFLAGS += -D_APPEND_CMDLINE=1

           

1.3 为什么会这样

可以看到在bootable/bootloader/lk/app/aboot/aboot.c中有使用到了上面的宏,代码如下所示

/* register commands and variables for fastboot */
void aboot_fastboot_register_commands(void)
{
    int i;
    char hw_platform_buf[MAX_RSP_SIZE];

    struct fastboot_cmd_desc cmd_list[] = {
                        /* By default the enabled list is empty. */
                        {"", NULL},
                        /* move commands enclosed within the below ifndef to here
                         * if they need to be enabled in user build.
                         */
#ifndef DISABLE_FASTBOOT_CMDS
                        /* Register the following commands only for non-user builds */
                        {"cfgall", cmd_cfg_partition_get_all},
                        {"flash:", cmd_flash},
                        {"erase:", cmd_erase},
                        /*{"boot", cmd_boot},*/
                        /*{"continue", cmd_continue},*/
                        {"reboot", cmd_reboot},
                        {"reboot-bootloader", cmd_reboot_bootloader},
                        {"oem", cmd_oem},
                    /*  {"oem unlock", cmd_oem_unlock},
                        {"oem unlock-go", cmd_oem_unlock_go},
                        {"oem lock", cmd_oem_lock},
                        {"flashing unlock", cmd_oem_unlock},
                        {"flashing lock", cmd_oem_lock},
                        {"flashing lock_critical", cmd_flashing_lock_critical},
                        {"flashing unlock_critical", cmd_flashing_unlock_critical},
                        {"flashing get_unlock_ability", cmd_flashing_get_unlock_ability},
                                                {"oem device-info", cmd_oem_devinfo},
                        {"preflash", cmd_preflash},
                        {"oem enable-charger-screen", cmd_oem_enable_charger_screen},
                        {"oem disable-charger-screen", cmd_oem_disable_charger_screen},
                        {"oem off-mode-charge", cmd_oem_off_mode_charger},
                        {"oem select-display-panel", cmd_oem_select_display_panel},
                        {"set_active",cmd_set_active},*/
#if UNITTEST_FW_SUPPORT
                        {"oem run-tests", cmd_oem_runtests},
#endif
#endif
                        };

           

从上代码可以看出,如果定义了DISABLE_FASTBOOT_CMDS那么将导致fastboot flash的命令被禁用,导致fastboot烧录功能失效了。

写在最后

  这里得说一句,Android版本的更新对安全越来越重视了,但是对于开发者来说增加了许多的限制条件,有时候防不胜防啊。希望各位不要中招了。最后希望大家能点赞一个或者拍板一个。

继续阅读