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

更多相关文章

  1. Android 保存图片到图库
  2. Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存
  3. svn在linux下的使用(svn命令行)
  4. Android下使用dlopen函数动态调用.so链接库 [转]
  5. ProgressBar:自定义旋转图片
  6. android模拟器命令大全
  7. Android之adb命令
  8. Android开发中用到的命令——不常用就忘记了

随机推荐

  1. android - 5大UI设计技巧
  2. Android 八款开源 Android 游戏引擎
  3. 在Android中查看和管理sqlite数据库
  4. ImageView通过matrix实现手势缩放
  5. Unity3D -- 打包Android多个AndroidManif
  6. Android LaunchMode and StartActivityFo
  7. eclipse中android模拟器找不到的解决办法
  8. 获得Android Linux系统增删文件的权限
  9. Android中HandlerThread的使用及源码解析
  10. Android(安卓)ViewPager多页面滑动切换以