有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Android设备上运行root命令的java

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

我使用了su,然后是我想要运行的命令(chmod666)。chmod666需要一个根设备才能正常运行,因此我首先尝试使用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.安卓.test E/cutils﹕ to chown(/mnt/shell/emulated/0, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.安卓.test E/cutils﹕ to chown(/mnt/shell/emulated/obb, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.安卓.test E/cutils﹕ to chown(/storage/emulated/0/Android, 0, 0)
11-20 12:32:14.120    3265-3265/com.project.安卓.test E/cutils﹕ to chown(/storage/emulated/0/Android/obb, 0, 0)
11-20 12:32:14.346    3265-3265/com.project.安卓.test E/linker﹕ load_library(linker.cpp:761): library "libmaliinstr.so" not found
11-20 12:32:14.348    3265-3265/com.project.安卓.test E/﹕ appName=com.project.安卓.test, acAppName=com.安卓.cts.openglperf
11-20 12:32:14.348    3265-3265/com.project.安卓.test E/﹕ 0
11-20 12:32:14.348    3265-3265/com.project.安卓.test E/﹕ appName=com.project.安卓.test, acAppName=com.安卓.browser
11-20 12:32:14.348    3265-3265/com.project.安卓.test E/﹕ 0

我试图搜索chown,发现它与更改此处所述文件的所有权有关

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

我认为这是由于试图运行su造成的。我已经删除了命令数组,只保留了su,并再次运行了应用程序,但我再次遇到了与chown相关的错误。因此,我认为运行su有问题,但我无法解决

当我继续搜索如何运行su时,我找到了我使用的依赖于getRunTime.exec的相同方法

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

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

感谢您的帮助

编辑:我提供的错误日志中有一行写着“加载库(linker.cpp:761):库”libmalinstr。所以“找不到”

我搜索了一下,发现有些手机像华为一样错过了这个图书馆。我的设备是华为,因此会导致如下所述的库相关错误:

Library "libmaliinstr.so" not found

但是我读到这个库不会影响应用程序的运行,但是它会影响su


共 (2) 个答案

  1. # 1 楼答案

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

    在清单中添加以下行。关闭硬件加速的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();
        }
    }
    
  2. # 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();
        }