在做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

adb shell读取返回值_android代码执行adb shell终端命令(linux命令)并返回执行结果...相关推荐

  1. 获取存储过程返回值及代码中获取返回值

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  2. 获取存储过程返回值及代码中获取返回值(转)

    获取存储过程返回值及代码中获取返回值 1.OUPUT参数返回值例: 向Order表插入一条记录,返回其标识 CREATE PROCEDURE [dbo].[nb_order_insert]( @o_b ...

  3. Shell函数:Shell函数返回值、删除函数、在终端调用函数

    函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高.像其他编程语言一样,Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: f ...

  4. Shell函数返回值、删除函数、在终端调用函数

    Shell 也支持函数.Shell 函数必须先定义后使用. Shell 函数的定义格式如下: function_name () {list of commands[ return value ] } ...

  5. android 使用shell模拟触屏_Android随笔之——用shell脚本模拟用户按键、触摸操作...

    之前写过两篇关于Android中模拟用户操作的博客(其实用一篇是转载的),现在就来讲讲用shell脚本来模拟用户按键操作.本次的目标是用shell脚本打开微信并在其搜索框中搜索相关内容. 本文的模拟功 ...

  6. python怎么调用函数的返回值类型,10、Python基础之函数的调用与返回值

    一.函数参数 1.1 不定长参数 当我们定义函数时,可能需要定义一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数. 我们可以在形参前面加上一个 * ,这样这个形参就可以获取所有的实参,它将 ...

  7. java 多线程 返回值_JAVA多线程实现和应用总结:如何使用有返回值的多线程

    最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结. 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用E ...

  8. python process返回值_如何恢复传递给multiprocessing.Process的函数的返回值?

    如何恢复传递给multiprocessing.Process的函数的返回值? 在下面的示例代码中,我想恢复函数的返回值worker.我该怎么做呢?这个值存储在哪里? 示例代码: import mult ...

  9. bat获取命令返回值_全网都在找的redis字符串命令,总结在这了

    概述 redis一般用来做缓存,可能很多朋友都没有深入去学习redis的相关命令,只是涉及到安装部署而已,所以今天主要总结介绍一下redis字符串的一些命令. SET 语法:SET key value ...

最新文章

  1. 基于Mozilla Thunderbird的扩展开发(四)---修改Thunderbird源代码实现自动保存附件...
  2. 自制奇葩vb面试题,看你能对几道
  3. 卫星定位导航行业的产业链
  4. Linux 查看负载
  5. iOS获取缓存文件的大小并清除缓存
  6. [高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板
  7. 【渝粤教育】国家开放大学2018年秋季 0692-22T化工设备机械基础 参考试题
  8. [CentOS] CentOS 6 IPv6 关闭方法
  9. 无向图的邻接表表示法 及 深搜遍历DFS
  10. 正六边形网格化(Hexagonal Grids)原理与实现
  11. LayaAir Sprite 容器添加子节点
  12. php hidden属性,微信小程序关于组件的hidden属性的使用建议
  13. git reset/git checkout./撤销操作
  14. python视频换脸下载_FaceSwap下载|Faceswap(AI视频换脸软件) v1.0官方版(附使用教程)...
  15. VB中.frm .frx .vbp .vbw .scc有什么作用
  16. android ipv6 谷歌,Ipv6使用google服务的DNS
  17. larval中redis的用法
  18. 《Excel视频3》打印
  19. C# MVC 向页面传值方式
  20. Java菜鸟到大牛学习路线培训视频

热门文章

  1. 再获认可!天威诚信入选中国信通院“数据安全共同体计划(DSC)”
  2. java移库数据同步,库存调拨 java 实现方式
  3. 恒烁M0+系列CX32L003单片机定时器控制LED亮灭
  4. 哈工大计算机类的什么专业好,哈尔滨工业大学,一共有6个王牌专业,选哪个专业比较好...
  5. 微信信息同步 ——PC微信
  6. 【脱壳-寻找OEP】通过内存定位OEP实现脱壳
  7. 电信低月租通讯王卡-6元月租600分钟全国通话
  8. 唤醒手腕Python全栈工程师学习笔记(并发编程篇)
  9. 基于stm32的指纹锁系统
  10. 写给准备学IT和刚刚开始学IT的同学们