一个字符串引起的大bug
2016-07-27 11:16
260 查看
最近我们在做一款给芯片升级的客户端,升级完成后需要重启,因为升级后芯片需要掉一次电才能正常使用。开发写好代码后就转到我这边测试了。具体的测试过程不说了,直接说这次遇到的问题:重启后芯片不能正常使用。
为了排查问题我们在升级完成后不使用程序触发重启,而是手动重启,发现芯片可以正常工作,那就说明是我们重启的方法不对,看了下开发的代码使用的重启方式是PowerManager中的reboot方式。我们准备换一种重启方式,使用命令,但是我印象中5.0之后应用层是拿不到su权限的,于是我就看了下之前写的一个测试工具中的重启方式,发现果然是拿不到su权限的。于是我们准备使用另一种方式Intent,等等,这种方式最终还是会走到PowerMnagerService中,和PM的方式一样。怎么办?到此我们已经无计可施了,我们再次回到原点,认真看了下开发的代码。
((PowerManager)mContext.getSystemService(Context.POWER_SERVICE)).reboot(“111”)
有亮点是不是? “111”是什么鬼? 我们看了下源码,源码中是这样解释的,reason参数是传递给内核的,让内核知道我们要重启到那种模式,或者直接为空也行。
/**
789 * Reboot the device. Will not return if the reboot is successful.
790 *
791 * Requires the {@link android.Manifest.permission#REBOOT} permission.
792 *
793 *
794 * @param reason code to pass to the kernel (e.g., “recovery”) to
795 * request special boot modes, or null.
796 */
797 public void reboot(String reason) {
798 try {
799 mService.reboot(false, reason, true);
800 } catch (RemoteException e) {
801 }
802 }
难道就是因为参数传递的不正确导致的,为了证明这点,我们再次进行了升级,并在升级后使用adb reboot 111 来重启,果然,重启完成后芯片不能正常工作,到此原因已经找到了。
到底reason应该传什么呢? 我们通常知道的reboot 后面可以跟的命令有bootloader、recovery以及persist.sys.safemode(安全模式),显然这三种都不是我们想要的,于是我们又进行了一次升级,然后使用adb reboot来重启,这次芯片可以正常工作。我们把代码中的“111”给移除了不传递任何参数,然后试了一次,芯片也可以正常工作。问题到这算是解决了,但是为什么传递“111”我们的芯片不会掉电呢,毕竟系统确实重启了,不解…….
为了排查问题我们在升级完成后不使用程序触发重启,而是手动重启,发现芯片可以正常工作,那就说明是我们重启的方法不对,看了下开发的代码使用的重启方式是PowerManager中的reboot方式。我们准备换一种重启方式,使用命令,但是我印象中5.0之后应用层是拿不到su权限的,于是我就看了下之前写的一个测试工具中的重启方式,发现果然是拿不到su权限的。于是我们准备使用另一种方式Intent,等等,这种方式最终还是会走到PowerMnagerService中,和PM的方式一样。怎么办?到此我们已经无计可施了,我们再次回到原点,认真看了下开发的代码。
((PowerManager)mContext.getSystemService(Context.POWER_SERVICE)).reboot(“111”)
有亮点是不是? “111”是什么鬼? 我们看了下源码,源码中是这样解释的,reason参数是传递给内核的,让内核知道我们要重启到那种模式,或者直接为空也行。
/**
789 * Reboot the device. Will not return if the reboot is successful.
790 *
791 * Requires the {@link android.Manifest.permission#REBOOT} permission.
792 *
793 *
794 * @param reason code to pass to the kernel (e.g., “recovery”) to
795 * request special boot modes, or null.
796 */
797 public void reboot(String reason) {
798 try {
799 mService.reboot(false, reason, true);
800 } catch (RemoteException e) {
801 }
802 }
难道就是因为参数传递的不正确导致的,为了证明这点,我们再次进行了升级,并在升级后使用adb reboot 111 来重启,果然,重启完成后芯片不能正常工作,到此原因已经找到了。
到底reason应该传什么呢? 我们通常知道的reboot 后面可以跟的命令有bootloader、recovery以及persist.sys.safemode(安全模式),显然这三种都不是我们想要的,于是我们又进行了一次升级,然后使用adb reboot来重启,这次芯片可以正常工作。我们把代码中的“111”给移除了不传递任何参数,然后试了一次,芯片也可以正常工作。问题到这算是解决了,但是为什么传递“111”我们的芯片不会掉电呢,毕竟系统确实重启了,不解…….
相关文章推荐
- Android之使用Http协议实现文件上传功能
- SourceProvider.getJniDirectories
- Trac 中文语言安装
- 软件 bug 的生命周期
- mysql集群之MMM简单搭建
- 通晓网络测试常用命令
- Firefox2中输入框丢失光标bug的解决方法
- for命令的一些bug分析
- 修正IE下使用CSS属性overflow的bug
- 解决IE6 3像素Bug的css写法
- Nodejs学习笔记之测试驱动
- 利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)
- 跟我学习JScript的Bug与内存管理
- JS注释所产生的bug 即使注释也会执行
- IE本地存储userdata的一个bug说明
- IE在DOM操作有表单控件时的bug
- ie 处理 gif动画 的onload 事件的一个 bug
- IIS6 安全性存在超级BUG,快来看
- 可以测试javascript运行效果的代码
- Android生存指南之:解Bug策略与思路问题的详解