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