Repository navigation
Releases: hupanxiaozhu/XiaomiBrowserTuner
Release list
v1.15.13 — 优化广告拦截
小米浏览器净化模块 v1.15.13
LSPosed 模块,给小米浏览器(com.android.browser)加去广告 / 界面精简 / MIUI X 风格设置界面。
本版重点:优化广告拦截
- 新增「内置推荐规则」开关(默认关):把 EasyList China + ADgk 合并去重后的 2.8 万条规则内置进 APK —— 打开即用,不用自己去找规则文件、不需要联网,并随模块版本自动更新。
- 新增「规则自动更新」开关(默认开):对你自己用 URL 导入的规则集生效,打开应用时自动重新下载(24 小时至多一次,失败静默);规则管理页也可随时手动更新。
- 顺带:单个规则集的下载上限 512 KB → 8 MB(旧的静默截断会让 anti-AD 丢掉 77% 的规则);引擎补跨规则集去重,重复规则不再白占容量。
从 1.15.9 起,规则库的跨进程通道与容量上限也做过三层升级(分片 → gzip → 跨组,域名桶 120,000 / 正则 12,000)。细节见 CHANGELOG.md。
环境要求
| 项 | 版本 |
|---|---|
| 宿主(小米浏览器) | 20.27.1010901(其它 20.x 未验证) |
| 框架 | LSPosed 2.x 及以上(libxposed API 102) |
| 系统 | Android 8.0+(minSdk 26) |
安装
- 安装下面的 APK;
- 在 LSPosed 里启用模块,作用域勾选「小米浏览器」,然后重启浏览器;
- 打开模块应用 →「规则」Tab → 打开「内置推荐规则」。
怎么确认生效:宿主日志里出现 【规则】用户 N 组(…,含内置推荐规则)(日志路径 /data/adb/lspd/log/modules_*.log)。
安装包信息
| 项 | 值 |
|---|---|
| 文件 | XiaomiBrowserTuner-v1.15.13.apk |
| 大小 | 11,654,017 字节(11.11 MiB) |
| 版本 | versionCode 52 / versionName 1.15.13 |
| SHA-256 | efed4a6245477a6b5e271f3dfb4579dc31ee33eff6a076b40b5a46e502fa5507 |
校验:certutil -hashfile XiaomiBrowserTuner-v1.15.13.apk SHA256
⚠️ 免责
仅供学习研究使用,请勿用于商业用途。本项目与小米公司无关,相关商标归原公司所有。详见 LICENSE。
XiaomiBrowserTuner v1.15.8
XiaomiBrowserTuner v1.15.8
小米浏览器(com.android.browser)的净化 / 增强模块,适配宿主 20.27.1010901。
本版重点:宿主明明装了,卡片却说「未安装」
- 症状:功能页顶部状态卡显示「小米浏览器 未安装」,但功能实际全部生效。
- 根因:
AndroidManifest.xml少了一条包可见性声明。本模块targetSdk 34,从 Android 11 起系统会按「包可见性」过滤PackageManager#getPackageInfo—— manifest 里没在<queries>声明过的包一律看不见,抛NameNotFoundException,而读取处用runCatching吞掉异常后回落到「未安装」。 - 为什么功能是好的:LSPosed 的 hook 与 DEX 加载都不走
PackageManager,只有模块进程里查别的应用会中招 —— 所以这只是块显示错的卡片,不影响任何功能。 - 修法:manifest 补
<queries><package android:name="com.android.browser" /></queries>;文案不再断言「未安装」,读不到时显示「未检测到」+「可能未安装,也可能是系统限制了模块查看其它应用(不影响功能生效)」;两处重复的宿主版本读取抽成readHostVersion()。
⚠️ 升级后仍显示「未检测到」怎么办:大概率是装了**隐藏应用列表(HMA)**这类模块 —— 它在应用侧再过滤一层PackageManager,声明<queries>也挡不住,把本模块从那个模块的作用域里移除即可。另一种情况是你真的没装小米浏览器,那显示就是对的。
环境要求
| 项 | 要求 |
|---|---|
| 宿主 | 小米浏览器 com.android.browser 20.27.1010901 |
| 框架 | LSPosed —— 需支持 libxposed API 102,即 2.x 及以上 |
| 系统 | Android 8.0+(minSdk 26) |
安装
- 安装本 APK(与 1.10.1 起各版同签名
CN=hupan,可直接覆盖安装) - 在 LSPosed 里启用模块,作用域勾选「小米浏览器」
- 确认装好了:打开模块 → 「关于」页显示 1.15.8(versionCode 47);功能页顶部应显示「小米浏览器 20.27.1010901」+「版本匹配」
安装包信息
- 文件:
XiaomiBrowserTuner-v1.15.8.apk - 大小:11,288,647 字节(10.77 MiB)
- 签名:
CN=hupan(SHA-256613629be76c524ddfeb0517b05750456ca5962e618bfa5f751fca897fc090aca) - SHA-256:
9f9179aca17fd197a412a620fc5cf1bf22dbca651414af3786f0aff8d72c318a
sha256sum XiaomiBrowserTuner-v1.15.8.apk致谢
感谢 QQ 用户 ai 与 酷安用户 @XiaoLuZhou 反馈这个问题 —— 现象定位与复现条件都来自他们的反馈。
完整更新日志:CHANGELOG.md
XiaomiBrowserTuner v1.15.7
XiaomiBrowserTuner v1.15.7
本版合并了 1.15.5 / 1.15.6 / 1.15.7 三版改动(前两版未单独发版)。
小米浏览器(com.android.browser)的净化 / 增强模块,适配宿主 20.27.1010901。
本版重点
1.15.5 —— 主页快捷方式多行时滑动掉帧
症状很集中:关掉开关不卡;3 / 4 行一屏放得下、不滚动也察觉不到;只有 5 行需要上下滚动时才掉帧。
根因:滚动会反复触发宿主 BrowserQuickLinksPage$QuickLinksPanel#onLayout,而本功能的 after 回调每次都要完整跑一遍,三处开销正好叠在这条热路径上 —— ① 开关判断走 Config.on(),本地快照过期时(1s TTL)会做一次跨进程读,压在帧内;② 一次回调反射读 7 个字段,而字段查找没有缓存,每次重新 getDeclaredField + setAccessible(true);③ hook 适配器对「纯 after」的回调也照做一遍参数快照(数组拷贝 + 逐元素比较)。
修法:热路径改走只读快照 onCached()(只读本地缓存、绝不发起跨进程刷新,刷新交给低频调用点)、反射层按「运行时类 + 字段名」缓存 Field、before 为空时跳过参数快照;另加一条零反射早退 —— 站点格没超过原生 9 个时,宿主写死的位置 9 本来就是对的,直接放行(开关关着、或站点本来就不多的用户,这个回调里一个反射都不做)。
1.15.6 —— 「主页快捷方式行数」支持最多 10 行
新增「最多 10 行」档(原 3 / 4 / 5 行)。机制完全不变:上限 = 行数 × 每行个数 − 1,5 列时 3 行 14 个 / 4 行 19 个 / 5 行 24 个 / 10 行 49 个站点格。站点不足上限时按实际数量铺,不补空格子。
⚠ 10 行格子数是 5 行的两倍多,内容高度远超一屏、必定要滚动;宿主是自绘网格且没有 view 复用,绘制成本随行数线性上升。1.15.5 优化掉的是模块自身的 hook 开销,绘制属于功能的固有代价。
1.15.7 —— 新增「主页滚动回弹」开关
去掉简洁版主页滚到顶部 / 底部时的回弹(弹性过冲)动画,同时不再出现「滚到底部被强制显示搜索栏」。这两件事在宿主里是同一套逻辑 —— 回弹把搜索栏带了出来。
简洁版主页的滚动容器是自绘的 homepage.infoflow.view.InfoFlowScrollView(extends FrameLayout,不是原生 ScrollView),回弹走 View#overScrollBy 那条路。开启后在容器首次布局时做两件事:overScrollMode = OVER_SCROLL_NEVER(框架层不再有边缘光晕与 Android 12+ 的过冲效果)、mOverscrollDistance / mOverflingDistance 置 0(容器传给 overScrollBy 的允许越界距离,回弹幅度的直接来源)。同一容器类在信息流页也复用,那里按 mIsSimpleHome 区分、保留原生手感。
默认关闭。
本版涉及的开关
| 开关 | 默认 | 作用 |
|---|---|---|
| 主页快捷方式行数 | 关 | 主页快捷方式网格的行数上限(3 / 4 / 5 / 10 行) |
| 主页滚动回弹 | 关 | 去掉主页滚到边界的回弹动画,同时不再强制显示搜索栏 |
📌 没有这两方面需求的话,不用打开它们。 两个开关默认都是关闭的,不开就是宿主原样,不影响任何其他功能。
环境要求
| 项 | 要求 |
|---|---|
| 宿主 | 小米浏览器 com.android.browser 20.27.1010901 |
| 框架 | LSPosed —— 需支持 libxposed API 102,即 2.x 及以上 |
| 系统 | Android 8.0+(minSdk 26) |
安装
- 安装本 APK(与 1.10.1 起各版同签名
CN=hupan,可直接覆盖安装) - 在 LSPosed 里启用模块,作用域勾选「小米浏览器」
- 确认装好了:打开模块 → 「关于」页显示 1.15.7(versionCode 46)
安装包信息
- 文件:
XiaomiBrowserTuner-v1.15.7.apk - 大小:11,288,595 字节(10.77 MiB)
- 签名:
CN=hupan(SHA-256613629be76c524ddfeb0517b05750456ca5962e618bfa5f751fca897fc090aca) - SHA-256:
eaa57b7696a806cc34c0f63eca0cc3301f70c2ee148e39e13aa9459a4a3f56ab
sha256sum XiaomiBrowserTuner-v1.15.7.apk致谢
感谢酷安用户 @酩安小煸 反馈「快捷方式解限后滑动明显掉帧」,并提出行数上限的需求 —— 才有了 1.15.5 / 1.15.6 这两版。
完整更新日志:CHANGELOG.md
XiaomiBrowserTuner v1.15.4
XiaomiBrowserTuner v1.15.4
本版合并了 1.15.3 与 1.15.4 两轮改动(1.15.3 未单独发版)。
修复
1.15.3 —— 打开下载链接直接闪退
用浏览器打开下载链接(如各种 .zip)会直接闪退,取消模块即正常。这不是某个链接的问题,而是普通文件下载必崩。
「下载弹窗」开关(ui_download,默认开)里挂着一条 download.CommonDownloadDialogImpl#onCreateDialog 的 before hook,把返回值置成 null(意图是「不建下载弹窗」)。而宿主对返回值不判空:
// com.android.browser.DownloadDialogFragment#onCreateDialog(宿主 20.27 反汇编)
Dialog v2 = downloadDialogInter.onCreateDialog(getArguments()); // ← 我们置 null
v2.setCanceledOnTouchOutside(true); // ← 无 if-eqz,直接 NPE
return v2;再往上一层 androidx DialogFragment 也是 mDialog = onCreateDialog(...) 之后立刻 setupDialog(mDialog, style),同样不判空。且异常抛在 hook 回调之外,模块自己的 try 接不住 —— 宿主当场闪退。
现在改为不再拦弹窗本身,只拦弹窗内的推广(不请求小游戏推荐数据 + after 把推荐卡置 GONE)。顺带修掉一个更根上的问题:弹窗是下载的确认入口(真正发起下载由弹窗按钮触发),把它整条拦掉等于下载永远开始不了。
1.15.4 —— APK 下载时仍有「应用商店审核版本」与推广
1.15.3 只处理了普通文件那条路,漏了 APK 场景。宿主 20.27 的实际结构:
① APK 与普通文件下载共用同一个弹窗。 DownloadDialogFragment 只在「带风险信息」时换成 WarnDownloadDialogImpl,其余一律 CommonDownloadDialogImpl。后者按 BaseDownloadDialogImpl#mDownloadFromMarket 二选一加载布局:
mDownloadFromMarket |
布局 | 特征 |
|---|---|---|
true |
download_dialog.xml |
「应用商店安装包」标题 + 「官方检测 / 安全」标签 + 「原安装包」 |
false |
download_dialog_normal.xml |
同一套商店区(初始 INVISIBLE,有商店版时才显示)+ 小游戏推荐卡 |
两份布局都带商店区,只有显隐条件不同 —— 这就是「小米应用商店审核版本」的来源。
② 第二条链路:下载引导卡(com.android.browser.guidecard)。BrowserTab#setTab 时创建 GuideCardManager,页面加载完成后预取该页的「官方版应用」信息(请求里带 oaid / miuiVersion 等设备字段),预取回来直接弹一张贴屏幕底部的卡:标题「识别到你可能在找的资源:」,底部文案「“安全守护”已提供应用商店上架版本」。
变更
CommonDownloadDialogImpl#onCreateDialog的 after 兜底从「只关推荐卡」扩到mGameRecommendCard+tvStoreTitle+rlStore(商店区标题与容器)。只改可见性,不动任何按钮 —— 「原安装包 / 下载」入口照旧可用。- 新增
guidecard.GuideCardManager#{startGuideInfoRequest, tryShowCard}与guidecard.GuideDownloadCardView#show三处 hook:前者是所有预取请求的唯一出口(fetchGuideInfoOnPageFinished与prefetchGuideInfo都调它),第二条是卡的唯一显示入口,第三条作兜底。三条里任一条挂不上都不会漏 —— 效果是「不预取、不上报、不弹卡」。 - 「下载弹窗」更名 「下载推广」(配置键
ui_download不变,已有设置不受影响):弹窗保留,只拦里面的推广。 - 更正 1.15.3 注释里的一处误判:
mDownloadFromMarket在宿主 20.27 里存在,而且正是下载弹窗选布局的依据(不是失效残留)。本模块不去改它,只收敛可见性。
致谢
感谢酷安用户 @闲云野鹤悠游林 反馈本问题(下载时的闪退与推广弹窗)—— 才有了 1.15.3 / 1.15.4 这两版的修复。
完整更新日志:CHANGELOG.md
XiaomiBrowserTuner v1.15.2
下载
XiaomiBrowserTuner-v1.15.2.apk —— versionCode 41 / 1.15.2,minSdk 26,签名 CN=hupan。
上一版 Release 是 v1.14.0;1.15.0 / 1.15.1 未单独发布,内容已并入本版。
1.15.2 (versionCode 41) —— 主页快捷方式行数(含界面修复;1.15.0 / 1.15.1 未发布,内容并入本版)
新增
- 「主页快捷方式行数」:给简洁版主页的快捷方式网格设一个行数上限,可选最多 3 / 4 / 5 行,
默认关闭。官方没有这项设置 —— 简洁版主页写死了「站点格数不超过 9」,也就是 5 列下最多 2 行,
再多只剩一个「更多」入口。
实现(对着宿主 20.27 反汇编核对过)
-
hook 目标是
homepage.SimpleVersionHomePage#getShowSiteCount(int),它返回主页网格实际铺几个
站点格。getShowSiteCount在宿主里有两个实现:BrowserQuickLinksPage(父类):return v1,恒等,入参原样返回;homepage.SimpleVersionHomePage(子类,extends BrowserQuickLinksPage):min(总数, 9),
那个 9 是父类静态常量SIMPLE_HOME_MAX_SITE_COUNT,被内联进子类字节码。
调用点写的是
invoke-virtual {this$0, total}, BrowserQuickLinksPage.getShowSiteCount:(I)I,
运行时虚拟派发只会落到子类重写;而全 APK 里没有任何地方直接new父类
(也没有第二个子类),所以 hook 父类等于什么都没挂。父类那一处仍作兜底保留。 -
上限 = 行数 × 每行个数 − 1,不是 −0:网格总格数 = 站点格数 + 1 个「更多」/「+」格,
宿主自己的默认值就是9 = 2 行 × 5 − 1(末行第一格留给「更多」)。每行几个读网格自己的
mNumsPerRow(手机 5 列,读不到时按 5 兜底)。 -
开关打开时无条件接管返回值:宿主自己的
min(总数, 9)在「9 到上限之间」这一段同样生效,
只在越界时才改等于没改。 -
多出来的站点不删不丢:宿主自己算
mMoreSiteCount = 总数 − 显示数,归进「更多」入口。
1.15.2 修的界面问题
-
主页第 2 行末格图标 / 文字叠在一起 —— 宿主的
QuickLinksPanel#onLayout对「更多」格有硬编码位置:pos = (child == mShowMoreQuickLink && isInSimpleHome()) ? 9 : i那个 9 =
SIMPLE_HOME_MAX_SITE_COUNT − 1,同样是内联常量。宿主的假设是「简洁版主页最多 9 个
站点格(位置 0~8),第 10 格留给『更多』」,所以显示数 ≤ 9时位置正好;一旦放开到 24,
第 10 个站点格和「更多」格同时落在位置 9 → 视觉上糊成一团,网格末尾还空一格。
现在在onLayout之后把「更多」格单独按它真实的 child 下标重排一次(公式照抄宿主,读
mNumsPerRow/mSpacingBetweenItemH/mSpacingBetweenItemV/mSpacingMarginItem/
mSpacingMarginTopInit/mIsLayoutRtl),它就回到网格末尾。原生场景算出来和宿主一致,天然幂等。 -
「母开关卡 + 它的下拉行」看着挤成一张卡 —— 两者原先各自画同色圆角背景、间距为 0,
圆角处连成一片。改为一张卡片组(EntryGroup+EntryDivider,组内一条细分割线),
与其它卡片一样留出组间距。涉及「User-Agent 伪装 + UA 伪装模式」「默认搜索引擎 + 选择引擎」
「主页快捷方式行数 + 行数」三组。
顺带查清的几件事(宿主 20.27)
- 主页网格是自绘的
BrowserQuickLinksPage$QuickLinksPanel(不是 RecyclerView);
尊享版那套homepage/quicklinkbox/QuickLinksViewGroup才走 RecyclerView + GridLayoutManager
(手机 5 列 / 大屏 7 列)。 - 数据源
QuickLinksDataProvider#getSites()全量返回,没有 SQL limit,manageSitesData只做过滤
(简洁版剔除mibrowser://video)。 - 容器
QuickLinkScrollView用mMaxHeight(屏幕可用高 − 底栏 − 71dp)做 AT_MOST 限制,
屏幕够高时放得下 4~5 行 —— 高度不是瓶颈,不用动。
未改动
功能开关表其余项、hook 逻辑、规则引擎与注入通道全部未动。
⚠ 已知语义
这是上限不是补齐:快捷方式不足 N 行时只显示自然行数,不补空格子
(也不能补 —— 宿主的铺格子循环是 for (i in 0 until show) sites[i - offset],
返回比总数大的值会越界崩主页)。想真的排到 4 / 5 行,得先有那么多快捷方式。
XiaomiBrowserTuner v1.14.0
本次包含 v1.13.0 与 v1.14.0 两个版本
上一版 Release 是 v1.12.1,中间两版只推了代码,故一并说明。
v1.14.0 —— 用户脚本
新增「用户脚本」:导入油猴式 .user.js,按脚本头部的 @match / @include / @exclude 匹配页面,页面加载完成后注入执行。管「加功能」——自动展开、去跳转中间页这类 CSS 做不到的事,与「自定义拦截规则」(拦与藏)互补。脚本管理并入「规则」Tab(列表 / 启停 / 删除 / 查看源码,与规则管理页同构)。
注入语义(与油猴的差别,导入时逐条说清):
- 只注入 http/https 页面,
nativechannel://等宿主内部页按 scheme 过滤,脚本不会注入进宿主 UI; document-start降级为加载完成后执行(不做 HTML 流改写);- GM_* API 不支持,声明过的脚本照常注入(有降级路径的能正常用)。
安全边界:总开关默认关 + 开启前风险确认;只支持本地文件导入(不做 URL 导入,避免远程代码供应链);metadata 检出 GM API / document-start / 全域匹配时弹确认浮层,用户点头才落盘;单脚本 380K 字符、共 64 个上限。
内部重构:把原来长在 CustomAdBlockFeature 私有方法里的「client 捕获 + onPageFinished 挂载 + evaluateJavascript 反射调用」抽成共享通道 webpage/PageInjection —— 原捕获以自定义规则开关为闸,只开脚本不开规则时通道根本挂不上,现在通道独立,CSS 隐藏与脚本注入各注册一个消费者。
v1.13.0 —— 检查更新
- 关于页新增「检查更新」:点按即查 GitHub Releases(
/releases/latest,无需 token)。发现新版本弹更新日志 + 下载入口,按钮跳浏览器(优先 APK 直链,退回 Releases 页),下载 / 校验 / 安装交给系统。 - 打开应用时自动检查:默认开启、每 24 小时至多一次(按上次成功检查时间节流),失败与「已是最新」一律静默,只有发现新版本才弹窗。
- 关于页新增「自动检查更新」开关:存独立本地 SP(组名
update),不进宿主开关表——宿主不需要这条数据。 - 零新增依赖:网络用 JDK 自带
HttpURLConnection,JSON 复用已有kotlinx-serialization-json。版本号按段比较(不字符串比较)。网络只发生在模块进程,hook 侧完全无感知。
未动的部分
去广告 / 界面精简 / 高级各功能的 hook 逻辑、规则引擎与解析护栏,全部未改动。
安装:下载下方 APK 直接安装(签名 CN=hupan,V2)。需 LSPosed ≥ 2.x,作用域勾选 com.android.browser。
宿主版本 20.27.1010901,其它版本未做适配验证。
XiaomiBrowserTuner v1.12.1
1.12.1 — 浮层不再被底栏压住;界面收口成 100% Compose
本版包含 1.12.0 + 1.12.1 两个版本的改动(v1.12.0 未单独发版)。
功能、开关键、hook 逻辑、规则引擎一行未动,只动界面层。
1.12.1:修「点开功能卡片后浮层太靠下」
症状:点开功能卡片的详情浮层太靠下,正文看不全、关闭按钮也点不到。
根因(两条叠加):
- 浮层铺在主界面
Scaffold的内容区里,而底部导航栏是Scaffold后画上去的
—— 卡片底部被底栏盖住。原先只有navigationBarsPadding()(只避开系统导航条),没算底栏。 - 只给正文限了 320dp,卡片整体没有限高 —— 屏幕一矮就顶出屏幕外,按钮跟着被推出可见区。
改法:
- 新增
ui/component/DialogInsets.kt,把「底部让位」与「卡片限高」两处计算集中一处,五个浮层共用。 - 浮层底部让位 =
maxOf(底部导航栏高度, 系统导航条)+ 页面边距。
取大者不是相加 —— miuix 导航条自身已带导航条内边距,相加会多留一层空白。 - 浮层改用
BoxWithConstraints取屏幕高,卡片heightIn(max = 屏幕高 − 底部让位 − 顶部留白)。 - 中段内容
weight(1f, fill = false):屏幕够高时卡片收着长,不够高时中段被压缩并内部滚动
—— 标题与底部按钮始终在屏幕内。
1.12.0:界面 100% 无 View
界面最后一块 View 实现搬进 Compose。至此 app/src/main/java/**/ui/ 下再无 Activity / Adapter / XML 版式。
| 类别 | 之前 | 现在 |
|---|---|---|
| 规则管理 | RuleManagerActivity + ListView + Adapter + 2 个 XML 版式 |
Compose 页面,走 navigation3 返回栈 |
| 功能目录 | FeatureCatalog.kt 数据 + 组件混在一个文件(1204 行) |
数据留原文件,展示组件抽到 ui/CatalogComponents.kt |
| 开关状态 | 主界面组合期直接读磁盘 | 统一由 ToggleState 持有(设置页「重置」后主界面立即刷新) |
| 规则摘要 | 组合期同步 IO | produceState + Dispatchers.IO |
顺带修复:详情浮层里打开「风险开关」会自动收起确认层(原先两层叠在一起);
分页返回键判定改用 settledPage;二级页不再重复留白;更新日志列表补 key。
安装
- 下载下方
XiaomiBrowserTuner-v1.12.1.apk并安装(覆盖旧版即可,设置会保留)。 - LSPosed → 模块 → 勾选 XiaomiBrowserTuner → 启用。
- 强制停止小米浏览器后重新打开。
兼容性
- 宿主:小米浏览器
com.android.browser20.27.1010901(旧版未验证) - minSdk 26(Android 8.0) / targetSdk 34
- 需 LSPosed 2.x(libxposed API 102)
- 签名
CN=hupan,与上一版一致,可直接覆盖安装
说明
- 本版只改界面,去广告行为与 1.11.0 完全一致。
- 升级后如果界面异常,先清一次模块 App 数据再试。
完整改动记录见 CHANGELOG.md。
原模块作者:Jun_ao(QQ 群
1094704567)。本工程由原作者的base.apk反编译还原后重写,
功能思路与实现全部来自原作者。原模块问题请找作者,本重写版的问题请提本仓库 Issues。
XiaomiBrowserTuner v1.11.0
1.11.0 — 设置界面重建为「三 Tab + 二级页」(Compose + miuix)
界面整体重建。功能、开关键、hook 逻辑、规则引擎一行未动,只动界面层与构建配置。
改了什么
| 类别 | 之前(1.10.3) | 现在(1.11.0) |
|---|---|---|
| 技术栈 | PreferenceFragmentCompat + 自绘开关行 + XML 版式 |
Compose + miuix 0.9.3 + navigation3 1.1.4 |
| 页面结构 | 底部导航两栏(功能 / 关于) | 三 Tab(功能 / 规则 / 关于)+ 横向分页;项目信息 / 更新日志 / 诊断 / 应用设置四个二级页走真正的返回栈 |
| 一级页 | 关于页两屏多 | 只放「开关 + 入口」,基本一屏看完,长内容全部下沉 |
| 详情弹窗 | MaterialAlertDialogBuilder + XML |
自绘浮层(切 Tab / 进二级页回来状态一致;切换后不关窗) |
| 下拉项 | ListPreference(UA 模式 / 搜索引擎) |
卡片行 + 自绘单选浮层,跟随母开关置灰 |
| 开关数据 | prefs.xml + FeatureDetails.kt + Changelogs.kt 三处 |
合到 ui/FeatureCatalog.kt 一处 |
| 规则管理 | 功能页里的一个入口项 | 独立「规则」Tab:两个开关 + 规则库概况卡 + 入口 |
安装
- 下载下方
XiaomiBrowserTuner-v1.11.0.apk并安装(覆盖旧版即可,设置会保留)。 - LSPosed → 模块 → 勾选 XiaomiBrowserTuner → 启用。
- 强制停止小米浏览器后重新打开。
兼容性
- 宿主:小米浏览器
com.android.browser20.27.1010901(旧版未验证) - minSdk 26(Android 8.0) / targetSdk 34
- 需 LSPosed 2.x(libxposed API 102)
- 签名
CN=hupan,与上一版一致,可直接覆盖安装
说明
- 本版只改界面,去广告行为与 1.10.3 完全一致。
- APK 体积从 4.9 MB 增至 11 MB,原因是引入了 Compose / miuix 运行时。
- 升级后如果界面异常,先清一次模块 App 数据再试。
完整改动记录见 CHANGELOG.md。
原模块作者:Jun_ao(QQ 群
1094704567)。本工程由原作者的base.apk反编译还原后重写,
功能思路与实现全部来自原作者。原模块问题请找作者,本重写版的问题请提本仓库 Issues。
v1.10.2 - 设置页「一条一卡」+ 关于页 hero
小米浏览器调谐器 v1.10.2
LSPosed 模块:小米浏览器(com.android.browser)去广告 / 界面精简 / 自定义搜索引擎与 UA。本版是纯界面改版,功能代码零改动。
本版重点:设置页改成「一条一卡」,关于页换成 hero 卡
原先每个分组是一整张卡片、组内用细分隔线拼在一起。本版把列表装饰换成 CardRowDecoration:每个 Preference 行自己画一张 20dp 圆角卡片,行间 10dp 缝隙,分区标题(PreferenceCategory)不画卡、只多留一段落差;关于页改成主色 hero 卡(模块名 + 实心版本胶囊 + 一句话定位)+ 每条信息一张小卡 + 更新日志「一版一卡」。
与番茄 HookFanqie 7.2.30、多看 DuokanTuner 1.25 统一为同一套版式规格。技术栈保持不变(Kotlin + XML + androidx.preference),没有引入 Compose —— 也就不会碰到 miuix WindowDialog 依赖 navigationevent 导致的详情弹窗闪退(那是番茄侧踩到的坑)。
改了什么
| 位置 | 之前(v1.10.1) | 现在(v1.10.2) |
|---|---|---|
| 功能列表 | 一组一张卡,组内细分隔线(CardGroupDecoration) |
一行一张独立卡(CardRowDecoration),卡间 10dp 缝隙 |
| 行规格 | 内边距 16/…dp、标题 14sp、副文案 11sp | 内边距 18/16dp、标题 16sp 粗体、副文案 13sp |
| 分区标题 | 12sp 粗体,与卡片正文对齐 | 14sp 次要色,比卡片正文更靠左 8dp(左缩进 24dp) |
| 页面标题 | 21sp / 副标题 12sp | 30sp / 副标题 13sp |
| 关于页 | 多行拼成一整张卡 | hero 卡 + 项目信息每条一卡;更新日志一版一卡,首条挂「当前」胶囊 |
未改动:14 个配置开关(master_enabled / ad_* / ui_* / misc_* / ua_patch …)、hook 目标、自定义规则.csv 通道、libxposed API 102 的跨进程读写 —— 全部保持不变,升级不需要重新配一遍开关。
环境要求
| 项 | 值 |
|---|---|
| 宿主应用 | 小米浏览器 com.android.browser(适配 20.27.1010901) |
| 框架 | LSPosed / Xposed · libxposed API 102 |
| 模块包名 | com.hupan.hookbrowser |
安装
- 下载下方
XiaomiBrowserTuner-v1.10.2.apk并安装。 - 在 LSPosed 管理器里勾选本模块,确认作用域包含「浏览器」,重启浏览器或
adb kill其进程。 - 打开模块 App →「关于」页第一行「框架服务」显示已连接,说明设置页写进去的开关能同步到宿主读的那份数据(至少要进一次设置页触发全量镜像)。
安装包信息
| 文件 | 大小 | SHA-256 |
|---|---|---|
XiaomiBrowserTuner-v1.10.2.apk |
4,900,302 字节(4.67 MiB) | ff76834c6d87775b6259c45d263fa81546702f1dea6d5bdc8a9987da10387837 |
校验命令(Windows):certutil -hashfile XiaomiBrowserTuner-v1.10.2.apk SHA256
签名者:CN=hupan(v2/v3 签名;minSdk 26 起不再签 v1 属正常)
⚠️ 免责
仅供个人学习与设备自定义使用。模块全部逻辑在本地完成,不联网、不申请权限;去广告规则为本地判定,不替换任何远端内容。小米浏览器为第三方商标,权利归各自所有者。详见仓库 LICENSE。
v1.10.1 - 开关写入端补齐(libxposed API 102)
XiaomiBrowserTuner v1.10.1
小米浏览器(com.android.browser,MIUI / HyperOS)的 Xposed / LSPosed 模块首个公开版本。
由原作者发布的 base.apk 模块反编译还原后重写:把写死在代码里的去广告逻辑改成
每组功能一个开关 + 一个设置界面。
本版重点:开关真的能同步到宿主了
1.10.0 装上后不闪退、功能也注册了,但改开关不生效。根因是跨进程通道只做了读端、没做写端。
本版补齐写入端后:
- 读端
XposedInterface#getRemotePreferences(框架数据库,跨进程直读) - 写端
ModuleService(io.github.libxposed:service:102.0.0),设置页把本地 SP 全量镜像到框架数据库
功能
| 分组 | 开关 |
|---|---|
| 去广告 | 开屏广告 · 首页推广位 · 搜索推荐广告 · 错误页热搜榜 · 宿主广告开关 |
| 自定义规则 | 自定义拦截规则(Adblock 语法,URL 拦截 + 元素隐藏) · 接管宿主拦截引擎(默认关) |
| 界面精简 | 下载弹窗 · User-Agent 伪装 · 默认搜索引擎 · 解锁隐藏设置项 · 浏览器调试模式 · 拦截网址安全检测 |
- 搜索推荐广告:反射取
SearchSugManager#mWebView注入 JS,页内先铺 CSS 规则(首帧前拦截、不闪),再按「带广告标的卡片」+「卡内有真实安装按钮」两条判据兜底display:none,最后塌缩空壳容器。 - 错误页热搜榜:hook
HybridActionDispatcher#call(after),把getDefaultPageInfo的isHotSearchAddImport置 false。 - 接管宿主拦截引擎:把宿主的
files/data/adblock/miui_blacklist.json换成导入的规则并清空白名单,再让 native 立即重载 —— 唯一会改宿主自身数据的开关,关闭即从备份还原。
环境要求
| 项 | 要求 |
|---|---|
| 宿主 | 小米浏览器 com.android.browser,20.27.1010901(versionCode 202710100)实测 |
| 框架 | LSPosed 2.3+(libxposed API 102,静态作用域) |
| 系统 | Android 8.0+(minSdk 26) |
| 包名 | com.hupan.hookbrowser |
安装
- 安装 APK → 在 LSPosed 里启用模块 → 作用域勾选「小米浏览器」。
- 强制停止小米浏览器,再打开。
- 打开模块设置页,顶部应显示「框架服务已连接」;若显示未连接,检查 LSPosed 是否已启用本模块。
⚠️ hook 目标基于宿主 20.27.1010901 实测核对。宿主升级后类名可能变动,
挂不上时模块只记日志、不会崩,功能静默失效。详细的核对基线见仓库docs/宿主20.27-hook目标核对.md。
安装包信息
| 项 | 值 |
|---|---|
| 文件 | XiaomiBrowserTuner-v1.10.1.apk |
| 大小 | 4,890,609 字节(4.66 MiB) |
| 签名 | v2 有效,签名者 CN=hupan(非 debug 证书) |
| SHA-256 | fb8136aeddf015f5661b8632f1f5c8fb6500197c764cf2a25536f215b2d281bd |
校验:
sha256sum XiaomiBrowserTuner-v1.10.1.apk⚠️ 免责
仅修改本机宿主的运行行为,不涉及服务器端,不破解任何付费内容,不修改宿主原始数据(除「接管宿主拦截引擎」开关外,且可还原)。
本项目与小米公司无任何关联,未获其授权、赞助或认可。「小米」「MIUI」「HyperOS」等商标归小米科技有限责任公司所有。
完整条款见仓库 LICENSE。