Android O system函数执行reboot命令失败

最近在折腾Android O fastmmi中一个bug:在重启选项中,选择“关机”,机器并没有执行关机操作

分析过程如下:

LINUX/android/vendor/qcom/proprietary/fastmmi/mmi/func_map.cpp

Android O system函数执行reboot命令失败_第1张图片

发现在process_reboot()函数中,的确执行了system("reboot -p"),但是通过WEXITSTATUS跟踪代码发现,这个命令执行失败了(因为其返回值为127)

Android O system函数执行reboot命令失败_第2张图片

但是发现如果使用system("/system/bin/reboot -p")却可以正常执行关机操作,并system()函数返回0

而且如果使用自己按照其原理实现的odm_system("reboot -p")也可以执行成功,机器关机,注意:使用的是/system/bin/sh哦

Android O system函数执行reboot命令失败_第3张图片

还发现如果将reboot换成其他命令,比如ls命令(/vendor/bin/目录下存在的命令),system("ls")也可以正常执行,一时让人非常困惑

于是带着好奇心找到system函数源码

LINUX/android/bionic/libc/upstream-openbsd/lib/libc/stdlib/system.c

Android O system函数执行reboot命令失败_第4张图片

通过async_safe_format_log()跟踪代码发现,_PATH_BSHELL变量的值居然是/vendor/bin/sh,而不是自己原先认为的/system/bin/sh,追踪这个宏定义发现

Android O system函数执行reboot命令失败_第5张图片

由于Android O高通引入了新的分区vendor,导致_PATH_BSHELL变量的值是/vendor/bin/sh,而不是/system/bin/sh,但是/vendor/bin/目录下不存在reboot这个可执行程序,reboot可执行程序只存在于/system/bin目录下,所以导致system()函数执行失败。

一个小插曲:adb shell进入的shell为/system/bin/sh,这个可以通过env命令查看

Android O system函数执行reboot命令失败_第6张图片

所以使用adb shell reboot -p也可以正常执行关机操作哦

你可能感兴趣的:(Android,Experience)