Android上执行shell命令的总结

Android提供了两种执行shell命令的方法。

1.Runtime.getRuntime().exec(cmds)

2.ProcessBuilder(cmds)

两种方法背后的逻辑相同。都是创建一个新的进程,执行shell命令。本文以第一种方法为例。代码如下:

public class RuntimeExcUtil {public static int run(String[] fCmds){int tCode=0;mLogger.i("APP_SHELL", "start run");try {Process tProcess = Runtime.getRuntime().exec(fCmds);printError(tProcess);tCode = tProcess.waitFor();mLogger.i("APP_SHELL", "Code Result= "+tCode);} catch (Exception e) {mLogger.e("APP_SHELL", "run Failed, Error Message :"+e.getMessage());}return tCode;}public static int runWithSu(String[] fCmds){int tCode=0;mLogger.i("APP_SHELL", "start run");try {Process tProcess = Runtime.getRuntime().exec("su");runShellScript(tProcess,fCmds);printError(tProcess);tCode = tProcess.waitFor();mLogger.i("APP_SHELL", "Code Result= "+tCode);} catch (Exception e) {mLogger.e("APP_SHELL", "runWithSu Failed, Error Message :"+e.getMessage());}return tCode;}private static void printError(Process fProcess){StringBuilder output = new StringBuilder();String line;try(BufferedReader tReader = new BufferedReader(new InputStreamReader(fProcess.getErrorStream()))) {while ((line = tReader.readLine()) != null) {output.append(line).append("\n");}if (output.toString().length()>0){mLogger.e("APP_SHELL", "Error Output = "+output);}}catch (Exception e){mLogger.e("APP_SHELL", "Print Error Output Failed, Error Message :"+e.getMessage());}}private static void runShellScript(Process fProcess, String[] fCmds){try(DataOutputStream outputStream = new DataOutputStream(fProcess.getOutputStream())) {for (String tCmd :fCmds) {Log.i("APP_SHELL", "Cmd :" + tCmd);outputStream.writeBytes(tCmd + "\n");}outputStream.flush();outputStream.writeBytes("exit\n");outputStream.flush();} catch (Exception e) {Log.e("APP_SHELL", "Run Shell Script Failed, Error Message :"+e.getMessage());}}
}

测试代码如下:

//case 1
RuntimeExcUtil.runWithSu(new String[]{"cp -a -p "+tJavaCrashLogFolderPath+" "+ tCollectFolder});
//case 2
RuntimeExcUtil.runWithSu(new String[]{"cd "+tJavaCrashLogFolderPath,"rm -f crash*"});
//case 3
RuntimeExcUtil.run(new String[]{"cd /sdcard/Download"});
//case 4
RuntimeExcUtil.run(new String[]{"cd", "/sdcard/Download"});
//case 5
RuntimeExcUtil.run(new String[]{"cp -a -p "+tJavaCrashLogFolderPath+" "+ tCollectFolder});
//case 6
RuntimeExcUtil.run(new String[]{"cp", "-a", "-p", tJavaCrashLogFolderPath,tCollectFolder});
//case 7
RuntimeExcUtil.run(new String[]{"rm -f /sdcard/crash/crash*"});
//case 8
RuntimeExcUtil.run(new String[]{"rm", "-f", "/sdcard/crash/crash*"});
Case结果分析
1

结果:执行成功。

原因:创建su窗口,并获取上下文,将后续指令写入

DataOutputStream。不会有权限问题,不会有指令解析问题。

2

结果:同1

原因:同1

3

结果:执行失败。返回Cannot run program "cd /sdcard/Download": error=2, No such file or directory。

原因:将整个命令字符串作为一个参数传递给 RuntimeExcUtil.run() 方法。这个方法可能会将整个字符串解释为一个可执行程序的名称,而不是将其分解为命令和参数。因此,它会尝试去找一个名为 cp -a -p /sdcard/crash/ /destination_folder 的可执行程序。若找不到,则返回No such file or directory。

4

结果:执行失败。返回Cannot run program "cd": error=13, Permission denied。

原因:“cd”是用来改变当前工作目录的 shell 命令,并不是一个可执行程序。所以会得到 "Permission denied" 的错误,这是因为 Android 不允许直接执行这种命令。

5

结果:同3

原因:同3

6

结果:执行成功

原因:将指令与参数分开,方便解析。

7

结果:同3

原因:同3

8

结果:执行成功

原因:将指令与参数分开,方便解析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2060. 奶牛选美

2060. 奶牛选美 - AcWing题库 思路&#xff1a;只有两个连通块&#xff0c;先标记一个连通块。之后将这个连通块全部放入队列跑一个bfs即可。 #include <bits/stdc.h> using namespace std; const int N 121; int fx[] {0, 0, 1, -1}; int fy[] {1, -1, 0, 0}; bool…

在线随机密码生成器源码

纯HTML&#xff0c;该去的已去掉&#xff0c;该简化的简化&#xff0c;最高支持32位混合随机密码生成。 源码下载&#xff1a;在线随机密码生成器源码

算法之美:二叉堆原理剖析及堆应用案例讲解及实现

什么是堆 堆(Heap)是计算机科学中一类特殊的数据结构&#xff0c;通常是一个可以被看做一棵完全二叉树的数组对象。 完全二叉树 只有最下面两层节点的度可以小于2&#xff0c;并且最下层的叶节点集中在靠左连续的边界&#xff0c;只允许最后一层有空缺结点且空缺在右边&#x…

《科技创新与应用》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答&#xff1a; 问&#xff1a;《科技创新与应用》是什么级别期刊&#xff1f; 答&#xff1a;省级&#xff1b;主管单位&#xff1a;黑龙江省科学技术协会&#xff1b;主办单位&#xff1a;黑龙江省创联文化传媒有限公司 问&#xff1a;《科技创新与应用》是核心期刊…

如何在OceanBase的OCP多节点上获取日志

背景 在使用OceanBase的OCP的过程中&#xff0c;因各种因素&#xff0c;我们可能需要对当前页面进行跟踪。在单一ocp节点环境下&#xff0c;我们自然可以直接在该节点上查找所需的日志。然而&#xff0c;当我们的环境中部署了多个ocp节点时&#xff0c;在排查问题时就会变得相…

google浏览器网站不安全与网站的连接不安全怎么办?

使用google谷歌浏览器访问某些网站打开时google谷歌浏览器提示网站不安全,与网站的连接不安全,您之所以会看到此警告,是因为该网站不支持https造成的怎么办? 目录 1、打开谷歌google浏览器点击右上角【┇】找到设置

【Canvas与艺术】五角星光芒四射的效果展示

【关键点】 三一渐变式光芒的实现。 【效果】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>光芒四射</title><st…

【Vue】响应式系统和依赖收集跟踪原理

为什么要依赖收集&#xff1f; 先举个栗子&#x1f330; 我们现在有这么一个 Vue 对象。 new Vue({template: <div><span>{{text1}}</span> <span>{{text2}}</span> <div>,data: {text1: text1,text2: text2,text3: text3} });然后我们…

当构造器参数较多时考虑用生成器

重叠构造器模式 ——不能很好地扩展: public class Person {private String name; // 必填private int age; // 必填private String address; // 可选private String email; // 可选private String phone; // 可选private String occupation; // 可选// 无参构造…

使用AOP实现打印日志

首先创建annotation.SystemLog类&#xff1a; package com.gjh.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;Target(ElementType.METHOD…

聊聊websocket opcode中的text / binary模式

webscoket 协议中有一个非常有意思的设计&#xff0c;在opcode内&#xff0c;对帧类型进行了区分&#xff1a;文本和二进制流。但这个区分并没有规定文本类型有类似于http协议中空行表示结束的说法&#xff0c;而且长度也是由帧头记录&#xff0c;也就是说&#xff0c;单纯从协…

你如何创建一个JUnit测试类,并编写一个基本的测试方法?在JUnit中,你如何设置和清理测试环境?

你如何创建一个JUnit测试类&#xff0c;并编写一个基本的测试方法&#xff1f; 创建一个JUnit测试类并编写一个基本的测试方法涉及以下几个步骤&#xff1a; 添加JUnit依赖&#xff1a; 首先&#xff0c;确保你的项目中已经包含了JUnit的依赖。如果你使用的是Maven或Gradle等构…

Polar靶场web(三)

期待得到某一件事物的时候&#xff0c;才是最美好的。 签到 发现不能提交&#xff0c;看一下f12 发现提交按钮被禁用了&#xff0c;且最大输入9个字符&#xff0c;我们可以改一下。 现随便提交一个发现要提交ilovejijcxy session文件包含 发现有文件包含&#xff0c;那先包含…

2.java openCV4.x 入门-hello OpenCV

专栏简介 &#x1f492;个人主页 &#x1f4f0;专栏目录 点击上方查看更多内容 &#x1f4d6;心灵鸡汤&#x1f4d6;我们唯一拥有的就是今天&#xff0c;唯一能把握的也是今天 &#x1f9ed;文章导航&#x1f9ed; ⬆️ 1.环境搭建 ⬇️ 3.Mat之构造函数与数据类型 hell…

【MySQL】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

[Linux]基础IO(上)--理解文件系统调用、文件描述符、万物皆文件

一、文件的理解 每种语言都有进行文件操作的函数接口&#xff0c;例如C语言的fopen、fwrite、fprintf等等&#xff0c;但是进行文件操作的前提是代码已经跑起来&#xff0c;因为文件的打开与关闭要通过CPU来运行程序代码&#xff0c;所以打开文件的本质是进程打开文件&#xff…

iMazing2024功能强大的iPhone和iPad管理工具

iMazing是一款功能强大的iPhone和iPad管理工具&#xff0c;确实可以作为iTunes的替代品进行数据备份。以下是一些关于iMazing的主要特点和功能&#xff1a; 设备备份&#xff1a;iMazing可以备份iOS设备上的所有数据&#xff0c;包括照片、视频、音乐、应用程序等。与iTunes相比…

使用uni-app开发微信小程序并实现页面间的跳转

一、下载需要的开发工具 HBuilderX 微信开发者工具 HBuilderX HBuilderX-高效极客技巧 (dcloud.io) 微信开发者工具 下载 / 开发版更新日志 (qq.com) 二、新建项目 通过vue-cli命令行创建项目 参考&#xff1a; uni-app官网 (dcloud.net.cn) 2.1全局安装 vue-cli npm i…

C++经典面试题目(十一)

1. final和override关键字 在C中&#xff0c;final 和 override 是两个用于类继承和成员函数重写的关键字&#xff0c;它们主要在面向对象编程的上下文中使用&#xff0c;以增强代码的可读性和安全性。 1. final 关键字 final 关键字主要有两种用法&#xff1a; 用于类&…

最小公约数 最大公倍数 同余原理

1.最小公约数 int gcd(int a,int b) {return b0 ? a : gcd(b,a%b); }int main() {int x,y;cin>>x>>y;cout<<gcd(x,y);return 0; } 每一次调用gcd传进去的两个值&#xff0c;若b为零则输出a&#xff0c;否则再次调用gcd&#xff0c;传入b&#xff0c;a%b 2.最…