Android 执行 adb shell 命令
Android 执行Adb shell 命令大多需要root权限,Android自带的Runtime. getRuntime().exec()容易出错,在网上找到了一个执行adb shell命令的类
代码如下:
/**检查手机是否存在root权限,发送一些消息*/
package com.dx.superbar.util;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import android.content.Context;
public class RootContext
{
private static RootContext instance = null;
private static Object mLock = new Object();
String mShell;
OutputStream o;
Process p;
private RootContext(String cmd) throws Exception
{
this.mShell = cmd;
init();
}
public static RootContext getInstance()
{
if (instance != null)
{
return instance;
}
synchronized (mLock)
{
try
{
instance = new RootContext("su");
}
catch (Exception e)
{
while (true)
try
{
instance = new RootContext("/system/xbin/su");
}
catch (Exception e2)
{
try
{
instance = new RootContext("/system/bin/su");
}
catch (Exception e3)
{
e3.printStackTrace();
}
}
}
return instance;
}
}
private void init() throws Exception
{
if ((this.p != null) && (this.o != null))
{
this.o.flush();
this.o.close();
this.p.destroy();
}
this.p = Runtime.getRuntime().exec(this.mShell);
this.o = this.p.getOutputStream();
system("LD_LIBRARY_PATH=/vendor/lib:/system/lib ");
}
private void system(String cmd)
{
try
{
this.o.write((cmd + "\n").getBytes("ASCII"));
return;
}
catch (Exception e)
{
while (true)
try
{
init();
}
catch (Exception e1)
{
e1.printStackTrace();
}
}
}
public void runCommand(String cmd)
{
system(cmd);
}
/**
* 判断是否已经root了
* */
public static boolean hasRootAccess(Context ctx)
{
final StringBuilder res = new StringBuilder();
try
{
if (runCommandAsRoot(ctx, "exit 0", res) == 0)
return true;
}
catch (Exception e)
{
}
return false;
}
/**
* 以root的权限运行命令
* */
public static int runCommandAsRoot(Context ctx, String script,
StringBuilder res)
{
final File file = new File(ctx.getCacheDir(), "secopt.sh");
final ScriptRunner runner = new ScriptRunner(file, script, res);
runner.start();
try
{
runner.join(40000);
if (runner.isAlive())
{
runner.interrupt();
runner.join(150);
runner.destroy();
runner.join(50);
}
}
catch (InterruptedException ex)
{
}
return runner.exitcode;
}
private static final class ScriptRunner extends Thread
{
private final File file;
private final String script;
private final StringBuilder res;
public int exitcode = -1;
private Process exec;
public ScriptRunner(File file, String script, StringBuilder res)
{
this.file = file;
this.script = script;
this.res = res;
}
@Override
public void run()
{
try
{
file.createNewFile();
final String abspath = file.getAbsolutePath();
Runtime.getRuntime().exec("chmod 777 " + abspath).waitFor();
final OutputStreamWriter out = new OutputStreamWriter(
new FileOutputStream(file));
if (new File("/system/bin/sh").exists())
{
out.write("#!/system/bin/sh\n");
}
out.write(script);
if (!script.endsWith("\n"))
out.write("\n");
out.write("exit\n");
out.flush();
out.close();
exec = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(
exec.getOutputStream());
os.writeBytes(abspath);
os.flush();
os.close();
InputStreamReader r = new InputStreamReader(
exec.getInputStream());
final char buf[] = new char[1024];
int read = 0;
while ((read = r.read(buf)) != -1)
{
if (res != null)
res.append(buf, 0, read);
}
r = new InputStreamReader(exec.getErrorStream());
read = 0;
while ((read = r.read(buf)) != -1)
{
if (res != null)
res.append(buf, 0, read);
}
if (exec != null)
this.exitcode = exec.waitFor();
}
catch (InterruptedException ex)
{
if (res != null)
res.append("\nOperation timed-out");
}
catch (Exception ex)
{
if (res != null)
res.append("\n" + ex);
}
finally
{
destroy();
}
}
public synchronized void destroy()
{
if (exec != null)
exec.destroy();
exec = null;
}
}
}
Android 执行 adb shell 命令的更多相关文章
- Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息 by:授客 QQ:1033553122 1. 查看内存信息 1)查看所有内存信息 命令: dumpsys mem ...
- Android 常用adb shell 命令
原文地址http://blog.csdn.net/rain_butterfly/article/details/40894807 调试Android程序有时需要adb shell 命令,adb全称An ...
- Android 常用adb shell 命令(转)
调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用. 通过adb我们可以在Eclipse中通过DDMS来调试Androi ...
- 【Android】-- adb shell 命令探索
ADB是什么,做android开发的没有不知道的. window下执行cmd,输入adb help就会打印adb都可以做的事情,包含 adb push ..adb pull .. adb device ...
- Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
1. 查看内存信息 1)查看所有内存信息 命令: dumpsys meminfo 例: C:\Users\laiyu>adb shell shell@android:/ $ dumpsys m ...
- Android:adb shell 命令详解
安卓系统是基于Linux系统开发,也就支持常见的Linux的命令,这些命令都保存在手机“/system/bin”的目录下,通过adb shell 便可以调用这些命令. 进入“/system/bin”该 ...
- Android自动化----adb shell,appium,uiautomator2
1.区别 1,adb shell脚本的方式 不但可以在有电脑的情况下使用,通过数据线连接电脑然后adb shell命令,而且还可以打包成app,在手机的终端使用adb shell命令. 2,appiu ...
- 【原创】Android开发之ADB及ADB SHELl命令的应用
adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.adb的工作方式比 ...
- Android成长记(1)-----android环境搭建与adb shell 命令
整理一下学习android一步一步存下来的自己总结或是从网上摘抄的比较不错的文档,电脑要上交了,最舍不得的就是自己积累的这么点东西了,所以决定发布到黎梓小站,以供大家一起学习以及自己日后忘记了也有地方 ...
随机推荐
- js脚本根据身份证号获取性别、年龄、家庭地址、生日
做项目测试时需要根据身份证号获取其信息,也不想调接口,就自己在本地通过收集资料整合了一个
- HDU5804--Price List
Price List Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) Tot ...
- 关于PHP 采集类
伟大的筒子们,我们需要经常采集. 不知道大家每次采集的时候会不会烦躁,不用八爪鱼,不用PYTHON 是不是感到手无力,看到正则匹配每次匹配不对,一换采集内容就是头疼,重新拼写正则? 不要说是高手 ,就 ...
- linux下的数据库管理工具phpmyadmin安装以及文件大小限制的配置修改
1.首先需要安装mysql和apache服务.具体安装过程百度; 2.安装php环境以及对apache的扩展; sudo apt install php7.0 对于这些软件可能还需要各自进行配置,这 ...
- Reminders在电商推荐中的价值
原论文在UMAP'16.文章并没有太高深的模型,比较接地气:但其观点与结论很独到,并且在工业界具有很强的实际操作价值. 针对推荐系统的研究大多关注在挖掘用户并不知道但是却与其兴趣相关的物品.不过每个推 ...
- laravel 对查询结果的二次筛选
假设有表Scores 里面有 id,math,english等字段,现在要求按总分(数据库没有这个字段)来排序或者筛选,用having()方法就可以很方便解决这个问题. $scores = Score ...
- 解决EditText跟ScrollView滑动冲突
etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, Motion ...
- 模拟教室网络(跨VLAN,跨网段通讯)
要求: 1,跨VLAN,三个教室在不同的VLAN中,翻番至网络风暴 2,三个VLAN在三个不同的网段 3,设置访问控制列表,组织每个网段的前八个IP不可访问服务器 4,其他IP均可访问外网的服务器 操 ...
- webAPP踩坑记录
最近公司突然给我们下了一个任务 一个星期要做出一个系统网站 外加手机app 2个同事负责 web开发 我负责手机app 的开发 今天终于初级版本做完了,记录一下手机app踩过的坑与优化之路 用 ...
- cs231n --- 1:线性svm与softmax
cs231n:线性svm与softmax 参数信息: 权重 W:(D,C) 训练集 X:(N,D),标签 y:(N,1) 偏置量bias b:(C,1) N:训练样本数: D:样本Xi 的特征维度, ...