频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
Android O system函数执行reboot命令失败
2018-04-14 09:40:43      个评论    来源:yxw0609131056的博客  
收藏   我要投稿

最近在折腾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也可以正常执行关机操作哦。

点击复制链接 与好友分享!回本站首页
上一篇:Android若干条并排RecyclerView滑动实时联动
下一篇:AndroidStudio制作个人资料界面模块以及SQLite数据库的使用
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站