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

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

分析过程如下:

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


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


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

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


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

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

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


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


由于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命令查看


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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值