Android 12系统源码_存储(一)Android应用开发常见的存储目录

前言

在 Android 中,存储涵盖了多种类型和用途,每种存储方式都有其特定的功能和适用场景。以下是 Android 中常见的存储方式和它们的主要特点:

一、Android 存储分类

Android 提供两类物理存储位置:内部存储空间 和 外部存储空间。

内部存储空间通常小于外部存储空间,不过,内部存储空间的数据存储时更加可靠。

内部存储空间目录:包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。系统会组织其他应用访问这些位置,并在 Android 10(API 级别为 29)及更高版本中,系统会对这些位置进行加密。这些特征使得这些位置非常适合存储只有应用本身才能访问的敏感数据。

外部存储空间目录:包括用于存储持久性文件的专属位置,也包括用于存储缓存数据的其他位置。虽然其他应用可以在具有适当权限的情况下访问这些目录,但是存储在这些目录中的文件仅供对应应用使用。如果明确其他应用可以访问数据,应将数据存储在外部空间的共享存储空间部分。表示外部存储空间也存在共有部分和私有部分,共有部分数据所有应用在一定权限下可以访问,私有部分数据仅供应用本身访问。

二、内部存储(Internal Storage)

2.1、特点

概念:内部存储不是内存。存储在内部存储中的文件只能被自己所访问,且一个应用创建的所有文件都在其应用包名目录下,也就是应用创建的内部存储文件是与应用相关联的,内部存储空间十分有限,当应用卸载后,内部存储的文件也会删除,以管理可贵的内部存储空间。

内部存储空间对于应用来说就是 “/data/data” 目录(/data/data/ 是软链接,实际挂载是在 /data/user/0/ 路径下的),其中有两个文件夹值得关注。

2.2、访问方法

通过 Context 的方法如 getFilesDir()、getCacheDir() 来访问应用的私有文件和缓存。

Context().getFilesDir() 获取的文件目录是:/data/user/0/应用包名/files
Context().getCacheDir() 获取的文件目录是:/data/user/0/应用包名/cache

三、外部存储(External Storage)

2.1、特点

外部存储比较容易混淆,因为比较旧的 Android 版本跟新的 Android 版本是有差别的。在 Android 4.4 之前,手机自带的存储空间是作为内部存储,扩展的 SD 卡是最为外部存储的。但是从 Android 4.4 系统开始,Google 将 Android 的机身存储从概念上分为 “内部Internal” 和 “外部Internal” 两部分。

外部存储的空间也有公共和私有的区别。对于应用而言,外部公共空间在一定权限下可以共享,而外部私有空间对于应用来说是无法互相访问的。

而对于可移动存储介质,例如 SD 卡、U盘等外部存储空间,外部存储即 storage 目录或者 mnt 目录。

关于外部存储的挂载,Android 原生中一直变动,在 Android 4.2 之后一直挂载在 /storage/emulated/legacy。而之前的 /storage/sdcard0、/sdcard、/mnt/sdcard 都软链接到 /storage/emulated/legacy 下。

在路径中出现的 “0”,是由于 Google 增加了多用户的概念。

2.2、访问方法

通过 Environment.getExternalStorageDirectory() 或 Context.getExternalFilesDir() 等方法来获取外部存储目录的路径。
在 Android 10 及更高版本中需要先获取对应的权限才能访问外部存储。

Environment.getExternalStorageDirectory() 获取的文件目录是:/storage/emulated/0
Context.getExternalFilesDir() 获取的文件目录是:/storage/emulated/0/Android/data/应用包名/files

四、 Android 中应用内外部存储路径

对于应用访问内外部存储路径,对如下 api 进行输出。

public void getStorageDirPath() {
        // 获取应用在内部存储的根路径
        File file = getContext().getDataDir();
        Log.d("Context().getDataDir()" , file.getAbsolutePath());

        // 获取应用在内部存储的 files 路径
        File file1 = getContext().getFilesDir();
        Log.d("Context().getFilesDir()" , file1.getAbsolutePath());

        // 获取应用在内部存储的 cache 缓存路径
        File file2 = getContext().getCacheDir();
        Log.d("Context().getCacheDir()" , file2.getAbsolutePath());

        // 获取外部存储根路径
        File file3 = Environment.getExternalStorageDirectory();
        Log.d("Environment.getExternalStorageDirectory()" , file3.getAbsolutePath());

        // 获取外部存储具体公共路径
        /*
         * 参数如下:
         * public static String DIRECTORY_MUSIC = "Music"
         * public static String DIRECTORY_PODCASTS = "Podcasts"
         * public static String DIRECTORY_RINGTONES = "Ringtones"
         * public static String DIRECTORY_ALARMS = "Alarms"
         * public static String DIRECTORY_NOTIFICATIONS = "Notifications"
         * public static String DIRECTORY_PICTURES = "Pictures"
         * public static String DIRECTORY_MOVIES = "Movies"
         * public static String DIRECTORY_DOWNLOADS = "Download"
         * public static String DIRECTORY_DCIM = "DCIM"
         * public static String DIRECTORY_DOCUMENTS = "Documents"
         */
        File file4 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
        Log.d("Environment.getExternalStoragePublicDirectory(Music)" , file4.getAbsolutePath());

        // 获取应用在外部存储中的 Files 路径
        File[] file5 = getContext().getExternalFilesDirs("");
        for (File file6 : file5) {
            Log.d("Context().getExternalFilesDirs()" , file6.getAbsolutePath());
        }

        // 获取应用在外部存储中的 cache 缓存路径
        File file7 = getContext().getExternalCacheDir();
        Log.d("Context().getExternalCacheDir()" , file7.getAbsolutePath());
    }

--------------------------------------------------------------------------------------------------------------------------------

输出如下:
D/Context().getDataDir(): /data/user/0/com.example.android
D/Context().getFilesDir(): /data/user/0/com.example.android/files
D/Context().getCacheDir(): /data/user/0/com.example.android/cache
D/Environment.getExternalStorageDirectory(): /storage/emulated/0
D/Environment.getExternalStoragePublicDirectory(Music): /storage/emulated/0/Music
D/Context().getExternalFilesDirs(): /storage/emulated/0/Android/data/com.example.android/files
D/Context().getExternalCacheDir(): /storage/emulated/0/Android/data/com.example.android/cache

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 19:50:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 19:50:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 19:50:04       58 阅读
  4. Python语言-面向对象

    2024-07-17 19:50:04       69 阅读

热门阅读

  1. notes for datawhale 2th summer camp NLP task2

    2024-07-17 19:50:04       21 阅读
  2. linux学习笔记整理: 关于linux系统介绍 2024/7/16;

    2024-07-17 19:50:04       20 阅读
  3. 单例模式-C#

    2024-07-17 19:50:04       17 阅读
  4. 常用的系统层安全机制

    2024-07-17 19:50:04       21 阅读
  5. 什么是智能家居?

    2024-07-17 19:50:04       18 阅读
  6. C++的关键字const

    2024-07-17 19:50:04       21 阅读
  7. 服务端正常启动了,但是客户端请求不到

    2024-07-17 19:50:04       22 阅读
  8. QTextBrowser设置行号

    2024-07-17 19:50:04       23 阅读
  9. Webhook 是什么?详解其工作原理

    2024-07-17 19:50:04       22 阅读