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

Android Root 權限下 Shell 命令寫入 sysfs 節點:亮度控制實戰

     編輯:程式設計疑難解答

問題場景

Android App 持有系統簽名權限 (android:sharedUserId="android.uid.system"),通過 Runtime.exec("sh") 執行 echo 1 > /sys/class/leds/white:pd27:led3/brightness 控制 LED 亮度,但無效果。

根本原因

Shell 重定向符 > 是 Shell 內建功能,不屬於可執行程序。Runtime.exec("sh -c 'echo 1 > /path'") 或將重定向拆分為 Shell 命令參數才能生效。直接 exec("sh") 後寫入輸出流,> 被作為字符串字面量傳給 echo,而非重定向操作。

正確實現方式

方案一:sh -c 完整命令字符串(推薦)


String cmd = "echo 1 > /sys/class/leds/white:pd27:led3/brightness";
Process process = Runtime.getRuntime().exec(new String[]{"sh", "-c", cmd});
// 或
Process process = Runtime.getRuntime().exec("sh -c \"" + cmd + "\"");
process.waitFor();

方案二:Java 直接寫入文件(無需 Shell,更高效)


String path = "/sys/class/leds/white:pd27:led3/brightness";
try (FileWriter fw = new FileWriter(path)) {
    fw.write("1");
} catch (IOException e) {
    e.printStackTrace();
}
// 需確保該節點文件權限允許寫入(chmod 666 或 777)

方案三:ProcessBuilder 規範寫法


ProcessBuilder pb = new ProcessBuilder("sh", "-c", "echo 1 > /sys/class/leds/white:pd27:led3/brightness");
pb.redirectErrorStream(true);
Process process = pb.start();
int exitCode = process.waitFor();

權限配置關鍵點(原問題補充)

  1. 節點文件權限:chmod 666 /sys/class/leds/white:pd27:led3/brightness(或 777),確保寫入權限。
  2. 父目錄執行權限:chmod 755 /sys/class/leds/white:pd27:led3/,否則無法遍歷進入。
  3. SELinux 上下文:Android 5.0+ 需確保進程域有 sysfs_leds 寫入權限,系統簽名 App 通常滿足。

驗證步驟

  1. ADB Shell 手動執行:echo 1 > /sys/class/leds/white:pd27:led3/brightness → 確認 LED 亮起。
  2. ADB Shell 檢查權限:ls -l /sys/class/leds/white:pd27:led3/brightness → 應為 -rw-rw-rw- 或更寬鬆。
  3. App 中加入方案二代碼,點擊按鈕測試。

總結

Shell 重定向必須在 sh -c 中執行,或改用 Java 文件 IO 直接寫入 sysfs 節點。配合正確的文件權限設置(chmod 666 brightness),即可實現 Android 系統 App 控制 LED 亮度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved