Skip to content

好的,让我们更全面地深入 Android 文件系统的各个方面,包括所有主要目录及其用途,以及文件系统的架构和管理。

1. Android 文件系统结构

Android 文件系统主要由以下几个重要目录组成,每个目录都有其特定的功能和数据存储方式:

  1. 根目录(/)

    • 文件系统的起始点,所有其他目录都在此之下。
  2. /system

    • 存储 Android 操作系统核心文件和系统应用程序。
    • 包含 /system/app/system/priv-app 目录,分别存放系统应用和具有特权的系统应用。
    • 该目录通常是只读的,除非设备经过 root 权限或系统更新。
  3. /data

    • 存储用户应用的数据,是 Android 文件系统中最重要的部分。
    • 每个应用在此目录下都有一个独立的子目录,路径为 /data/data/<package_name>/,存储应用的私有数据(如数据库、文件等)。
    • 包含 /data/app 目录,存放已安装的 APK 文件。
    • 该目录通常只能被应用自身访问,确保数据安全。
  4. /cache

    • 用于存储临时文件和缓存数据,例如应用的缓存内容。
    • 存储的文件在设备需要空间时可能被清除。
  5. /vendor

    • 存储由设备制造商提供的自定义硬件驱动和系统组件。
    • 允许硬件制造商为特定设备添加自定义功能而不影响 Android 操作系统的核心部分。
  6. /storage

    • 包含外部存储的目录,通常映射到设备的 SD 卡或内部存储。
    • 包括 /storage/emulated/0/ 代表用户的外部存储,通常是可访问的。
  7. /proc

    • 虚拟文件系统,提供关于系统进程和内核的信息。
    • 主要用于调试和监控,不是应用程序存储数据的地方。
  8. /sys

    • 另一个虚拟文件系统,用于提供关于内核和系统硬件的信息。
    • 包含设备驱动程序的信息,可以通过此目录监控硬件状态。
  9. /dev

    • 包含设备文件,用于与硬件设备进行交互。
    • 主要用于底层硬件访问。
  10. /mnt

    • 用于挂载外部存储设备的点,通常会包含指向实际存储位置的符号链接。
  11. /lost+found

    • 在文件系统崩溃后,存放恢复的文件碎片。

2. 其他重要概念

  • 文件权限和安全性

    • Android 应用使用 Linux 权限模型,每个应用作为独立的用户运行。
    • 应用需在 AndroidManifest.xml 中声明权限,某些权限(如外部存储)需要在运行时请求。
  • 存储选项

    • 内部存储:适合存储私有数据,应用使用 Context.getFilesDir() 获取路径。
    • 外部存储:适合存储可共享数据,使用 Environment.getExternalStorageDirectory() 获取路径。
    • 缓存存储:使用 getCacheDir()getExternalCacheDir() 存储缓存数据。
  • 数据持久性

    • SQLite 数据库:适用于结构化数据存储,使用 SQLiteOpenHelper 类进行管理。
    • SharedPreferences:适用于保存轻量级的键值对数据。

3. 文件操作的代码示例

以下是一些常见的文件操作示例,展示如何在 Android 中读取和写入文件:

写入文件到内部存储

java
String filename = "example.txt";
String fileContents = "Hello, Android!";
try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) {
    fos.write(fileContents.getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

从内部存储读取文件

java
try (FileInputStream fis = openFileInput(filename)) {
    StringBuilder stringBuilder = new StringBuilder();
    int c;
    while ((c = fis.read()) != -1) {
        stringBuilder.append((char) c);
    }
    String fileData = stringBuilder.toString();
    Log.d("FileData", fileData);
} catch (IOException e) {
    e.printStackTrace();
}

使用 External Storage API 写入文件

java
String fileName = "external_example.txt";
File file = new File(Environment.getExternalStorageDirectory(), fileName);
try (FileOutputStream fos = new FileOutputStream(file)) {
    fos.write("Hello from external storage!".getBytes());
} catch (IOException e) {
    e.printStackTrace();
}

Released under the MIT License.