Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android设备上运行root命令_Java_Android_Linux_Root_Chmod - Fatal编程技术网

Java 在Android设备上运行root命令

Java 在Android设备上运行root命令,java,android,linux,root,chmod,Java,Android,Linux,Root,Chmod,我想在Android设备上运行一些需要root权限的命令。命令应该使用java代码执行,因此应用程序本身应该能够运行这些命令,而无需将设备连接到pc并使用shell运行命令 我使用了su,然后使用了我想要运行的命令(chmod 666)。chmod666需要一个根设备才能正常运行,因此我尝试先使用su获得超级用户权限,然后尝试运行它。我将java代码放在onCreate方法中。这是我的密码: @Override protected void onCreate(Bundle savedIn

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

我使用了
su
,然后使用了我想要运行的命令(chmod 666)。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.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
,发现它与更改此处所述文件的所有权有关

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

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

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

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

感谢您的帮助

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

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

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

试试这个

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();
    }

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

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

<activity android:hardwareAccelerated="false">

谢谢,但是当把代码放在onCreate中时,我得到“无法解析符号ShellProcess”,我试图导入它,但不知道它放在哪个类下,如何解决这个问题?谢谢。抱歉,请使用“过程”而不是“ShellProcess”!谢谢,我已经试过了,但是仍然得到了同样的错误,是因为libmalinstr库吗?一行错误是这样的:load_库(linker.cpp:761):找不到库“libmalinstr.so”。谢谢。谢谢你的回答,我做到了,没有与环境相关的错误,但是我仍然得到了chown错误,错误是“Command:Working Directory:null environment:null”。我还尝试在三星设备上运行该应用程序,但遇到了空环境异常。您能告诉我如何解决这个问题吗?您好,您的手机可以运行其他基于“su”的应用程序吗?您好,非常感谢,但这仍然会给我相同的su空环境错误,即java.io.IOException:error running exec()。命令:工作目录:null环境:null。你能告诉我如何解决这个问题吗?我在两个不同的设备上运行了该应用程序,但得到了相同的错误。谢谢。是的,很有影响。请先将手机设为根目录,然后通过在adb shell中手动运行“su”命令来验证根目录。若要读取根目录命令的输出,请将“p.waitFor();”替换为以下内容:
code
BufferedReader reader=new BufferedReader(new-InputStreamReader(p.getInputStream());p、 waitFor();字符串行=”;while((line=reader.readLine())!=null){output.append(line+“\n”);}
code
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();
    }
}