Android 文件系统总结——从 -Android-Q-,面试必备知识点
始终存在且只读挂载,刷 ROM 的分区.
查看方式
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(136, 143, 150); background: rgb(0, 0, 0); line-height: 1.6; border: none; text-align: right;">12</pre>
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(197, 200, 198); background: rgb(29, 31, 33); line-height: 1.6; border: none; width: 364px;">/systemEnvironment.getRootDirectory().getAbsolutePath()</pre>
|
主要目录
/system/{packageName}?预装 apk 目录,系统应用/system/lib?自带 apk 用到的库文件/system/bin?存放一些可执行文件,基本上都是由 C/C++ 编写,比如 app_process 用于启动 Zygote/system/xbin?存放一些可执行文件,目录可为空/system/framework?启动系统所用到的框架
data 分区(Internal Storage)
Internal Storage,操作该区域存储文件,需要 root 权限操作,用于存放应用内的重要信息,
查看方式
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(136, 143, 150); background: rgb(0, 0, 0); line-height: 1.6; border: none; text-align: right;">12</pre>
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(197, 200, 198); background: rgb(29, 31, 33); line-height: 1.6; border: none; width: 364px;">/dataEnvironment.getDataDirectory().getAbsolutePath()</pre>
|
主要目录
/data/app?用于包含许多 apk 的文件列表/data/cache?用于保存临时缓存或者下载的文件/data/data?用于存储 app 的数据/data/data/{packageName}?以包名形式区分,为 app 的私有存储空间,app 卸载之后会删除该包下的文件/database用于存储数据库文件/shared_prefs?用于存储 shared 文件/lib用于存储 so 库/code_cache优化过的代码缓存…
/cache缓存空间, context.getCacheDir() 获取/files?数据存储空间,contet.getFilesDir() 获取
一般的,一个应用的内部存储路径未?/data/data/{packageName}/?。但是对于特殊机型比如华为,小米可能为?/data/user/0/{packageName}/
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(136, 143, 150); background: rgb(0, 0, 0); line-height: 1.6; border: none; text-align: right;">12345</pre>
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(197, 200, 198); background: rgb(29, 31, 33); line-height: 1.6; border: none; width: 306px;">/data/data/{packageName}/files/context.getFilesDir().getAbsolutePath();
/data/data/{packageName}/cache/context.getCacheDir().getAbsolutePath();</pre>
|
storage 分区(External Storage/Shared Storage)
External Storage/Shared Storage,不需要 root 权限就可以操作。可能包含可移除的存储介质,在使用之前需要判断是否挂载(mounted)
对于 4.4 以前的手机,设备存储很小,存在一个内置的存储空间,这部分空间就是内部存储。另外,还支持一个可以移除的存储介质,就是外部存储,比如 SD 卡。随着硬件升级,大部分大于 Android 4.4 的设备内置的存储空间可以划分为 “内部存储” 和 “外部存储”。同时,若此时还支持插入 SD 卡,则外部存储空间等于 “外部存储” 和 “SD 卡存储” 之和。
查看方式
|
<pre style="overflow: auto; font-family: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(136, 143, 150); background: rgb(0, 0, 0); line-height: 1.6; border: none; text-align: right;">123</pre>
|
<pre style="overflow: auto; font-famil
y: consolas, Menlo, "PingFang SC", "Microsoft YaHei", monospace; font-size: 13px; margin: 0px; padding: 10px; color: rgb(197, 200, 198); background: rgb(29, 31, 33); line-height: 1.6; border: none; width: 343px;">/storage/emulated/0@Deprecated Android10 版本上不再推荐使用该 ApiEnvironment.getExternalStorageDirectory()</pre>
|
主要目录
storage/emulated/0/Android/media/{packageName},以包名的形式区分,app 的私有多媒体空间,5.0 Api 可用obb/{packageName},以包名的形式区分,游戏 obb 数据文件data/{packageName}?以包名的形式区分,app 的私有存储空间/cache?缓存空间,可通过?context.getExternalCacheDir()?获取/files?数据存储空间,可通过?context.getExternalFilesDir()?获取, Android 10 通过以下方法进一步操作/Music, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_MUSIC)?获取/Podcasts, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_PODCASTS)?获取/Ringtones, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_RINGTONES)?获取/Alarms, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_ALARMS)?获取/Notifications, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_NOTIFICATIONS)?获取/Pictures, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_PICTURES)?获取/Movies, 通过?context.getExternalFilesDirs(Environment.DIRECTORY_MOVIES)?获取media,obb,data?Android10 及以上 按包名为应用划分?沙盒目录,跟随 app 卸载而删除,外部无法访问storage/emulated/0/Music/?Android 10 及以上 无法通过路径访问,SAF,MediaStore 可行storage/emulated/0/Pictures/?访问同上storage/emulated/0/Ringtones/?访问同上storage/emulated/0/Alarms/?访问同上storage/emulated/0/Notifications/?访问同上storage/emulated/0/Podcasts/?访问同上storage/emulated/0/Movies/?访问同上storage/emulated/0/Download/?访问同上storage/emulated/0/DCIM/?访问同上storage/emulated/0/Documents/?访问同上storage/emulated/0/Screenshots/?访问同上storage/emulated/0/Audiobooks/?访问同上
Android 逻辑角度看
App-specific storage
存储类型:应用专用存储,私有目录
使用方法:
getFilesDir(),getCacheDir(),getExternalFilesDir(),getExternalCacheDir(),getExternalMediaDirs()操作权限:内部存储不需要权限,外部存储从 Android4.4 之后也不需要
外部应用访问:无法访问内部存储,Android 10 及以后无法外部存储
卸载是否移除:移除
Preferences
存储类型:内部私有存储,键值对存在
使用方法:Jetpack Preferences library
操作权限:不需要
外部应用访问:不可以访问
卸载是否移除:移除
Databases
存储类型:内部私有存储,持久化结构
使用方法:Room persistence library
操作权限:不需要
外部应用访问:不可以访问
卸载是否移除:移除
Shared storage - Media
存储类型:共享存储,比如一些图片,视音频
使用方法:MediaStore API
操作权限:Android9 或者更低版本都需要?
READ_EXTERNAL_STORAGE?和?WRITE_EXTERNAL_STORAGE。Android10 或更高版本在访问外部 app 才需要外部应用访问:可以访问,但是需要?
READ_EXTERNAL_STORAGE?权限











评论