您的位置:首页 > 运维架构 > Shell

Android Java执行Shell命令

2017-02-16 10:14 579 查看
主要介绍Android或Java应用中如何以默认用户或root用户执行Shell命令,ShellUtils的API介绍、使用及使用场景(如静默安装和卸载、修改hosts文件、拷贝文件)。使用纯Java实现,所以对Java程序同样适用。

 

很多朋友在使用TrineaAndroidCommon@Github中的ShellUtils工具类了,那就大致介绍下他的功能吧。

 

1、API介绍

以下是ShellUtils中最终执行命令的方法execCommand

Java

1public CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg)
其中commands表示依次执行的shell命令数组isRoot表示是否以su用户执行(需要手机已经root)isNeedResultMsg表示是否存储命令执行成功及失败后的信息。Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

*
result of command

*

*
@author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16

*/

public
static
class
CommandResult
{

 

/**
result of command **/

public
int    result;

/**
success message of command result **/

public
String
successMsg;

/**
error message of command result **/

public
String
errorMsg;

 

public
CommandResult(int
result){

this.result
=
result;

}

 

public
CommandResult(int
result,
String
successMsg,
String
errorMsg){

this.result
=
result;

this.successMsg
=
successMsg;

this.errorMsg
=
errorMsg;

}

}

CommandResult 为返回的数据结构,如下其中result表示执行的结果,根据linux命令执行规则,0表示成功,其他为相应错误码。

successMsg存储执行成功后的输出信息,errorMsg存储执行失败后的输出信息。

如果isNeedResultMsg为false,successMsg和errorMsg会始终为空,而result依然为正常结果。

 

其他接口,Shell命令支持执行String(单个命令), List(多个命令),String[](多个命令)

见:ShellUtils.java#Api Guide

 

2、使用

(1)引入公共库

引入TrineaAndroidCommon@Github(欢迎star和fork^_^)作为你项目的library(如何拉取代码及添加公共库)。

 

(2) 调用上面介绍的execCommand函数,

注意有些命令可能运行时间较长,所以最好在线程中执行execCommand

 

3、使用场景

以目前自己的几个场景举下例子

(1) 静默安装和卸载

这个很多朋友已经用过了Android root权限静默安装或卸载应用,原理是执行命令:pm install apkFilePath及pm uninstall packageName

具体代码可见:PackageUtils installSilent(Context context, String filePath, String
pmParams)

 

(2) 获取系统设置->存储->首选安装位置

原理是执行命令:pm get-install-location

具体代码可见:PackageUtils getInstallLocation()

 

(3) Android修改hosts文件

原理是执行命令:

mount -o rw,remount /system

echo “127.0.0.1 localhost” > /etc/hosts

echo “185.31.17.184 github.global.ssl.fastly.net” >> /etc/hosts

chmod 644 /etc/hosts

代码如下:

Java

123456List<String> commnandList = new ArrayList<String>();commnandList.add("mount -o rw,remount /system");commnandList.add("echo \"127.0.0.1 localhost\" > /etc/hosts");commnandList.add("echo \"185.31.17.184 github.global.ssl.fastly.net\" >> /etc/hosts");commnandList.add("chmod 644 /etc/hosts");CommandResult result = ShellUtils.execCommand(commnandList, true);
用echo命令改hosts文件很牛逼哦,不用重启可以直接生效的哦。 (4) 拷贝文件原理是执行命令:mount -o rw,remount /systemcp /mnt/sdcard/xx.apk /system/app/代码如下:Java

1

2

String[]
commands
=
new
String[]
{
"mount
-o rw,remount /system",
"cp
/mnt/sdcard/xx.apk /system/app/"
};

CommandResult
result
=
ShellUtils.execCommand(commands,
true);

注意一般拷贝文件是不需要root的,上面用root是因为需要拷贝到/system/app/下面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  root Shell命令