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
?权限
评论