您的位置:首页 > 移动开发 > Android开发

Android用代码操作Liunx命令进行文件的操作

2017-07-22 15:38 309 查看
最近接到一个外包,需要对 /data/data/package(下面我简称data包) 下面的文件进行处理,就是复制、粘贴到SD卡,有时还需要进行删除。起初就觉得不会这么简单,因为data包是涉及到权限的,但是因为针对的是已经root了的用户,所以刚开始也没当一回事。

开始敲码

一开始我采用了读流的方式,就是用流来把data包下面的数据写到SD卡里,结果失败了。具体错误就是没有读取data包的权限,后来去谷歌度娘上查,都没查到什么有用的信息,都是说加上权限什么的,然后我检查了好几遍,都没有问题。

一波三折

折腾了许久,我竟天真的拿来另一台测试机,以为是手机问题(汗),不过这也略有收获,怎么说呢?因为我发现在新的手机上,没法在SD卡上创建文件夹,我这下就更郁闷了,怎么这下连SD卡上都创建不了文件夹了。当时就有点懊恼,因为上一个问题折腾了这么久都还没解决,这下又有新问题,不过心想“既来之,则安之”,还是继续谷歌百度。

查了许久,得出结论:

Android自从API19之后(也就是4.4),不能直接对二级存储设备进行写入,那什么是二级存储设备呢?我们都知道,Android手机现在普遍都有内置存储卡,而二级存储就是指外置的,而前面那台手机可以操作,是因为它的版本是4.2,所以就可以写入到外置SD卡中。

这下起码一个疑惑解决了,所以阿,遇到问题还是要淡定淡定!

巧用Liunx

这下虽知道了不能在SD卡上创建文件夹的原因了,可是问题还是没有解决,怎么办呢?我突然想起Liunx下创建可不可行呢,于是我连接手机后,我打开命令窗口熟练的敲如 adb shell,然后进入到终端,再输入 su 获取到最高权限,这点一定要已经root的机子才行,不然会提示su这个命令找不到。

接着我进入到 /storage/sdcard0/ 路径下面,用mkdir命令创建了一个文件夹:

mkdir /storage/sdcard0/text01


这下就证明了用Liunx命令创建就不会受到限制,于是我就在代码中执行了以上的命令,果真有效:

try {
Runtime.getRuntime().exec("mkdir /storage/sdcard0/text01");
} catch (IOException e) {
LogUtils.e(e.getMessage());
}


再次遇坑

SD卡的问题解决了,我心想着用Liunx命令直接把data包的内容复制过去不就得了,说干就干,我过我先在终端试了一下:

具体命令:cp -r 文件/文件夹路径 目标文件夹路径


结果,真的成功了!当时那个高兴阿,原来用Liunx命令一下子就可以搞定,而且效率比流高多了。

接着我心想就是用代码照搬命令即可:

try {
Runtime.getRuntime().exec("cp -r /data/data/包名 /storage/sdcard0/text01");
} catch (IOException e) {
LogUtils.e(e.getMessage());
}


结果没报错,但是没有复制到,这下又纳闷了。

如梦初醒

接着我就纳闷了,继续谷歌百度,网上搜到的答案都是说先调用su命令,但我之前已经调用过了,只是上面没贴,也就是这样:

try {
Runtime.getRuntime().exec("su");
Runtime.getRuntime().exec("cp -r /data/data/包名 /storage/sdcard0/text01");
} catch (IOException e) {
LogUtils.e(e.getMessage());
}


就这样,结合网上和自己想法,各种尝试,还是无果,后来心想会不会是exec这个方法等于另开一个窗口,这样我的权限不就没了吗?于是获取了其返回值,也就是 Process 对象,顿然大悟,心想绝对如此!于是我用其输入流,继续续写了命令:

Process process = Runtime.getRuntime().exec("su");
String order = "cp -r /data/data/包名 /storage/sdcard0/text01";
OutputStream outputStream = process.getOutputStream();
outputStream.write(order.getBytes());
outputStream.flush();
outputStream.close();


然并卵,上网一查,原来还得获取到data包的权限,于是又加了一句获取权限的代码:

Process process = Runtime.getRuntime().exec("su");
String cmd = "chmod 777 /data\n";
String order = "cp -r /data/data/包名 /storage/sdcard0/text01";
OutputStream outputStream = process.getOutputStream();
outputStream.write(cmd.getBytes());
outputStream.write(order.getBytes());
outputStream.flush();
outputStream.close();


还是然并卵,后来我想起以前学Java时好像提及到命令行之间要加回车符,接着就给加上:

Process process = Runtime.getRuntime().exec("su");
String cmd = "chmod 777 /data\n";
String order = "cp -r /data/data/包名 /storage/sdcard0/text01";
OutputStream outputStream = process.getOutputStream();
outputStream.write(cmd.getBytes() + "\n");
outputStream.write(order.getBytes());
outputStream.flush();
outputStream.close();


嘿!这下就成功!

总结

通过以上的方法,就可以用Liunx命令对已经root的Android机进行文件的操作了。同时呢,遇到问题也要平常心对待,不要浮躁,没有问题是解决不了的,只要静下心来,问题就能逐一攻破!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息