Android系统操作系列目录
前言
在日常开发Android程序中,我们可能碰到在程序中获取su权限,然后获取io流,执行shell命令。但是Android system/xbin 下的 su 是系统原生带的 su 程序,只给有 system 和 shell 用户使用,普通app 无法访问。
要使普通 app也能 su ,就要替换系统的 su 程序,有专门的,比如 SuperSU。或者将系统root,这样普通程序就能有权限使用。
一、怎么使用su?
常见的使用代码如下,通过以下代码能让我们提权使用shell命令,做一些更高级的指令操作。比如我要给某个USB串口授权chmod 777 /dev/ttyACM
// cmd="chmod 777 /dev/ttyACM"
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;
}
设备是否有root权限可以通过代码进行测试,此处提供检测设备是否root过的权限
/**
* 判断机器Android是否已经root,即是否获取root权限
*/
public static boolean haveRoot() {
// 通过执行测试命令来检测
int ret = execRootCmdSilent("echo test");
if (ret != -1) {
Log.i(TAG, "have root!");
return true;
} else {
Log.i(TAG, "not root!");
return false;
}
}
二、代码异常情况
上面给出的代码是在Android系统被root过,或者手动授予了su操作命令,否则代码运行会出现两种异常情况(情况由本人亲测):
-
java.io.IOException: Error running exec(). Command: [su] Working Directory: null Environment: null
在Android 6.0及以下的真机和虚拟机中会出现以上的报错异常,意思就是没有su执行环境,无法执行su命令。 -
java.io.IOException: Cannot run program “su”: error=13, Permission denied
Android 7.0及以后的Android真机和模拟器是没有Root权限的,所以执行代码会出现权限denied。
三、Android ROOT
Android系统的超级用户一般命名为root,root是系统中唯一的超级用户。root权限是指Linux的系统管理员权限,类似于Windows系统中的Administrator。
安卓root权限具有系统中所有的权限,可以访问和修改你手机中几乎所有的文件(Android系统文件及用户文件,不包括ROM),启动或停止一个进程,删除或增加用户,增加或者禁用硬件等等。
Root的优点:
- 可以备份系统。
- 使用高级的程序,例如屏幕截图、root explorer等等。
- 修改或是删除系统的内部程序。
- 可以更改apk安装到data分区或是sd卡分区中,将程序安装到SD卡中
- 手机开发人员,需要使用命令行控制设备
Root风险:
- 如果在ROOT的过程中遇到问题,可能使手机变砖(无法开机)。
- 如果不小心安装了恶意软件,可能使手机中的个人隐私信息暴露。
- 容易被病毒软件、黑客伤害
- 个别手机厂商会检测用户是否曾进行ROOT操作,这可能与保修有关。
博客书写不易,您的点赞收藏是我前进的动力,千万别忘记点赞、 收藏 ^ _ ^ !
相关链接: