Android Automotive 中的闪存磨损管理

Android Automotive 内部存储设备使用了支持上千次清空/写入周期的嵌入式多媒体卡 (eMMC);如果 eMMC 发生故障,系统可能会变得无法使用。由于汽车的使用寿命较长(通常为 10 年以上),因此 eMMC 必须非常稳定可靠。本页面介绍了 eMMC 行为,以及 OEM 如何降低 eMMC 发生故障的风险(从而避免 Android Automotive 系统发生故障)。

eMMC 行为

eMMC 设备使用耗损均衡技术来解决清空/写入限制的问题,具体方法是在整个系统内均匀地放置数据和分配写入操作(避免单个块因密集写入而发生故障)。eMMC 的预计使用寿命取决于以下因素:

  • 写入量。在手机上,每天写入内部存储设备的数据量可能会超过 10GB。在 Android Automotive 实现中,由于应用数量有限,我们无法提供有关会有多少数据写入的真实数据。不过,据我们观察,当用户流式传输高品质音乐和使用导航时,每分钟写入 eMMC 的数据有 50MB。未来,可能会出现其他类型的写入密集型应用,例如持续录制和存储视频的中控台摄像头应用。另外,有些汽车是每天都会有几个小时处于行使状态的共享车辆。由于这些原因及其他原因,我们预计 Android Automotive 实现会面临比手机更多的 eMMC 写入量。
  • 写入模式。写入和清空操作是在块中进行的。 与不太频繁地在较大的区块中写入数据相比,在较小的区块中频繁地写入相同的数据量会更快地磨损 eMMC。
  • eMMC 的可用空间。较大的存储空间意味着耗损均衡算法可以将写入分摊到较多的块中。
  • 耗损均衡技术。
  • 环境因素。例如:工作温度范围通常介于 -20 和 85 摄氏度之间;如果温度超出此范围,eMMC 的使用寿命会进一步缩短。

对于具有 16GB 可用空间和 3000 次清空/写入周期的 eMMC,我们估算的数据如下:

日写入量 16GB 32GB
预计使用寿命 10 年 5 年

不过,随着可用存储空间的减少,系统可能会早在 eMMc 彻底磨损之前就停止正常运行,并且根据所使用的均衡技术和写入模式,eMMC 的使用寿命甚至可能会更短。此外,这方面的估算并没有将行为异常的应用或恶意应用的影响考虑在内,这些应用可能会在没有特殊权限的情况下将大量垃圾数据写入 eMMC 来攻击 Automotive 系统。

要在潜在的 eMMC 故障实际发生之前就检测出来,应将适当的存储设备运行状况监控功能整合到整体系统运行状况监控功能中。

实现

借助 Android O 支持的功能,OEM 可以保护和监控 Android Automotive 的内部存储设备,并延长其使用寿命。

限制第三方应用

为了保护 Android Automotive 系统的内部存储设备,Android O 支持 OEM 配置是否允许第三方应用安装在内部存储设备中(应用只能向其安装所在的分区写入数据)。要进行配置,请在资源叠加层中设置以下配置:

<bool name="config_allow3rdPartyAppOnInternal">false</bool>

减少闪存磨损

如果 OEM 担心内部存储设备上的闪存磨损问题,也可以增加 SD 卡,SD 卡支持足够快的数据写入速度,可用作合并存储设备。SD 卡具有以下行为:

  • 合并时,SD 卡会被加密,可以安全存储应用数据。
  • SD 卡槽必须位于安全的位置(不要让用户频繁移除 SD 卡)。
  • SD 卡不能用于在 Automotive 系统和计算机之间传输数据。
  • 弹出 SD 卡不会影响正在运行的系统。不过,除非需要更换,否则不应移除 SD 卡。

要确保第二方应用(由汽车应用开发者构建的应用)可以安装在 SD 卡上(如果汽车提供授权的话),汽车应用开发者必须将 android:installLocation=["auto" | "preferExternal"] 纳入应用的清单文件中。

如果汽车禁止将第三方应用安装在内部存储设备上(如限制第三方应用中所述),则在没有上述标记(或者如果配置了 installLocation=internalOnly 设置)的情况下,应用安装将会失败。

使用 storaged 获取磁盘指标

Android O 中引入了 storaged,这是一个新的系统服务,会对磁盘指标和 eMMc 指标进行采样并发布,例如有关总体磁盘使用情况、估算的 eMMC 使用寿命和磁盘 I/O 统计数据(按应用统计)的信息。当内部存储设备开始出现故障或特定应用执行的磁盘 I/O 过多时,OEM 可以使用这些信息来向用户发出警告。有关详情,请参阅实现 storaged

验证

此功能在 PackageManager 测试中进行测试。