我想在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
,我发现它与更改此处所述的文件所有权有关,
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
吗?
答案 0 :(得分:1)
试试这个
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();
}
答案 1 :(得分: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();
}
}