Android 存储路径
一、内部存储路径(Internal Storage)
- stats.codeSize(内部代码大小)
路径:/data/app/com.example.test-{随机后缀}/base.apk
说明:APK 安装路径,包含应用代码和资源。不同系统版本可能带有随机后缀(如 com.example.test-1)。
扩展:DEX 文件优化后的代码路径为 /data/dalvik-cache/arm64/data@app@com.example.test-{后缀}@base.apk@classes.dex。 - stats.dataSize(内部数据大小)
CE 路径(用户加密数据):/data/user/0/com.example.test
DE 路径(设备加密数据):/data/user_de/0/com.example.test
说明:包含 SQLite 数据库、SharedPreferences 等用户数据。 - stats.cacheSize(内部缓存大小)
路径:/data/data/com.example.test/cache
说明:临时缓存文件,系统或用户清理时可删除。
二、外部存储路径(External Storage)
- extStats.codeSize(外部代码大小,如 OBB)
路径:/storage/emulated/0/Android/obb/com.example.test
说明:存放 OBB 扩展文件(如游戏资源包),需通过 getObbDir() 获取。 - extStats.dataSize(外部数据大小,如媒体文件)
应用私有目录:/storage/emulated/0/Android/data/com.example.test/files
公共媒体目录:/storage/emulated/0/DCIM、/storage/emulated/0/Pictures 等
说明:私有目录通过 getExternalFilesDir() 访问,媒体文件可能分散在公共目录中。 - extStats.cacheSize(外部缓存大小)
路径:/storage/emulated/0/Android/data/com.example.test/cache
说明:外部临时缓存,可通过系统设置或应用自身清理。
三、其他关联路径
Dalvik 缓存:/data/dalvik-cache(优化后的 DEX 文件,影响 stats.codeSize)。
Profiles 文件:
当前配置:/data/misc/profiles/cur/0/com.example.test
参考配置:/data/misc/profiles/ref/com.example.test
四、代码获取路径方式
public void getStorageDirPath(Context context) {
// 获取应用在内部存储的根路径
File file = context.getDataDir();
Log.d("Context().getDataDir()" , file.getAbsolutePath());
// 获取应用在内部存储的 files 路径
File file1 = context.getFilesDir();
Log.d("Context().getFilesDir()" , file1.getAbsolutePath());
// 获取应用在内部存储的 cache 缓存路径
File file2 = context.getCacheDir();
Log.d("Context().getCacheDir()" , file2.getAbsolutePath());
// 获取外部存储根路径
File file3 = Environment.getExternalStorageDirectory();
Log.d("Environment.getExternalStorageDirectory()" , file3.getAbsolutePath());
// 获取外部存储具体公共路径
/*
* 参数如下:
* public static String DIRECTORY_MUSIC = "Music"
* public static String DIRECTORY_PODCASTS = "Podcasts"
* public static String DIRECTORY_RINGTONES = "Ringtones"
* public static String DIRECTORY_ALARMS = "Alarms"
* public static String DIRECTORY_NOTIFICATIONS = "Notifications"
* public static String DIRECTORY_PICTURES = "Pictures"
* public static String DIRECTORY_MOVIES = "Movies"
* public static String DIRECTORY_DOWNLOADS = "Download"
* public static String DIRECTORY_DCIM = "DCIM"
* public static String DIRECTORY_DOCUMENTS = "Documents"
*/
File file4 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
Log.d("Environment.getExternalStoragePublicDirectory(Music)" , file4.getAbsolutePath());
// 获取应用在外部存储中的 Files 路径
File[] file5 = context.getExternalFilesDirs("");
for (File file6 : file5) {
Log.d("Context().getExternalFilesDirs()" , file6.getAbsolutePath());
}
// 获取应用在外部存储中的 cache 缓存路径
File file7 = context.getExternalCacheDir();
Log.d("Context().getExternalCacheDir()" , file7.getAbsolutePath());
}
2025-04-10 20:23:38.913 30330-30330 MainActivi...tDataDir() com.example.testnativeleak D /data/user/0/com.example.testnativeleak
2025-04-10 20:23:38.913 30330-30330 MainActivi...FilesDir() com.example.testnativeleak D /data/user/0/com.example.testnativeleak/files
2025-04-10 20:23:38.913 30330-30330 MainActivi...CacheDir() com.example.testnativeleak D /data/user/0/com.example.testnativeleak/cache
2025-04-10 20:23:38.914 30330-30330 MainActivi...irectory() com.example.testnativeleak D /storage/emulated/0
2025-04-10 20:23:38.914 30330-30330 MainActivi...ory(Music) com.example.testnativeleak D /storage/emulated/0/Music
2025-04-10 20:23:38.922 30330-30330 MainActivi...ilesDirs() com.example.testnativeleak D /storage/emulated/0/Android/data/com.example.testnativeleak/files
2025-04-10 20:23:38.923 30330-30330 MainActivi...CacheDir() com.example.testnativeleak D /storage/emulated/0/Android/data/com.example.testnativeleak/cache