执行“su”命令有一个前提,那就是手机被root过或者是手机里面的busybox支持“su”命令,否则会执行失败。
具体实现代码如下:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import android.util.Log;
public abstract class AExecuteAsRoot {
public static boolean canRunRootCommands() {
boolean retval = false;
Process suProcess;
try {
suProcess = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
DataInputStream osRes = new DataInputStream(suProcess.getInputStream());
if (null != os && null != osRes) {
// Getting the id of the current user to check if this is root
os.writeBytes("id\n");
os.flush();
String currUid = osRes.readLine();
boolean exitSu = false;
if (null == currUid) {
retval = false;
exitSu = false;
Log.d("ROOT", "Can't get root access or denied by user");
} else if (true == currUid.contains("uid=0")) {
retval = true;
exitSu = true;
Log.d("ROOT", "Root access granted");
} else {
retval = false;
exitSu = true;
Log.d("ROOT", "Root access rejected: " + currUid);
}
if (exitSu) {
os.writeBytes("exit\n");
os.flush();
}
}
} catch (Exception e) {
// Can't get root !
// Probably broken pipe exception on trying to write to output
// stream after su failed, meaning that the device is not rooted
retval = false;
Log.d("ROOT",
"Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage());
}
return retval;
}
public final boolean execute() {
boolean retval = false;
try {
ArrayList<String> commands = getCommandsToExecute();
if (null != commands && commands.size() > 0) {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
for (String currCommand : commands) {
os.writeBytes(currCommand + "\n");
os.flush();
}
os.writeBytes("exit\n");
os.flush();
BufferedReader reader = new BufferedReader(new InputStreamReader(
process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
reader.close();
try {
int suProcessRetval = process.waitFor();
if (255 != suProcessRetval) {
retval = true;
} else {
retval = false;
}
System.out.println("BBBB: "+output.toString()) ;
} catch (Exception ex) {
//Log.e("Error executing root action", ex);
}
}
} catch (IOException ex) {
Log.w("ROOT", "Can't get root access", ex);
} catch (SecurityException ex) {
Log.w("ROOT", "Can't get root access", ex);
} catch (Exception ex) {
Log.w("ROOT", "Error executing internal operation", ex);
}
return retval;
}
protected abstract ArrayList<String> getCommandsToExecute();
}
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class SuActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
Log.d("ROOT", "result:" + new ExecuteAsRoot().execute());
} catch (Exception e) {
e.printStackTrace();
}
}
private class ExecuteAsRoot extends AExecuteAsRoot {
@Override
protected ArrayList<String> getCommandsToExecute() {
ArrayList<String> list = new ArrayList<String>();
list.add("add kill-server");
list.add("adb devices");
return list;
}
}
}
分享到:
相关推荐
总之,在Android 8.1的全志R311平台上,通过修改系统配置和源代码,可以为特定APP开启`su`权限。但这涉及到系统安全的敏感操作,务必确保在充分理解其安全风险的前提下进行。在生产环境中,遵循最佳实践,尽量避免...
在Android平台上,有时候开发者需要超越普通应用程序的权限范围,例如执行系统级别的操作,这就涉及到给APP授权和执行Shell命令。Android系统默认是以安全为优先,不允许应用无限制地执行shell命令,但通过获取Root...
本篇文章将深入讲解如何在Android代码中执行`adb shell`命令,并通过源码分析来理解其工作原理。 首先,`adb shell`命令是通过ADB工具在设备的shell环境中执行命令。在Android应用中,我们通常会用到`Runtime`类...
在Android系统中,`su`二进制文件是获取root权限的关键组件,它允许用户以超级用户(root)权限执行命令。源代码分析对于开发者深入理解Android系统的安全模型和权限管理至关重要。`android_su_binary_src`这个...
综上所述,"Android程序中(APK程序)执行Adb shell命令"涉及到利用Java的Runtime或ProcessBuilder类来调用系统shell,执行特定的命令。这个过程需要理解ADB的作用,以及如何在Android应用程序中安全地使用shell命令...
1. `su`命令:在Linux中,`su`命令用于切换用户身份,而在Android中,`su`通常是指向Superuser服务的链接,允许应用通过该服务获取root权限。 2. `Superuser.apk`:这是Superuser应用程序本身,包含了用户界面和与...
例如,某些设备可能不允许非系统应用执行关机或重启,或者在Android 6.0及以上版本,即使应用具有相应权限,也可能需要用户在运行时授予特定的权限。 在实际开发中,确保你的应用有明确的需求和用户理解这些操作的...
上面的代码使用 Runtime.getRuntime().exec() 方法来执行 su 命令,以获取root 权限,然后使用 DataOutputStream 对象将命令写入到输出流中。这里的命令是“reboot -p”,表示重启设备,后面跟着“exit”命令来退出...
一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等
在编程环境中,可以通过Java的`Runtime.getRuntime().exec()`方法执行`su`命令,如下所示: ```java Process process = Runtime.getRuntime().exec("su"); OutputStream out = process.getOutputStream(); out....
在描述中提到的“用代码修改Linux层的命令”,这暗示我们将使用与Linux内核交互的命令来调整Android的时间。在Android系统中,时间是通过Linux内核的系统调用来管理的,这些调用包括`settimeofday()`和`adjtimex()`...
在Android系统中,当设备被root后,SU二进制文件允许用户以系统最高权限(root权限)运行应用或命令,这对于系统调试、自定义ROM和安装特定应用是必要的。 2. **为何需要更新**:随着时间的推移,安全漏洞可能会在...
在非root的Android设备上,执行su命令会失败,而在root设备上,它会提示用户请求权限,如果通过Superuser应用程序批准,那么命令就会继续执行,并且进程将以root权限运行。 在Superuser 3.0.apk文件中,包含了Super...
Ubuntu 终端命令和 Android 命令 本文将对 Ubuntu 终端命令和 Android 命令进行详细的讲解,涉及到软件安装、Linux 常用命令、用户管理相关命令、系统消息相关命令等多个方面。 软件安装 软件安装分为二进制形式...
`system_su` 特别针对Android系统进行了优化,确保在Android设备上安全地获取和使用root权限。 在Android的rooting过程中,`system_su` 通常伴随着一个名为“Superuser”或“SuperSU”的管理程序一起被安装。这个...
3.运行mtk-su ./mtk-su 4.如果shell变成#则说明成功 注意,这个适用于mtk的32位及64位系统,如果安卓系统的安全补丁时间在2020年3月份之后的无法生效,谷歌已经推送安全更新修复该问题,或者系统定制厂商拿的rom...
root权限通常被视为超级用户权限,在Android系统中拥有最高级别的控制权,可以执行几乎所有的操作系统命令。 本文将详细介绍如何在Android应用中实现弹窗请求root权限的功能,并对提供的代码进行深入分析。 #### ...
在Android设备上,执行su命令是获取root权限的关键步骤。标签"su"正是指代这个关键操作。 3. **设备节点**: 设备节点是Linux内核为了与硬件设备通信而创建的特殊文件,位于`/dev`目录下。每个设备节点都有特定的...
`adb shell`命令可以启动一个远程Shell会话,允许用户在设备上执行Linux命令。这对于开发者来说非常有用,因为可以直接在设备上执行各种系统级别的操作。 ##### 2. `su` `su`命令用于切换到超级用户(root)权限。在...