現象
- 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 影響沙箱隔離。
最佳實踐
- 業務邏輯絕不依賴修改系統分區權限。Android 沙箱機制設計初衷即是隔離。
- 文件操作歸檔至應用專屬目錄或標準外部存儲 API。
- 若確需系統級操作,通過**系統預置應用 + AIDL 服務**暴露最小權限接口,SELinux 策略管控。
**結論**:`chmod 777 /data` 是 XY 問題,真正需求是「寫文件」,請用正規 API。