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

Android /system 分區只讀掛載導致 chmod 777 失效:根因與繞過方案

     編輯:程式設計疑難解答

現象

  • APK 放入 `/system/app/`,`pm install` 成功。
  • `Runtime.getRuntime().exec("chmod 777 /data")` 失敗,即使 Root 也不行。

核心原因

`/data` 分區掛載選項包含 `ro` (read-only) 或文件系統層面強制只讀(如 `ext4` 掛載 `ro,nosuid,nodev`)。**Root 權限無法修改掛載屬性**,必須重新掛載。

繞過方案

方案一:重新掛載 (需 Root + 掛載點未被佔用)


su
mount -o remount,rw /data
chmod 777 /data
# 用畢可 remount,ro 恢復

**風險**:系統服務可能持有 `/data` 打開文件句柄,導致 `remount` 失敗 (`Device or resource busy`)。強制 `umount` 會導致系統崩潰。

方案二:別動 /data,換個地方 (推薦)

  • 應用私有目錄:`context.getFilesDir()` (`/data/data/pkg.name/files`)、`getCacheDir()`、**完全可讀寫**,無需權限。
  • 外部存儲:`Environment.getExternalStorageDirectory()` (需權限,Android 10+ 分區存儲限制)。
  • 可寫的系統分區:`/data/local/tmp/` (ADB 常用,需 Root 寫入)。

方案三:系統簽名應用 + 隱藏 API (極不推薦)

  • 簽名為 `platform` 密鑰,聲明 `android:sharedUserId="android.uid.system"`。
  • 調用 `MountService` 隱藏接口掛載。
    **後果**:系統升級即失效,安全審計不通過,佔用系統 UID 影響沙箱隔離。

最佳實踐

  1. 業務邏輯絕不依賴修改系統分區權限。Android 沙箱機制設計初衷即是隔離。
  2. 文件操作歸檔至應用專屬目錄或標準外部存儲 API。
  3. 若確需系統級操作,通過**系統預置應用 + AIDL 服務**暴露最小權限接口,SELinux 策略管控。

**結論**:`chmod 777 /data` 是 XY 問題,真正需求是「寫文件」,請用正規 API。

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