android 存储目录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| |-data // --> Environment.getDataDirectory() |-app // 存放用户安装的软件 |-data // 存放用户安装的所有程序,包含/system/app 和 /data/app 和 /mnt/asec中装的软件 |-android |-com.test.demo // 应用程序的内部存储目录,卸载时自动清除 |-app_$name // --> Context.getDir(String name, int mode) |-cache // --> context.getCacheDir() 缓存,无需额外权限;超额时,系统自动删除该目录中的文件 |-code_cache |-databases // 数据库 |-files // --> Context.getFilesDir() 或 Context.getFileStreamPath("") |-file1 // --> Context.getFileStreamPath("file1") |-shared_prefs // sharedPrefrences配置文件 |-.xml // 配置文件 |-system // 安装app时的注册表配置 |-user |-0 |-com.test.demo // --> context.getDataDir() 应用程序的私有目录 (minsdk 21) |-cache // |-code_cache // --> context.getCodeCacheDir() 应用程序代码缓存文件目录 (minsdk 21) |-databases // |-files // |-no_backup // --> context.getNoBackupFilesDir() 不会自动备份到远程存储的应用程序文件目录 (minsdk 21) |-dev // 设备文件,Linux系统常规文件夹,里面的文件很多都是设备模拟的文件系统 |-etc // --> /system/etc |-log |-mnt // 挂载点 |-proc // 运行时文件 |-product |-app |-etc |-lib |-media |-res |-root |-sdcard |-amap |-Android |-data // 应用程序包 同上面的/data/data/com.test.demo |-media |-dcim |-camera // 照片以及视频 |-download // 下载的文件 |-movies |-musics |-pictures // 屏幕截屏 |-sandbox |-storage //【外部存储】 |-sdcard0 // --> Environment.getExternalStorageDirectory() 或 Environment.getExternalStoragePublicDirectory("") |-Android |-data |- com.test.demo |-cache // --> context.getExternalCacheDir() |-files // --> context.getExternalFilesDir() |-file1 // --> Context.getExternalFilesDir("file1") |-Music // --> Context.getExternalFilesDir(Environment.Music) |-Picture // --> Context.getExternalFilesDir(Environment.Picture) |-obb // --> context.getObbDir() |-DCIM // --> Environment.getExternalStoragePublicDirectory("DCIM") |-backups |-Download |-sys // Linux 内核文件 |-system // 包含系统的framework、组件、字体播放器等系统自带的资源配置;常用开发工具tcpdump/sqlite3 |-app // 系统自带的应用程序, .apk包 |-bin // 存放用户常用的工具程序 |-build.prop // 记录了系统的设置和改变,类似于/etc中的文件 |-etc // 存放了系统中几乎所有的配置文件,根目录下的/etc链结于此,比如APN接入点设置等核心配置 |-modules // 存放内核模块(主要是fs和net)和模块配置文件 |-fonts // 字体库 |-framework // .jar包,系统核心文件 |-init.rc // 一个初始化脚本,用于将/system/modules和/system/xbin挂载为cramfs,避免系统被无意破坏 |-lib // .so包,系统底层类库,框架层的实现文件 |-usr // 用户文件夹,包含共享、键盘布局、时间区域文件等 |-media // .ogg音频文件 |-audio // 系统默认铃声 |-alarms // 闹钟 |-animationsounds // 开关机动画 |-notificatinos // 短信或提示音 |-rignstones // 来电铃声 |-ui // 界面音效,比如键盘敲击声 |-video |-xbin // 系统管理工具 |-theme |-vendor // --> /system/vendor |-version
|
内置存储
APK 安装目录
常用路径:
路径 |
获取方式 |
用途 |
/data/app/~~xxxxxx==/包名-xxxxxxxx==/base.apk |
applicationInfo.sourceDir |
应用apk所在目录,通过这个目录,我们可以获取到apk的所有class |
/data/app/~~xxxxxx==/包名-xxxxxxxx==/lib/{arch}/ |
applicationInfo.nativeLibraryDir |
本地lib库目录,arm、arm64、x86、x64,可以通过此路径判断当前进程是32位还是64位 |
应用目录
根目录 {AppRoot} :
- Android 6.0 及以上版本:/data/user/0/xxx包名 (支持多用户)
- Android 6.0 以下版本:/data/data/xxx包名
常用路径:
路径 |
获取方式 |
用途 |
{AppRoot}/files |
Context.getFilesDir() |
获取内置存储下的文件目录,可以用来保存不能公开给其他应用的一些敏感数据如用户个人信息 |
{AppRoot}/cache |
Context.getCacheDir() |
获取内置存储下的缓存目录,可以用来保存一些缓存文件如图片,当内置存储的空间不足时将系统自动被清除 |
{AppRoot}/app_xxx |
Context.getDir(“xxx”, mode) |
获取内置存储下的自定义目录,可以用来保持动态下发的so等 |
SD 卡存储
公共目录
根目录:/storage/emulated/0/
常用路径:
路径 |
获取方式 |
用途 |
/storage/emulated/0 |
Environment.getExternalStorageDirectory() |
获取SD卡根目录 |
Android 10不允许在根目录创建文件,当配置targerversion是29,会适配10系统存储权限,向根目录下创建文件报Permission denied。
应用目录
根目录 {AppRoot}:/storage/emulated/0/Android/data/应用包名
常用路径:
路径 |
获取方式 |
用途 |
{AppRoot}/files |
Context.getExternalFilesDir() |
获取App SD卡上的文件目录 |
{AppRoot}/cache |
Context.getExternalCacheDir() |
获取App SD卡上的缓存目录 |
授权:
- API < 19,需要申请;
- API >= 19,不需要申请
注意事项
通常我们开发App时会设置targetSDKVersion=23时,并同时向前兼容,还会设置minSdkVersion=14表示支持的最低系统版本是Android4.0(API = 14)。
而通过Context.getExternalCacheDir()接口获取应用扩展存储目录时,只有在API >= 19时才不需要申请权限。也就是说如果是上面这种兼容到API 14的应用,还是需要在AndroidManifest.xml中注册WRITE_EXTERNAL_STORAGE权限的。
敏感权限只要在manifest里面注册了,系统应用设置中就会出现对应开关,允许用户取消权限!虽然android6.0 不需要WRITE_EXTERNAL_STORAGE权限,但是实测注册此权限,用户取消之后,相关API返回空!
1 2
| <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
|
表示只在API <= 18时,才申请WRITE_EXTERNAL_STORAGE权限。这样用户就无法在Android6.0系统的设置下面看到存储空间权限的开关,当然也就无法关闭它了。