调试重启功能 1.尝试代码块
//method oneString cmd="su-c reboot";try{   //获取系统权限   Runtime.getRuntime().exec(cmd);   //tb log   LogMonitor_log4j.logToFileF(this.getClass().getSimpleName(),"Device reboot manully!");}catch(Exception ex){   Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();   LogMonitor_log4j.logToFileF(this.getClass().getSimpleName(),"Device reboot failed!");}
出现如下异常:
百度出现的类似的问题解决方案:
其中解决方案votes最多的如下:
参照上图内容修改代码为:
//another testProcess p=Runtime.getRuntime().exec(cmd);Runtime.getRuntime().exec(String.valueOf(p.getInputStream()));

结果无效,出现同样的错误。


2.单独测试

仅单独测试:Runtime.getRuntime().exec("su");代码块时并没有问题。
 
    仅单独测试:Runtime.getRuntime().exec("su -c");代码块并没有问题。
 
仅单独测试:Runtime.getRuntime().exec("su -c reboot");不会报错,但是程序没有任何响应。-à中间间隔了一段时间。但我再次点击button触发Runtime.getRuntime().exec("su -c reboot");时,弹出了root权限管理是否授权的对话框,应该是360root的功能,选择允许授权之后,再次点击button实现重新启动。启动之后呢,打开360root管理,自己写的app权限已经被添加到了root允许中去了。

3.测试删除360root后,运行该程序


注意这里的错误,和一开始的还是有区别的,Command[su,-c,reboot],此处出现这个错误的原因是缺少root权限,执行exec(“su –c reboot”)不能成功,su是获取系统权限。再重新给device授权,使用360超级root。


4.总结

         事实上在最开始我就已经root好了手机,但是为什么会出1里边的错误呢,大家再仔细看看我的指令,“su-c reboot”在“su”和“-c”指令见得空格没有了,导致乌龙。在手机root的情况下,上面的方法是可以实现重启机器的,但是在第一次运行程序时,程序执行到“su -c reboot”时,360超级root会询问是否给予root权限,这时候要允许,那么以后程序在运行时就能够顺利重启啦。

         那么我的app要部署到另外一个device上,但是却没有达到reboot的条件,是不是会出现bug。是的。因为在进行”su“指令时,360超级root会询问是否给予权限,这时候要人工操作允许。所以要在app程序一开始执行的时候就执行exec(“su”)然程序获得root权限,这样后面就可以顺利执行reboot啦。
5.其他重启方法

方法一:

     
try {  Intent iReboot = new Intent(Intent.ACTION_REBOOT);  iReboot.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   AccActivity.this.startActivity(iReboot);}catch(Exception ex){   Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();}
测试之后报如下错误,重启不成功:
                虽然Manifest文件中加入了           
     
 但是下面是有波浪线的,意味着     
方法二:
try {   PowerManager pManager = (PowerManager) getSystemService(Context.POWER_SERVICE);   pManager.reboot("");}catch(Exception ex){   Toast.makeText(AccActivity.this,ex.getMessage(),Toast.LENGTH_LONG).show();}
测试之后报如下错误,重启不成功: 同样说我没有android.permission.REBOOT权限。
对上述两种失败的方法总结:需要在Manifest文件的manifest节点下加入android:sharedUserId=”android.uid.system“,加入之后该应用会会运行在系统进程中,这样就有权限实现重启。那么再加入android:sharedUserId=”android.uid.system“之后,在AS中run程序后会出现程序写不进调试机中去:

从查到的资料来看,解决这个问题又有两个办法(Eclipse中的解决办法):

详见:http://blog.csdn.net/vincent_czz/article/details/7199567

         A.1. 加入android:sharedUserId=”android.uid.system“

               2.修改Android.mk文件,加入LOCAL_CERTIFICATE := platform

              3. 使用mm命令来编译,生成的apk就有重启权限了

       B1. 加入android:sharedUserId=”android.uid.system“

     2.使用eclipse编译出apk文件,但是这个apk文件是不能用的

            3.用压缩软件打开apk文件,删掉META-INF目录下的CERT.SFCERT.RSA两个文件

            4.使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build\target\product\security",下面的platform.pk8platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apkoutput.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

         查阅了很多的资料,大家都是采用这种方法,提供的解决方案都是Eclipse环境下。那么在AS下加入了android:sharedUserId=”android.uid.system“之后,是否还能够用Eclipse中的两种方法解决,如何解决?AS中也有签名,但是自己签名过的app是否能够获得运行在系统进程的权限,并没有查阅到更多相关的资料。

更多相关文章

  1. Android(安卓)M PackageManagerService解析
  2. Android(安卓)获取本地音乐文件
  3. Android(安卓)Gradle版本问题
  4. Android播放在线音乐文件
  5. Android读取Txt文件
  6. Android获取打开各种文件Intent汇总
  7. 文件读写
  8. JNI在Android中的简单使用
  9. Android的权限 permission

随机推荐

  1. beagleboard 启动 android 内核
  2. 解决'keytool' is not recognized as an
  3. 蒙板引导页面
  4. Android(安卓)Studio添加so库
  5. 【Android】虚拟环绕声
  6. android取得系统高度,标题栏和状态高度
  7. Android(安卓)Studio常见问题--uses-sdk:
  8. delphi XE 5 Android(安卓)真机调试简易
  9. android 4.0 USB Camera实例(二)应用层
  10. Titanium Mobile 编写一次就可以完成Andr