OEM 电源管理
驯服激进的电池保护者
即使您完美地配置了所有内容并使用 POST_NOTIFICATIONS 请求前台服务,某些 Android 制造商 (OEM) 也会在其自定义 Android 分支(如 MIUI、EMUI、ColorOS)中构建专有的、高度激进的“电池保护”引擎。
无论标准 Android API 规则如何,这些激进的任务杀手都会在屏幕关闭几分钟后终止您的应用程序。 Tracelet 的 设置运行状况 API 提供了一套全面的套件来检测这些设备并自动将用户路由到正确的隐藏设置菜单以将您的应用程序列入白名单。
支持的制造商和行为
Tracelet 维护着超过 100 个 OEM 特定意图结构的内部注册表。当您调用 Tracelet.showPowerManager() 时,引擎会自动检测设备品牌并触发正确的深层链接。
以下是我们支持的主要 OEM 以及 showPowerManager() 的开放内容:
📱 小米 / POCO / Redmi (MIUI / HyperOS)
- 问题: MIUI 有一个众所周知的严格的“自动启动”管理器和一个“电池保护程序”,它会在睡眠 5 分钟后终止后台服务。
- Tracelet 打开什么: 1.隐藏的自动启动菜单(用户必须打开您的应用程序)。
- 特定的应用程序省电菜单(用户必须选择**“无限制”**)。
📱 华为/荣耀(EMUI)
- 问题: EMUI 的“应用程序启动”管理器会杀死应用程序,除非它们明确设置为手动管理。
- Tracelet 打开什么: 应用程序启动 设置屏幕。用户必须取消选中您的应用程序,并确保“自动启动”、“二次启动”和“在后台运行”均已启用。
- 问题: 如果应用程序在几天内没有打开,三星会积极地将它们添加到其“深度睡眠应用程序”列表中,从而永久切断所有后台执行。
- Tracelet 打开什么: 不受监控/永不休眠的应用程序菜单,允许用户将您的应用程序添加到永久白名单。
📱 OnePlus / Oppo(OxygenOS / ColorOS)
- 问题: 自动优化后台任务的积极“应用程序电池管理”。
- Tracelet 打开的内容: 应用程序自动启动 和 电池优化 屏幕。
📱 Vivo(Funtouch 操作系统)
- 问题: 限制应用程序在后台消耗高电量。
- Tracelet 打开的内容: 高后台功耗 白名单菜单。
🌐 其他设备和 DontKillMyApp
对于 Tracelet 深度链接引擎未明确涵盖的设备,或者如果您想了解特定制造商施加的确切技术限制,我们强烈建议您查看 DontKillMyApp.com 。这是一个令人难以置信的社区驱动资源,根据智能手机的后台任务积极性对智能手机进行排名,并为几乎所有 Android 设备提供手动配置步骤。
实施缓解流程
您应该在应用程序的入门流程中或在主仪表板上运行此检查:
import 'package:tracelet/tracelet.dart' as tl;
// 1. Check the device health
// Returns a Map<String, dynamic> containing the boolean flags
final health = await tl.Tracelet.getSettingsHealth();
// 2. Check if the device is a known aggressive OEM
if (health['isAggressiveOem'] == true) {
// 3. Check if the user has already whitelisted your app
if (health['isIgnoringBatteryOptimizations'] == false) {
// 4. Show a custom Flutter dialog explaining WHY they need to do this
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text("Background Tracking Required"),
content: Text("To ensure your route is recorded, please select 'No Restrictions' on the next screen."),
actions: [
TextButton(
onPressed: () async {
Navigator.pop(context);
// 5. Open the specific manufacturer's hidden power menu
// Returns true if the intent successfully launched the screen, false otherwise.
final success = await tl.Tracelet.showPowerManager();
if (!success) {
// Fallback: Open standard Android battery settings
await tl.Tracelet.openBatterySettings();
}
},
child: Text("Configure"),
)
]
)
);
}
}用户体验最佳实践: 切勿在应用程序启动后随机或立即调用 showPowerManager()。始终在其前面添加一个高度上下文相关的 Flutter UI 对话框。如果用户突然传送到一个可怕的“电池优化”系统屏幕,没有上下文,他们会惊慌并卸载您的应用程序。
实时驾驶员/车队跟踪可靠性
构建出租车、送货和车队应用程序的团队最常见的问题是:“Tracelet 能否在小米、Poco、Infinix、Tecno 和其他激进的 OEM 上全天保持跟踪?” 这是诚实、实用的答案。
Tracelet 自动处理什么
这些缓解措施适用于您 — 无需配置:
- 带有
FOREGROUND_SERVICE_TYPE_LOCATION的前台服务 — Android 授予的最高后台优先级。 START_STICKY— 操作系统在内存压力终止后重新创建服务。- OEM 安全唤醒锁 — 在华为上,PowerGenie 将唤醒锁标签列入白名单,因此该进程不会因持有“未知”唤醒锁而被终止。
- 启动接收器唤醒锁 —
BOOT_COMPLETED期间的短暂唤醒锁,因此进程会一直存在,直到重新启动后建立前台服务为止。 - 消费者 ProGuard/R8 规则 — 防止发布版本剥离服务、接收器和 Room 实体。
不可避免的手动步骤
没有后台位置库可以在用户不将应用程序列入白名单的情况下覆盖 OEM 终止。 MIUI、EMUI、ColorOS、HiOS/XOS 和类似的 ROM 故意忽略标准 Android 规则。在这些设备上,电池优化豁免 + 自动启动是全天可靠性的硬性要求 - 将它们视为必需的入门步骤,而不是可选的附加功能。
控制豁免驾驶员轮班的开始时间:
final ignoring = await tl.Tracelet.isIgnoringBatteryOptimizations();
final health = await tl.Tracelet.getSettingsHealth();
if (health['isAggressiveOem'] == true && !ignoring) {
// Walk the user through showPowerManager() + battery-optimization exemption
// BEFORE letting them go "on shift".
}检测 OEM 何时限制或终止跟踪
Tracelet.getHealth()— 一次调用会返回跟踪状态、提供程序状态、许可/授权、省电模式、电池优化豁免和挂起的未同步计数,并带有自动检测的警告。非常适合“设备健康”仪表板。onProviderChange事件 — 当定位服务/GPS 状态发生变化时触发。- 后端过时看门狗 - 每个修复都带有时间戳并持续存在,因此将每个设备的上次修复时间与服务器上的预期节奏进行比较,并标记流在几分钟内变得静默的设备(OEM 终止的经典签名)。
全天跟踪的推荐设置清单
- 请求**
Always/后台位置**权限,并提供清晰的理由流程。 - 运行带有持续通知的前台服务 — 连续跟踪是不可协商的。
- 设置
stopOnTerminate: false和startOnBoot: true,以便跟踪在应用程序关闭和重新启动后仍然存在。 - During onboarding, call
getSettingsHealth();如果isAggressiveOem为 true,请引导用户完成showPowerManager()和 电池优化豁免。 Gate shift-start onisIgnoringBatteryOptimizations(). - 使用HTTP 同步(批量上传),这样短暂的网络间隙就不会丢失数据。
- 添加后端过时看门狗,以便操作可以看到设备快速变黑。
- 在隐藏的支持屏幕中发送
tracelet_doctor(或getHealth()),以便可以在真实设备上诊断现场问题。
因为背景可靠性是特定于设备和 ROM 版本的,所以最值得信赖的“案例研究”是在实际目标设备组合上运行示例应用程序 + tracelet_doctor 一天 - 这比任何笼统的声明都更好地反映了现实世界的行为。