簡體   English   中英

在 Android 設備上運行 root 命令

[英]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”

我搜索了一下,發現有些手機像華為一樣錯過了這個庫。 我的設備是華為,所以它會導致這里提到的庫相關錯誤:

未找到庫“libmalinstr.so”

但是我讀到這個庫不會影響應用程序的運行,但是它會影響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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM