Android 重要的文件目录和文件分析

来源:互联网 发布:济宁网络问政平台育才 编辑:程序博客网 时间:2024/05/22 10:29

目录

平时的开发中,主要由两种方式来获取应用可用的目录:

  • Environment 一般用来获取公共目录
  • Context 一般用来获取当前应用目录

下面使用 lyn.demo 的包和小米手机 5 做测试。有 25 G 手机内存,用掉了 20 G 后各个目录的情况如下

1 Environment.getDownloadCacheDirectory();

/cache total:248M left:226M

2 Environment.getExternalStorageDirectory()

/storage/emulated/0 total:25G left:5G

这个目录就是 SDCard 的主目录

3 Environment.getExternalStoragePublicDirectory(XXX)

/storage/emulated/0/XXX total:25G left:5G

这个方法可以用来获取 SDCard 的的一些标准目录,比如 DCIM,Music 等

相应的可以使用 Environment 已经定义好的类型

  • Environment.DIRECTORY_MUSIC
  • Environment.DIRECTORY_PODCASTS
  • Environment.DIRECTORY_RINGTONES
  • Environment.DIRECTORY_ALARMS
  • Environment.DIRECTORY_NOTIFICATIONS
  • Environment.DIRECTORY_PICTURES
  • Environment.DIRECTORY_MOVIES
  • Environment.DIRECTORY_DOWNLOADS
  • Environment.DIRECTORY_DCIM

4 context.getExternalFilesDir

/storage/emulated/0/Android/data/lyn.demo/files total:25G left:5G

这个目录可以用来放应用的一些下载的资源

5 context.getExternalCacheDir

/storage/emulated/0/Android/data/lyn.demo/cache total:25G left:5G

这个目录可以用来做为应用的缓存,比如用了 ImageLoader 的图片缓存。

比如网易新闻在 cache 下新建了个 bitmap 目录,放了应用的图片缓存

网易新闻的图片缓存

在设置里点击“清除缓存”,会删掉该目录

6 context.getFilesDir

/data/user/0/lyn.demo/files total:25G left:5G

其中,/data/user/0 是一个链接目录,指向的是 /data/data,所以真实的路径是 /data/data/lyn.demo/files,这个目录也可以作为文件的存储

这个目录下还有很多和应用相关的非常重要的文件目录。比如推酷应用有这些目录

data下的目录列表

一般比较重要的有
- lib 存放着 apk 携带的 so 库,是一个链接文件。如果应用没有 so 库的话,自然也不会有这个目录。
- shared_prefs 存放应用的 SharedPreference 的存储,实际上是一堆 xml 文件
- databases 存放着应用的 sqlite 数据库,以 db 为后缀

当在设置里点击清除数据后,只有 lib 没有影响,其他文件都会被删除

以上可以发现,/data 目录虽然在内部存储中,确同样可以使用到 SDCard 的25G内存,应该是 ROM 有做特殊的处理

当我把内存打爆后,也就是内部存储和外部存储的内存全部用完后,手机会重启,重启后 logcat 有这样的记录

08-25 16:56:32.495 7953-9504/? D/MediaProvider: object removed 85044
08-25 16:56:32.495 7953-9504/? D/MediaProvider: object removed 85045
08-25 16:56:32.517 7953-9504/? D/MediaProvider: object removed 85046
08-25 16:56:32.518 7953-9504/? D/MediaProvider: object removed 85047
08-25 16:56:32.518 7953-9504/? D/MediaProvider: object removed 85048
08-25 16:56:32.519 7953-9504/? D/MediaProvider: object removed 85049
08-25 16:56:32.520 7953-9504/? D/MediaProvider: object removed 85050
08-25 16:56:32.541 7953-9504/? D/MediaProvider: object removed 85051

然后查看又有了几十M内存可用,可见系统在有清理策略,在一直删除数据

不过比较悲催的是,后来因为彻彻底底打爆内存,小米自动关机后无法正常开机,一直停留在启动画面,不过还能连接电脑,通过 logcat 观察发现了系统发生 IOException,因为实在没有任何内存供它写入,所以索性就开不了机了。重新刷机后恢复正常。

文件

1 数据库 db
在 root 的机子上,安装 ES文件浏览器可以看到这些目录。同时,安装 SQLite Editor 可以查看 /data/data/xxx/databases 下的数据库

比如我们可能会使用 ContentResolver 去查询 MediaStore,其实就是在查系统的数据库,里面有存储卡里的一些多媒体信息,一些视频的信息的数据库地址在 /data/data/com.android.providers.media/external.db

系统的媒体数据库

系统的媒体数据库中的视频表

2 SharedPreferenced存储
本质上就是一些 xml 文件,比如我自己的 lyn.demo 应用的 SharedPreference 存储在 /data/data/xxx/shared_prefs

一个 SharePreference存储文件

0 0
原创粉丝点击