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} :

  1. Android 6.0 及以上版本:/data/user/0/xxx包名 (支持多用户)
  2. 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卡上的缓存目录

授权:

  1. API < 19,需要申请;
  2. 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系统的设置下面看到存储空间权限的开关,当然也就无法关闭它了。