編譯/運行時出現 can't open /data/misc/hprof_oom_dump.hprof: Permission denied,常見於模擬器或 Root 權限受限裝置觸發 Heap Dump 失敗。
/data/misc/,但該目錄需 system 或 shell 權限,一般 App 無寫入權限。Debug.dumpHprofData() 呼叫、android:debuggable="true" 觸發自動 dump、或測試框架(如 LeakCanary)主動 dump。<uses-permission android:name="android.permission.DUMP" />
<uses-permission android:name="android.permission.READ_LOGS" />
注意:DUMP 為 signature|system 保護級別,一般 App 無法獲取,僅供系統應用/測試環境。
<application
android:debuggable="false" <!-- 釋出版必須 false -->
...>
或在程式碼避免呼叫 Debug.dumpHprofData()。
// Application 中
LeakCanary.config = LeakCanary.config.copy(
heapDumpListener = heapDumpFile -> {
// 複製到 App 專屬目錄(有寫入權限)
File dest = new File(getCacheDir(), "leakcanary-" + System.currentTimeMillis() + ".hprof");
Files.copy(heapDumpFile.toPath(), dest.toPath());
}
);
android:debuggable="false",避免觸發系統自動 dump。adb shell am dumpheap 或 Android Studio Profiler,不依賴 App 自身寫入系統目錄。Writable /data/misc 權限(需 cold boot 或 wipe data)。此錯誤本質是權限邊界:App 沙盒無法觸及 /data/misc。正確做法是避免觸發需系統權限的 dump,或將 dump 導向 App 可寫目錄(getCacheDir()/getFilesDir())。