/// Android Root 权限的持久化检查状态,枚举名写入本机 sysJson,不能随界面文案调整。 enum RootAccessStatus { /// 尚未完成过有效检测,包含旧版本配置升级后的默认状态。 unknown, /// `su -c id` 在超时内成功返回且输出确认当前 UID 为 0。 available, /// Root 被拒绝、命令不存在、执行超时或返回结果未确认 UID 为 0。 unavailable, } /// 单次 Root 检查结果,原生层负责命令执行,Flutter 负责持久化和界面反馈。 class RootAccessCheckResult { /// 创建一份带检查时间与诊断摘要的 Root 结果。 const RootAccessCheckResult({ required this.status, required this.checkedAt, required this.diagnostic, }); /// 本次检查得出的可用状态。 final RootAccessStatus status; /// Flutter 收到原生检查结果的本地时间。 final DateTime checkedAt; /// 可供运维排查的简短摘要,不保存完整命令输出或敏感环境信息。 final String diagnostic; /// Root 是否已经通过真实命令验证。 bool get available => status == RootAccessStatus.available; /// 从原生 MethodChannel 结构化结果创建检查记录,未知编码按不可用处理。 factory RootAccessCheckResult.fromMap(Map? data) { final available = data?['available'] == true; final diagnostic = data?['message']?.toString().trim(); return RootAccessCheckResult( status: available ? RootAccessStatus.available : RootAccessStatus.unavailable, checkedAt: DateTime.now(), diagnostic: diagnostic?.isNotEmpty == true ? diagnostic! : available ? '已确认 uid=0' : '未获得 Root 权限', ); } }