首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 請求 Root 權限:Runtime.getRuntime().exec("su") 流程詳解

     編輯:程式設計綜合問答

需求:App 需要 Root 權限執行特定命令(如修改系統文件、掛載分區)。

核心流程

  1. 檢查設備是否已 Root:which su 或嘗試執行 su -c "id"。
  2. 申請 Root Shell:Process process = Runtime.getRuntime().exec("su");
  3. 向 Shell 寫入命令:DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("command\n"); os.writeBytes("exit\n"); os.flush();
  4. 讀取輸出/錯誤流:InputStream is = process.getInputStream(); 異步讀取防死鎖。
  5. 等待結束:process.waitFor(); 獲取退出碼。

完整工具類

public class RootUtil {
    public static boolean exec(String... commands) {
        try {
            Process process = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(process.getOutputStream());
            for (String cmd : commands) {
                os.writeBytes(cmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
            int result = process.waitFor();
            return result == 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

// 調用
RootUtil.exec("mount -o remount,rw /system", "cp /sdcard/file /system/app/");

關鍵避坑

現代替代:Magisk / KernelSU 隱藏 Root

Android 10+ 封鎖了直接 exec("su"),需配合 Magisk 隱藏列表或使用 libsu 庫。建議集成成熟庫 Magisk 或 KernelSU 提供的 Java API。

記住:Root 操作極高風險,必須異步執行、超時保護、異常兜底,並在清單文件聲明 android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 等相關權限。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決
寫命令後不寫 exitShell 不退出,waitFor() 永久阻塞
不異步讀取輸出流管道滿導致死鎖,用線程讀取或 ProcessBuilder.redirectErrorStream(true)
假設所有設備 su 路徑相同用 which su 動態獲取或嘗試常見路徑 /system/bin/su /system/xbin/su
無 Root 時崩潰捕獲 IOException,返回 false 提示用戶