android代码执行adb shell终端命令(linux命令)并返回执行结果
来源:互联网 发布:汉服配饰淘宝 编辑:程序博客网 时间:2024/06/05 16:10
在做Android开发板相关的开发需求的时候,我们有的时候需要去到Android系统的一个linux终端(adbshell)里面来执行一些命令,以便于查看部分文件内容或者修改部分文件权限等需求,通常我们可以使用Android studio自带的terminal工具运行先adb shell 命令来进行
这样不好的就是我们可能有的操作就要每次设备重启的时候都要手动的敲一遍这样的代码,十分麻烦。那么怎么才能让app启动的时候自己来运行这些命令呢?
一番查资料,终于找到了,主要是使用到了java.lang.Process这个类,通过使用Runtime.getRuntime().exec(“su”);这个方法,我们就能获得Process的一个实例,通过这个Process的实例,我们就可以获取命令终端的输入输出流来提交命令和获取命令执行结果啦。
RootCmd工具类
注意:
Runtime.getRuntime().exec("su");
这行代码只能在已经root的设备上才能运行,没有root的设备运行会抛出异常。
下面来看它的具体实现代码吧,我把它封装成了一个工具类:
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import android.util.Log;/** * Android运行linux命令 */public final class RootCmd { private static final String TAG = "RootCmd"; private static boolean mHaveRoot = false; /** * 判断机器Android是否已经root,即是否获取root权限 */ public static boolean haveRoot() { if (!mHaveRoot) { int ret = execRootCmdSilent("echo test"); // 通过执行测试命令来检测 if (ret != -1) { Log.i(TAG, "have root!"); mHaveRoot = true; } else { Log.i(TAG, "not root!"); } } else { Log.i(TAG, "mHaveRoot = true, have root!"); } return mHaveRoot; } /** * 执行命令并且输出结果 */ public static String execRootCmd(String cmd) { String result = ""; DataOutputStream dos = null; DataInputStream dis = null; try { Process p = Runtime.getRuntime().exec("su");// 经过Root处理的android系统即有su命令 dos = new DataOutputStream(p.getOutputStream()); dis = new DataInputStream(p.getInputStream()); Log.i(TAG, cmd); dos.writeBytes(cmd + "\n"); dos.flush(); dos.writeBytes("exit\n"); dos.flush(); String line = null; while ((line = dis.readLine()) != null) { Log.d("result", line); result += line; } p.waitFor(); } catch (Exception e) { e.printStackTrace(); } finally { if (dos != null) { try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } if (dis != null) { try { dis.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } /** * 执行命令但不关注结果输出 */ public static int execRootCmdSilent(String cmd) { int result = -1; DataOutputStream dos = null; try { Process p = Runtime.getRuntime().exec("su"); dos = new DataOutputStream(p.getOutputStream()); Log.i(TAG, cmd); dos.writeBytes(cmd + "\n"); dos.flush(); dos.writeBytes("exit\n"); dos.flush(); p.waitFor(); result = p.exitValue(); } catch (Exception e) { e.printStackTrace(); } finally { if (dos != null) { try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; }}
使用
在app启动的onCreate()方法中,来执行linux命令,注意命令的结尾要加\n才表示执行。
class App : Application() { override fun onCreate() { super.onCreate() //修改/dev/bus/usb/文件夹的权限,注意添加\n val commend = "chmod 777 /dev/bus/usb/ -R \n" val result = RootCmd.execRootCmd(commend) }}
结束
亲测以上内容linux的大部分的命令都可以执行,但有一部分命令却执行不了,例如给一块硬盘分区:
运行127|rk3399_firefly_box:/ # fdisk /dev/sda输出sh: fdisk: not found
不知道这是为什么,使用android studio terminal工具也是同样的结果。有知道的也请麻烦解答。
本文出自:http://blog.csdn.net/qq_27512671/article/details/78099015
阅读全文
0 0
- android代码执行adb shell终端命令(linux命令)并返回执行结果
- Linux C 执行shell命令并获取返回结果
- Android Java代码执行adb Shell命令
- Android Java代码执行adb Shell命令
- Android Java代码执行adb Shell命令
- Java执行Linux命令并返回命令结果
- Java执行Linux命令并返回命令结果
- Java执行Linux命令并返回命令结果
- Java执行Linux命令并返回命令结果
- Linux中用C语言执行shell命令并获取返回结果
- Linux C 程序执行 shell 命令并获取返回结果的方法
- 在python中执行shell命令,并以字符串形式返回命令执行结果
- linux Shell编程--获取命令执行返回结果
- C#执行CMD命令并返回结果
- java执行linux shell命令,并拿到返回值
- android 执行shell命令代码
- android apk 怎么执行adb shell命令
- android程序执行adb shell命令
- 为什么我看不懂你的代码
- 如何用一段简单的代码讲述一个悲伤的故事?
- 高效编程之欲擒故纵
- 如何用一段简单的代码讲述一个悲伤的故事?
- 学习编程道路上的入门书籍之C#篇
- android代码执行adb shell终端命令(linux命令)并返回执行结果
- 为什么你应该(从现在开始就)写博客
- 你写过的一段最厉害的代码是怎么样的?
- 微信小程序开放公测
- 为什么你应该尝试全栈
- (3)你写过的一段最魔性的代码是怎么样的?
- 如何写出杀手级简历(针对程序员)
- (2)你写过的一段最魔性的代码是怎么样的?
- 基于angularJS的前端自动化测试工具Protractor快速入门