【问题标题】:Running root commands on Android device在 Android 设备上运行 root 命令
【发布时间】:2015-11-20 09:59:37
【问题描述】:

我想在 Android 设备上运行一些需要 root 权限的命令。这些命令应该使用 java 代码执行,因此应用程序本身应该能够运行这些命令,而无需将设备连接到 pc 并使用 shell 运行命令。

我使用了su,然后使用了我想要运行的命令(chmod 666)。 chmod 666 需要root 设备才能正常运行,所以我先尝试使用su 获得超级用户权限,然后尝试运行它。我将 java 代码放在 onCreate 方法中。这是我的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

      String[] cmds = {"cd /dev/input" ,"chmod 666"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }

         setContentView(R.layout.activity_main__interface);
    }

但是,在运行此应用程序时出现此错误:

11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/mnt/shell/emulated/0, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/mnt/shell/emulated/obb, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/storage/emulated/0/Android, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.android.test E/cutils﹕ to chown(/storage/emulated/0/Android/obb, 0, 0)
11-20 12:32:14.346    3265-3265/com.project.android.test E/linker﹕ load_library(linker.cpp:761): library "libmaliinstr.so" not found
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ appName=com.project.android.test, acAppName=com.android.cts.openglperf
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ 0
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ appName=com.project.android.test, acAppName=com.android.browser
11-20 12:32:14.348    3265-3265/com.project.android.test E/﹕ 0

我尝试搜索chown,发现它与更改文件的所有权有关,如here所述,

http://www.cyberciti.biz/faq/how-to-use-chmod-and-chown-command/

我认为这是由于尝试运行 su 造成的。我已经删除了命令数组,只保留了 su,并再次运行了应用程序,但我再次遇到了与 chown 相关的错误。所以,我认为运行su 有问题,但我想不通。

当我在 SO 上搜索如何运行 su 时,我发现我使用的方法与我使用的方法相同,它依赖于 getRunTime.exec

我曾经读到su 需要一个有根设备才能正常运行,但我不确定这一点,因为我只在少数资源中看到过,对吗?

谁能告诉我代码中有什么问题以及如何解决?

感谢任何帮助。

编辑:我提供的错误日志的一行内容如下,"load_library(linker.cpp:761): library "libmaliinstr.so" not found"

我搜索了一下,发现有些手机像华为一样错过了这个库。我的设备是华为,所以它会导致这里提到的库相关错误:

Library "libmaliinstr.so" not found

但是我读到这个库不影响应用的运行,但是会影响su吗?

【问题讨论】:

    标签: java android linux root chmod


    【解决方案1】:

    您执行 su 命令的代码很好。问题是由于创建运行时缺少硬件加速库。您可以在 ADB shell 中尝试相同的“su”命令,它应该可以工作。

    在 manifest.xml 中添加以下行以关闭硬件加速应该可以解决此问题:

    <activity android:hardwareAccelerated="false">
    

    请试试这段代码,我在 android 5.1 上运行良好:

    private void prepareKvmKernelModule(){
        try{
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream outputStream = new DataOutputStream(p.getOutputStream());
            outputStream.writeBytes("insmod /lib/modules/kvm.ko\n");
            outputStream.flush();
            outputStream.writeBytes("insmod /lib/modules/kvm-intel.ko\n");
            outputStream.flush();
            outputStream.writeBytes("chmod 777 /dev/kvm\n");
            outputStream.flush();
            outputStream.writeBytes("exit\n");
            outputStream.flush();
            p.waitFor();
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 感谢您的回答,我这样做了,没有与环境相关的错误,但我仍然收到 chown 错误,出现此错误“命令:Super User 工作目录:空环境:空”。我也尝试在三星设备上运行该应用程序,但我得到了空环境异常。你能告诉我如何解决这个问题吗?
    • 您好,您的手机可以运行其他基于“su”的应用程序吗?
    • 嗨,非常感谢,但这仍然给我同样的 su 空环境错误,即 java.io.IOException: Error running exec()。命令:Super User 工作目录:null 环境:null。你能告诉我如何解决这个问题吗?我在两个不同的设备上运行该应用程序,但我得到了同样的错误。谢谢。
    • 是的,它会影响。请先root你的手机,然后在adb shell中手动运行“su”命令来验证你的root。
    • 要读取根命令的输出,替换“p.waitFor();”像这样:code BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); p.waitFor();字符串行 = ""; while ((line = reader.readLine()) != null) { output.append(line + "\n"); } code
    【解决方案2】:

    试试这个

    String[] deviceCommands = {"su", "cd /dev/input", "chmod 666"};
    try {
            Process process = Runtime.getRuntime().exec(deviceCommands);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(), "error!", Toast.LENGTH_SHORT).show();
        }
    

    【讨论】:

    • 谢谢,但是将代码放在onCreate里面时,我得到“无法解析符号ShellProcess”,我尝试导入它,但不知道它放在哪个类下,我该怎么做解决这个问题?谢谢。
    • 抱歉使用“Process”而不是“ShellProcess”!
    • 谢谢,我已经试过了,但我仍然得到同样的错误,是因为 libmaliinstr 库吗?一行错误说明:load_library(linker.cpp:761): library "libmaliinstr.so" not found。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2019-11-27
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多