许愿式编程真神奇。
今年 2 月,我纯手工折腾了一次极米 H2 。当时 AI 辅助编程还没有到如此这般神奇的地步。
最近冒出来几个净化智能电视的项目,比如 https://github.com/Gathin23/cleanyourtv 。但我看它官方支持列表里面没有极米 H2 这么古早的机型(基于 Android 6.0),最低也得要 Android 8.0 。那么只能亲自指挥 AI 来干点活了。
我的思路是这样的:上次我卡在了自制刷机包这一步。如果是用原版系统,那么之后覆盖安装各种东西的时候都会有校验——那如果直接在刷机包里面给替换好,是不是就不用校验了。
论坛里面其实也是这么做的。只是我对当时对各种工具用得不熟练,做出来的刷机包刷不进去。现在有了 AI,能快速理解各种工具和代码的用法,考虑也会更全面一点。
动手之前
如何刷机
- 找一个 U 盘,最好是 USB2.0 的 U 盘,格式化为 FAT32,里面只放刷机包,名称为
GIMI_XHAD01_XHC05_MAXIM_YN_WMP.bin。 - 关机,插到黑色 USB 口上。别插错。
- 长按电源键 10s 开机,就会自动刷了。
自制刷机包刷出问题了,那么换成官方未改过的原版刷机包,照上述流程重新刷一遍就好。还算比较安全。
准备工作
- 下载一个没改过的原版刷机包。之前的文章里列出了多个版本的下载地址,直接下载即可。我这次选择了最新的 18.55 版本。
- 下载一下 mstar-bin-tool 用于搞镜像签名。
- 准备个 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 小时左右。
发表回复