# 程序组

Android 系统的 Shared User ID 机制允许多个应用享有相同的 Linux user ID 及 Android 权限,相互访问文件甚至运行在同一个进程。这些应用需要有具有相同签名。Shared User ID 不可在安装后更改。为了简化理解难度,我们在存储空间隔离内称 Shared User ID 机制为程序组。

这意味着:

  • 一些没有存储权限的应用实际可以使用存储空间
  • 多个应用可以运行在同一个进程

隔离作用于进程层面。在 v4.0.0 之前的版本中,只有 package name 被用作判断,这显然会产生问题。

# 例子

媒体存储、下载管理器、下载管理器 UI、MTP 主机拥有同一个 Shared User ID android.media,其中媒体存储和下载管理器都设定了 android:process="android.process.media"。因此媒体存储和下载管理器运行在同一个进程。

在 MIUI(或许还包括其他重度修改的系统)中,下载管理器有滥用存储空间的行为,因此用户会选择为其启用隔离并只允许其访问 Download 文件夹。但由于媒体存储也运行同一进程,因此媒体存储实际也只能访问 Download,这会造成用户相册无法更新。

另外,Shared User ID 机制可以做到使没有存储权限使用存储空间。同样是 MIUI(或许还包括其他重度修改的系统),用户会没有机会为这样的应用启用隔离,因为在旧版本中它们不会被展示。

因此 v4.0.0 后让相同 Shared User ID 的应用使用相同的设定可以解决这个问题。

# 行为

假设有两个应用 com.example com.example2,它们的 Shared User ID 是 example

  • 使用相同的设定(在内部被视为“同一个应用”)
  • 隔离存储空间位置位于 Android/data/shared-example
  • 可相互访问应用专有文件夹