[英]Running root commands on Android device
我想在 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
有問題,但我想不通。
當我搜索關於如何運行 su 的 SO 時,我發現了我使用的相同方法,它依賴於getRunTime.exec
。
我曾經讀過su
需要一個有 root 權限的設備才能正常運行,但我不確定這一點,因為我只在少數資源中看到過,對嗎?
誰能告訴我代碼中有什么問題以及如何解決?
任何幫助表示贊賞。
編輯:我提供的錯誤日志的一行內容如下, “load_library(linker.cpp:761): library“libmaliinstr.so” not found”
我搜索了一下,發現有些手機像華為一樣錯過了這個庫。 我的設備是華為,所以它會導致這里提到的庫相關錯誤:
但是我讀到這個庫不會影響應用程序的運行,但是它會影響su
嗎?
您執行 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();
}
}
嘗試這個
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.