50 lines
1.7 KiB
Dart
50 lines
1.7 KiB
Dart
/// 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<dynamic, dynamic>? 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 权限',
|
|
);
|
|
}
|
|
}
|