`
nanjingjiangbiao_T
  • 浏览: 2739261 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

android上代码去执行"su"命令

 
阅读更多

执行“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;
        }
    }
}


分享到:
评论

相关推荐

    Android8.1-全志R311-如何打开APP获取su权限.pdf

    总之,在Android 8.1的全志R311平台上,通过修改系统配置和源代码,可以为特定APP开启`su`权限。但这涉及到系统安全的敏感操作,务必确保在充分理解其安全风险的前提下进行。在生产环境中,遵循最佳实践,尽量避免...

    android 给app授权 执行shell命令

    在Android平台上,有时候开发者需要超越普通应用程序的权限范围,例如执行系统级别的操作,这就涉及到给APP授权和执行Shell命令。Android系统默认是以安全为优先,不允许应用无限制地执行shell命令,但通过获取Root...

    android执行adb shell命令源码

    本篇文章将深入讲解如何在Android代码中执行`adb shell`命令,并通过源码分析来理解其工作原理。 首先,`adb shell`命令是通过ADB工具在设备的shell环境中执行命令。在Android应用中,我们通常会用到`Runtime`类...

    android_su_binary_src

    在Android系统中,`su`二进制文件是获取root权限的关键组件,它允许用户以超级用户(root)权限执行命令。源代码分析对于开发者深入理解Android系统的安全模型和权限管理至关重要。`android_su_binary_src`这个...

    Android程序中(APK程序)执行Adb shell 命令

    综上所述,"Android程序中(APK程序)执行Adb shell命令"涉及到利用Java的Runtime或ProcessBuilder类来调用系统shell,执行特定的命令。这个过程需要理解ADB的作用,以及如何在Android应用程序中安全地使用shell命令...

    Android Superuser源码

    1. `su`命令:在Linux中,`su`命令用于切换用户身份,而在Android中,`su`通常是指向Superuser服务的链接,允许应用通过该服务获取root权限。 2. `Superuser.apk`:这是Superuser应用程序本身,包含了用户界面和与...

    android代码控制关机重启

    例如,某些设备可能不允许非系统应用执行关机或重启,或者在Android 6.0及以上版本,即使应用具有相应权限,也可能需要用户在运行时授予特定的权限。 在实际开发中,确保你的应用有明确的需求和用户理解这些操作的...

    android实现自动关机的具体方法代码.doc.docx

    上面的代码使用 Runtime.getRuntime().exec() 方法来执行 su 命令,以获取root 权限,然后使用 DataOutputStream 对象将命令写入到输出流中。这里的命令是“reboot -p”,表示重启设备,后面跟着“exit”命令来退出...

    ShellUtils.java,Android adb shell执行类

    一个用于在Android开发中 执行adb shell命令的类,可以以最高权限(su)执行。例如mount命令等

    Android Root设备中的su权限获取和使用详解

    在编程环境中,可以通过Java的`Runtime.getRuntime().exec()`方法执行`su`命令,如下所示: ```java Process process = Runtime.getRuntime().exec("su"); OutputStream out = process.getOutputStream(); out....

    修改Android系统日期

    在描述中提到的“用代码修改Linux层的命令”,这暗示我们将使用与Linux内核交互的命令来调整Android的时间。在Android系统中,时间是通过Linux内核的系统调用来管理的,这些调用包括`settimeofday()`和`adjtimex()`...

    解决SU二进制文件过旧的问题

    在Android系统中,当设备被root后,SU二进制文件允许用户以系统最高权限(root权限)运行应用或命令,这对于系统调试、自定义ROM和安装特定应用是必要的。 2. **为何需要更新**:随着时间的推移,安全漏洞可能会在...

    Superuser 3.0 + su 3.0

    在非root的Android设备上,执行su命令会失败,而在root设备上,它会提示用户请求权限,如果通过Superuser应用程序批准,那么命令就会继续执行,并且进程将以root权限运行。 在Superuser 3.0.apk文件中,包含了Super...

    ubuntu终端命令+android 命令

    Ubuntu 终端命令和 Android 命令 本文将对 Ubuntu 终端命令和 Android 命令进行详细的讲解,涉及到软件安装、Linux 常用命令、用户管理相关命令、系统消息相关命令等多个方面。 软件安装 软件安装分为二进制形式...

    system_su:android超级用户的su二进制文件

    `system_su` 特别针对Android系统进行了优化,确保在Android设备上安全地获取和使用root权限。 在Android的rooting过程中,`system_su` 通常伴随着一个名为“Superuser”或“SuperSU”的管理程序一起被安装。这个...

    mtk-su_r20_mtk_su权限.zip

    3.运行mtk-su ./mtk-su 4.如果shell变成#则说明成功 注意,这个适用于mtk的32位及64位系统,如果安卓系统的安全补丁时间在2020年3月份之后的无法生效,谷歌已经推送安全更新修复该问题,或者系统定制厂商拿的rom...

    Android应用程序请求root权限代码

    root权限通常被视为超级用户权限,在Android系统中拥有最高级别的控制权,可以执行几乎所有的操作系统命令。 本文将详细介绍如何在Android应用中实现弹窗请求root权限的功能,并对提供的代码进行深入分析。 #### ...

    android动态修改设备节点demo

    在Android设备上,执行su命令是获取root权限的关键步骤。标签"su"正是指代这个关键操作。 3. **设备节点**: 设备节点是Linux内核为了与硬件设备通信而创建的特殊文件,位于`/dev`目录下。每个设备节点都有特定的...

    adb常用命令 android

    `adb shell`命令可以启动一个远程Shell会话,允许用户在设备上执行Linux命令。这对于开发者来说非常有用,因为可以直接在设备上执行各种系统级别的操作。 ##### 2. `su` `su`命令用于切换到超级用户(root)权限。在...

Global site tag (gtag.js) - Google Analytics