极米 H2 折腾记录 – AI 加持版

许愿式编程真神奇。

今年 2 月,我纯手工折腾了一次极米 H2 。当时 AI 辅助编程还没有到如此这般神奇的地步。

最近冒出来几个净化智能电视的项目,比如 https://github.com/Gathin23/cleanyourtv 。但我看它官方支持列表里面没有极米 H2 这么古早的机型(基于 Android 6.0),最低也得要 Android 8.0 。那么只能亲自指挥 AI 来干点活了。

我的思路是这样的:上次我卡在了自制刷机包这一步。如果是用原版系统,那么之后覆盖安装各种东西的时候都会有校验——那如果直接在刷机包里面给替换好,是不是就不用校验了。

论坛里面其实也是这么做的。只是我对当时对各种工具用得不熟练,做出来的刷机包刷不进去。现在有了 AI,能快速理解各种工具和代码的用法,考虑也会更全面一点。

动手之前

如何刷机

  1. 找一个 U 盘,最好是 USB2.0 的 U 盘,格式化为 FAT32,里面只放刷机包,名称为 GIMI_XHAD01_XHC05_MAXIM_YN_WMP.bin 。
  2. 关机,插到黑色 USB 口上。别插错。
  3. 长按电源键 10s 开机,就会自动刷了。

自制刷机包刷出问题了,那么换成官方未改过的原版刷机包,照上述流程重新刷一遍就好。还算比较安全。

准备工作

  1. 下载一个没改过的原版刷机包。之前的文章里列出了多个版本的下载地址,直接下载即可。我这次选择了最新的 18.55 版本。
  2. 下载一下 mstar-bin-tool 用于搞镜像签名。
  3. 准备个 docker 环境用来当工作环境。比如 Mac 上可以用 orbstack 或者 docker desktop 。

开始动手

开机自动启动 adb

这一步主要是为了让 AI 知道如何制作刷机包。直接给 AI 说

我现在有个极米 H2 的原厂刷机包。我需要开机自动启动 adb 。你需要给我实现一下。交付物为一个刷机包。
原厂刷机包地址为 xxx 。
辅助工具是 mstar-bin-tool,它的地址为 xxx 。
当前机器上有 uv 、有 homebrew 、有 docker,你缺什么东西就自己安装。
你你的工作目录为 xxx,所有中间结果、临时文件都必须放在工作目录里。

如果想减少一些 AI 的探索成本,可以再给点提示:

Custom XGIMI firmware packer for H2 (maxim).
Faithfully reproduces the original ~header_script.sh, swapping only:
  - system  : new LZO chunks (build/syschunks/chunk_0*.lzo)
  - boot     : new boot_new.img (raw, written via mmc write.p ... 1)
All other partitions reuse the ORIGINAL payload bytes from the source bin
(extracted via the original script's filepartload offset/size).

Structure:
  [16KB header script, 0xFF padded] [payloads, each 4KB aligned] [XGIMI footer]
XGIMI footer = merged_crc32(LE) + first16(header)
  where merged = header + bin + MAGIC("12345678") + header_crc32(LE)

精简自带的 APP

下面这些东西直接发给 AI,说「根据下面这个清单,在镜像里删除这些包」就好了。我已经验证过这样删除是安全的。

# XGIMI H2 v18.55 /system debloat — FINAL (verified booting 2026-10-25)
# Reflects the actual verified-working system_work.img. Every REMOVE below was
# flashed and confirmed to boot into the system normally.
# Base = stock system + adb-on-boot (boot.img). Launcher/upgrade NOT yet replaced,
# root NOT yet added (those three are the remaining first-boot-hang suspects,
# handled separately from debloat).
# Format: DIR | package | decision | reason

## === REMOVED (verified safe; device boots normally) ===
# -- third-party video / stats / mic --
priv-app/QiyiVideo                 com.gitvjimi.video          REMOVE  银河奇异果
priv-app/HunanOTT                  com.hunantv.license         REMOVE  芒果 TV
priv-app/TencentTV                 com.ktcp.tvvideo            REMOVE  云视听极光
priv-app/JOS                       com.jd.smart.tv.sdk         REMOVE  小京鱼
app/kuyunlogo                      com.kuyun.common.identifer  REMOVE  酷云 (广告/统计)
app/puremic                        com.loostone.puremic        REMOVE  纯麦 (麦克风)
vendor/bundled_app/TVSports        com.pptv.tvsports           REMOVE  CIBN 聚体育 (user added)
# -- XGIMI bloat / ads / voice / stores --
priv-app/XgimiAdService            com.xgimi.adservice         REMOVE  XgimiAdSdk/广告
priv-app/XgimiVoice                com.xgimi.duertts           REMOVE  极米语音/语音助手
priv-app/XgimiVoiceOffline         com.xgimi.voiceoffline      REMOVE  语音离线
priv-app/atmosphere_release        com.xgimi.atmosphere        REMOVE  任意门/天光云影
priv-app/XgimiAppMarket_inui       com.xgimi.newappmarket      REMOVE  应用市场
priv-app/XgimiSkinManager_release  com.xgimi.skinmanager       REMOVE  主题商城
priv-app/msgcenter                 com.xgimi.msgcenter         REMOVE  消息中心
priv-app/datareporter              com.xgimi.datareporter      REMOVE  系统日志 DR
priv-app/XgimiMusicPlayer          com.xgimi.doubanfm          REMOVE  极米音乐
priv-app/Instruction               com.xgimi.instruction30     REMOVE  玩机攻略
priv-app/IotService                com.xgimi.iot               REMOVE  物联网 iotService
priv-app/XgimiManager              com.xgimi.manager           REMOVE  投影管家 (无屏电视管家)
priv-app/screensaver               com.xgimi.screensaver       REMOVE  壁纸模式
priv-app/AccountManager_release    com.xgimi.account           REMOVE  极米服务/AccountManager (user: delete; verified safe)
app/RemoteDebug                    com.xgimi.remote            REMOVE  RemoteDebug
priv-app/xgimipaysdk               com.xgimi.payview           REMOVE  极米支付 sdk (user: delete this round)
app/xhplayer                       com.xgimi.xhplayer          REMOVE  XHPlayer 内置视频播放器 (user: delete this round)
priv-app/mediaPlayer               com.xgimi.gimiplayer        REMOVE  本地播放器 (user: delete this round)
app/mediaPlayer                    com.xgimi.gimiplayer        REMOVE  本地播放器 dup path (user: delete this round)
# -- redundant cast (keep wirelessscreen for AirPlay) --
app/Miracast                       com.xgimi.miracast          REMOVE  Miracast 投屏
app/MMCastDemo                     com.android.mcast           REMOVE  投屏 Demo

## === KEPT (XGIMI/Android/MStar originals; per user + task.md) ===
# -- user-decided keeps (originally flagged remove, user chose keep) --
priv-app/xgimiuser                 com.xgimi.user              KEEP    个人中心 (AMS protected whitelist — DO NOT remove)
priv-app/xgimiuiapi_838            com.xgimiui.api             KEEP    XgimiUiApi (user: keep)
# -- task.md required keeps --
priv-app/resManager                com.xgimi.filemanager       KEEP    资源管理器/File Manager (REQUIRED)
priv-app/vcontrol_release838       com.xgimi.vcontrol          KEEP    极米助手 (user: keep)
priv-app/wirelessscreen            com.xgimi.wirelessscreen    KEEP    极米投屏 (AirPlay)
vendor/app/setting                 com.android.newsettings     KEEP    系统设置 (REQUIRED)
# -- hardware / factory (kept for safety) --
app/camera_test_Z5X                com.xgimi.recamera          KEEP    对焦/camera(硬件) (user: keep)
app/XgimiBurnIn                     com.xgimi.burnin            KEEP    工厂烧机 (user: keep)
app/SmartCurtain                   com.xgimi.smartcurtain      KEEP    智能幕布 (硬件)
app/NewSounderMode                 com.xgimi.soundermodeservice KEEP   音频
app/XgimiService                   com.xgimi.xgimiservice      KEEP    core xgimi service (persistent)
app/BluetoothService               com.xgimi.bluetoothservice  KEEP    (persistent)
app/GimiSystemUI                   com.xgimi.systemui          KEEP    SystemUI (REQUIRED, persistent)
priv-app/GlobalConfig              com.xgimi.config            KEEP    Config
priv-app/XgimiBootwizard           com.xgimi.bootwizard        KEEP    启动向导 (stock, NOT patched)
priv-app/XgimiStreamPlayer_release838 com.xgimi.stream.media   KEEP    流媒体核心 (AMS protected whitelist — DO NOT remove)
priv-app/SogouIME                  com.sohu.inputmethod.sogou.tv KEEP  搜狗输入法 (system's only IME; user: keep)
vendor/app/MiniTvFactory           com.xgimi.minitvfactory     KEEP    MiniTvFactory
priv-app/XgimiHome_release838      com.xgimi.home              KEEP (STOCK) 
priv-app/update                    com.xgimi.upgrade           KEEP (STOCK) 
# -- Android / MStar core --
app/Bluetooth                      com.android.bluetooth       KEEP
app/Bluetooth3DService             com.mstar.bluetooth3dservice KEEP
app/BluetoothMidiService           com.android.bluetoothmidiservice KEEP
app/HTMLViewer                     com.android.htmlviewer      KEEP
app/LiveWallpapers                 com.android.wallpaper       KEEP
app/MTvFactory                     mstar.factorymenu.ui        KEEP
app/MTvMisc                        com.mstar.miscsetting       KEEP
app/MTvProvider                    com.mstar.android.providers.tv KEEP
app/MTvService                     com.mstar.tv.service        KEEP (persistent)
app/NoiseField                     com.android.noisefield      KEEP
app/UserDictionaryProvider         com.android.providers.userdictionary KEEP
app/webview                        com.android.webview         KEEP
priv-app/BackupRestoreConfirmation com.android.backupconfirm   KEEP
priv-app/DefaultContainerService   com.android.defcontainer    KEEP
priv-app/MediaProvider             com.android.providers.media KEEP
priv-app/OneTimeInitializer        com.android.onetimeinitializer KEEP
priv-app/PackageInstaller          com.android.packageinstaller KEEP (REQUIRED to install apps)
priv-app/SettingsProvider          com.android.providers.settings KEEP
priv-app/Shell                     com.android.shell           KEEP
priv-app/StatementService          com.android.statementservice KEEP
priv-app/TvProvider                com.android.providers.tv    KEEP

精简桌面

上回书说到,促使我想折腾投影仪的一大因素是,当前桌面东西太多了,哪儿哪儿都收费。我只用自己的投屏、只用自己的 Jellyfin,完全用不到自带的那些东西。

我尝试过换桌面。但是换过之后无法进首次开机向导。那么有一个比较折中的方案:改造现有桌面。

怎么改造?我发现在断网的情况下,桌面非常精简:只有已经安装了的 app,以及已经连上的视频源——足够了。

所以可以这样给 AI 提示:

我想屏蔽 Launcher 里所有推荐的东西,只想用我自己安装的 app 、看我自己投屏的内容。你需要:
1. 分析一下这个 Launcher 的行为。
2. 找到内置的「无网络页面"`NoNetworkPage`」,让桌面永远走`NoNetworkPage`。不要真去改全局网络检测,避免副作用影响其他功能。提示:切换页面的逻辑在`HomeFragment` 里。
3. 把这个页面的标题改名为「首页」,去除这个页面上面的「网络错误」的横幅图,避免让其他人误认为是报错。
4. 去掉这个页面左上角的 Logo,例如「芒果 TV」。
现在 adb 是开着的。你做好后直接 adb 推上去测试。

屏蔽系统升级

给 AI 说:

我需要屏蔽系统升级功能。需要做这几件事儿:
1. 在 Launcher 里,隐藏「系统升级」这个 app 。注意不要卸载它。推荐做法是把`com.xgimi.upgrade` 加进 `apps_notshow` 这个官方内置的「不显示」黑名单数组。
2. 在「系统设置」这个 app 里,关掉「自动升级」:`UpdatePresenter.getAutoUpdate()`恒返回`false`。
3. 在「系统设置」这个 app 里,隐藏「自动升级」和「在线升级」菜单。菜单结构定义在`assets/settings_Product_mh01.ini`(其实是个 json)。
4. 在「系统升级」这个 app 里,`getUpgradeOTAInfo` /`getUpgradeApkInfo` /`getUpgradeReplaceApkInfo` 均直接返回失败或空,避免发送请求和获取真实数据。

也可以只发需求,不发实现方案,但这样会比较慢:如果让 AI 自己完全从头理解,这一步耗时 4 小时左右。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

一条对“极米 H2 折腾记录 – AI 加持版”的回复

  1. […] 欲知后事,请移步 AI 加持版。 […]