在国行小米 HyperOS 上,将“长按电源键唤起超级小爱”替换为 Gemini Overlay。
模块会自动选择 Google 数字助理、开启屏幕内容与截图辅助,并在重启后恢复被 HyperOS 重置的助手设置。无需手动修改系统设置数据库。
- 国行 HyperOS 设备
- Android 11 及以上
- 已安装并完成初始化的 Google App 和 Gemini
- 已安装 LSPosed,且能够为模块授予
android系统框架作用域
本模块针对 HyperOS 的系统实现编写,不建议在非小米 ROM 上启用。
- 长按电源键显示 Gemini Overlay,而不是打开 Gemini 普通应用界面
- 禁止超级小爱重新启用“电源键唤醒”
- 将系统语音助手、语音交互服务和语音识别服务设置为 Google
- 开启助手读取屏幕文字与截图的权限开关
- 将系统长按电源键行为设置为“数字助理”
- 在开机和用户解锁时恢复被 HyperOS 重置的助手设置
- 支持 Android 多用户分别写入助手设置
- v1.0.6 起,每次唤起 Overlay 前会先清理旧的 VoiceInteraction 会话,减少 Gemini 因网络异常或上次半启动后只在屏幕边缘闪一下的问题
- v1.0.7 修复 HyperOS 将透明 Gemini Live 会话误判为全屏不透明窗口,导致浅色页面 状态栏白色字符无法自动反色的问题
- 从 Releases 下载并安装最新 APK。
- 在 LSPosed 中启用 GeminiMi。
- 作用域只勾选
android(系统框架)和com.miui.voiceassist(超级小爱)。 - 确认 Google App 和 Gemini 已安装,并至少手动启动过一次。
- 重启设备。
- 解锁后长按电源键测试 Gemini Overlay。
从 v1.0.7 起,本 Fork 的 Release APK 由 GitHub Actions 使用固定发布证书签名,文件名为
GeminiMi-<版本号>.apk。同一签名的后续版本可以直接覆盖安装。此前安装 Debug APK 的
用户需要先卸载一次,并在安装正式版后重新启用 LSPosed 作用域。请勿混用不同来源或
不同签名的 APK,否则 Android 会拒绝升级。
长按电源键没有反应时,先执行:
adb logcat -s "[GeminiMi]"
正常情况下应看到类似日志:
PowerKeyOverlay hooked 1 method(s)
hooked PhoneWindowManager#...
assistant settings write success=true verified=true
常见情况:
hooked 0 method(s):当前 HyperOS 版本使用了未知的方法名,需要针对该 ROM 适配。showSessionForActiveService failed:当前 ROM 的隐藏系统接口签名不同,请在 Issue 中附上完整日志。- 弹出 Gemini 普通应用而非 Overlay:确认 Google App 的数字助理已切换为 Gemini,并重启设备。
- 屏幕边缘闪一下但 Overlay 没停留:通常是 Google/Gemini 的旧 VoiceInteraction 会话卡住。 v1.0.6 会在每次唤起前执行保守复位;升级后请重启设备,让 LSPosed 重新加载模块。
- 重启后仍是小爱:确认 LSPosed 作用域包含
android和com.miui.voiceassist。
反馈问题时请提供设备型号、HyperOS/Android 版本、Google App/Gemini 版本和上述日志。
- HyperOS 不同版本会修改
PhoneWindowManager方法名,不能保证所有设备无需适配。 - Android 16 / HyperOS 3 已适配带 attribution tag 的助手会话接口。
- Overlay 依赖 Google App 的 VoiceInteractionService;仅安装 Gemini、不安装 Google App 无法工作。
- 模块会在用户解锁时重新写入 Google 助手设置。系统完成启动后,仍允许用户手动切换 其他数字助理。
- 模块运行在系统框架中。启用前请确保设备具备可用的 LSPosed 救砖/安全模式方案。
本 Fork 额外扫描 HyperOS 的 BaseMiuiPhoneWindowManager 和
MiuiPhoneWindowManager,用于适配部分 HyperOS 2 国行 ROM 将长按电源键逻辑放在
小米策略子类、并直接启动超级小爱的情况。只有 Gemini Overlay 成功启动时才拦截
原方法;启动失败会继续执行系统原逻辑,避免长按电源键失效。
针对 HyperOS 2.0.15.0,模块还会精确 Hook
ShortCutActionsUtils#launchVoiceAssistant(String, Bundle)。仅当快捷键来源为长按电源键
(long_press_power_key)或长按菜单键(long_press_menu_key)时转交 Gemini Overlay,
不影响耳机、语音唤醒或其他小爱入口。
从 v1.0.6 起,本 Fork 在调用 showSessionForActiveService() 前会先调用
hideCurrentSession() 并等待 120ms,再显示新的 Gemini Overlay。这是保守复位方案,
用于处理无 VPN、网络异常或 Google/Gemini 半启动后残留旧助手会话的问题。代价是每次
唤起可能增加约 120ms 延迟。
从 v1.0.7 起,GeminiStatusBarHook 会在 HyperOS 的
DisplayPolicy#applyPostLayoutPolicyLw 中识别 Google App 创建的透明
TYPE_VOICE_INTERACTION 窗口,并跳过它对系统栏外观的错误接管。Gemini Live 收起时,
状态栏继续继承底层应用的浅色/深色外观;Live 展开后仍由 FloatyActivity 正常控制,
因此黑色全屏界面保持白色图标。Hook 仅匹配 Google App、透明像素格式和语音交互窗口,
其他应用及普通窗口不受影响。
该修复已在 Redmi K80 Pro、HyperOS 2.0.15.0、Android 15、Google App 17.18.24 上实机验证。
本项目 Fork 自 SherlockChiang/Gemini-mi。 感谢原作者 SherlockChiang 完成 GeminiMi 的原始设计、 HyperOS/LSPosed 适配与开源发布。本 Fork 仅在原项目基础上补充特定 HyperOS 2 ROM 的 电源键策略类兼容性,以及长按菜单键启动 Gemini Overlay 的适配。
PowerKeyOverlayHook接管 HyperOS 的长按电源键和长按菜单键助手入口,通过系统语音 交互服务显示 Overlay。AssistantPersistHook设置并验证 Google 助手相关的 Secure/Global 设置。GeminiStatusBarHook阻止透明 Gemini Live 会话覆盖底层应用的状态栏明暗外观。XiaoAiPowerKeyDisableHook精确覆盖超级小爱的power_wakeup偏好。
Hook 失败时会放行原系统逻辑,避免异常继续传播到 system_server。
使用 JDK 17 和 Android SDK 34:
gradlew :app:testDebugUnitTest :app:lintDebug :app:assembleRelease
未配置签名环境变量时,release 产物为:
app/build/outputs/apk/release/app-release-unsigned.apk
仓库通过 GitHub Actions 使用仓库 Secrets 中的固定发布证书自动构建签名版本,产物命名为
GeminiMi-<版本号>.apk。Release tag 使用
VersionCode-VersionName 格式,例如 2-1.0.1。
签名初始化和维护说明见:
scripts/setup-release-signing.ps1