构建熊大 KernelSU 模块
把用户指定的基础版本派生为可安装、可回归、日志明确的熊大 KernelSU 模块。优先保留已验证行为,只修改本次要求的路径,并分别证明源码、ZIP、模拟执行和真机结果。
组合已有能力
开始前按任务加载并遵守:
kernelsu-module-development:读取其核心契约、测试发布资料;涉及 WebUI 时再读 WebUI 安全和 Manager 回调资料。xiongdaneiheskill:对每个当前熊大内核、驱动、APK 或伪装.sh重新做静态识别。
本 Skill 负责熊大模块的产品架构和派生流程,不复制上述两个 Skill 的通用知识。
坚守边界
- 不在开发机执行用户上传的 APK、ELF、驱动、自解包脚本、
insmod或真实熊大 payload。 - 不因扩展名、旧哈希、旧 URL、旧版本号或历史分析推断当前文件类型。
- 不改写用户要求原样保留的驱动;复制前后、ZIP 内外均做逐字节比较和 SHA-256 校验。
- 不直接修改当前活动模块或用户未指定的正式源码;从明确的基础 ZIP/源码建立独立工作树。
- 不把静态检查、Shell 语法、假驱动测试说成真机加载成功。
- 不把 WebUI 做成任意 root 终端;只调用模块内固定 helper 和固定子命令。
- 不加载远程 JS/CSS/CDN;不在日志中输出卡密、令牌或完整敏感输入。
先冻结需求
在写文件前记录:
- 基础版本的精确 ZIP/源码路径和 SHA-256。
- 目标模块 ID、显示版本、递增的
versionCode和输出包名。 - 手动启动、游戏自启、本地开关、在线下载、卡密输入分别是否保留。
- 驱动模式、日志保留方式、覆盖安装还是并存安装。
- 用户给出的当前 payload、驱动、下载地址和预期设备 ABI/内核。
- Action 与 WebUI 分别允许出现的按钮、子命令和日志;未列入白名单的功能不得自行添加。
用户明确说“WebUI 只放驱动”“不要自启/下载/开关”时,这些限制优先于熊大基础版架构,不得把 WebUI 扩成完整控制台。
将“独立版本”默认解释为独立源码和独立 ZIP、仍使用原 ID 覆盖升级;只有用户明确要求两套同时安装时才更换 ID,并重新审计两个监测服务、日志、锁和 payload 目录冲突。
选择驱动模式
| 模式 | 调用位置 | 必须保证 |
|---|---|---|
no-driver |
不调用驱动 | 熊大原启动链完全不含驱动逻辑 |
manual-driver |
仅 WebUI 按钮经 /system/bin/sh 调用 bin/driver-control run |
手动/游戏自启不会加载驱动;页面实时显示完整日志 |
prelaunch-driver |
download-and-run 在 payload 前调用固定 helper |
驱动失败阻止 payload;游戏存活和开关在驱动后再次确认 |
不要把一种模式的逻辑悄悄带进另一种模式。
选择验证配置
xiongda-full:仅用于保留熊大自启开关、游戏监测、下载器和完整控制状态的模块。minimal-action-manual-driver:用于“模块卡 Action 只启动内核,WebUI 只手动刷驱动/看驱动日志”的精简派生模块;不得加入service.sh、game_monitor.sh、autostart_enabled或bin/control。
不要为了让精简模块适配熊大验证器而加入用户未要求的功能;应选择精简配置并提供固定的 --action-helper。
防止安装后权限失效
KernelSU 默认解压会把普通模块文件设为 0644,ZIP 中记录的 0755 不能证明安装后仍可直接执行。必须同时做到:
- 在
customize.sh顶层使用固定的set_perm "$MODPATH/..." 0 0 0755,覆盖action.sh、存在的生命周期脚本和每个bin/helper。 - Action、WebUI 和其它模块脚本调用 Shell helper 时仍显式使用
/system/bin/sh HELPER ...,不依赖执行位。 - 不直接
exec "$MODDIR/bin/helper",不把裸 helper 路径直接传给window.ksu.exec/spawn。 - 发布前用专项验证器静态模拟 KernelSU 的
0644默认值,并运行权限负向回归;不得只看zipinfo。
内置原始 payload/驱动若始终经解释器读取,可以保持 0600;不要因 .sh 后缀把它误判为必须可执行的模块 helper。
建立派生工作树
优先从用户点名的正式 ZIP 解包,不从当前较新源码“倒改”成旧版。使用本 Skill 的安全解包器:
python3 "$SKILL_DIR/scripts/extract_base.py" BASE.zip WORK/A.xiongda-onekey-start
它拒绝外层目录、路径穿越、符号链接、重复成员、错误模块 ID 和已存在的输出目录。解包后:
- 保存基础文件清单和哈希。
- 列出允许修改、新增、删除的相对路径。
- 对未列入范围的运行文件做
cmp,不能只看文件名。 - 保持稳定 ID
A.xiongda-onekey-start;其A只提供同组字母排序靠前,不是置顶字段。
详见 references/architecture.md。
处理当前熊大文件
对每个上传或下载的文件分别运行 xiongdaneiheskill 的普通和 JSON triage。至少记录真实类型、大小、SHA-256、架构、内嵌容器和文件路径候选。
.sh若为 ELF:直接执行文件;不要强制交给/system/bin/sh。.sh若为 Shell/自解包脚本:仅静态读取脚本前缀和内嵌数据;不要真实运行。- 在线下载:每次读取当前地址,保留服务器验证后的原始版本文件名,先写
.part再原子替换。 - 卡密自动输入:复用已验证的 PTY/输入链;不把卡密写入日志、Skill 或公开测试数据。
- 内置驱动:按当前输入动态写入 helper 的预期大小和 SHA-256,禁止复用历史常量。
按需保留低耗自启架构
仅在选择 xiongda-full 或用户明确要求游戏自启时保持:
- 模块根
autostart_enabled,内容仅允许0或1;新装默认0。 bin/control status|enable|disable使用临时文件加mv原子写入。game_monitor.sh用IFS= read -r内建读取;缺失、非法、空文件或软链接均按关闭。service.sh在开机启动一个监测进程;关闭开关只阻止触发,不依赖 WebUI 创建服务。- 未检测到游戏启动转换时不联网、不下载、不启动熊大。
- 用 PID、命令行/可执行文件归属和原子锁处理旧 PID、重复点击和并发任务。
不要在每轮检测中调用 ksud module config、cat 或网络请求。保留 bin/control 的四种稳定状态:enabled-running、enabled-stopped、disabled-ready、disabled-stopped。
实现 WebUI 驱动日志
手动驱动模式使用固定 bin/driver-control run|log:
- 拒绝软链接、缺失或哈希不符的驱动。
- 用原子目录锁阻止并发。
- 通过 FIFO 和
tee同时流向 WebUI、完整日志和结果识别文件。 - 保留驱动真实退出码。
- 明确输出“本次执行 insmod”“本次已加载并跳过 insmod”“执行失败”“退出 0 但结果无法识别”。
- 每次
run覆盖旧的logs/driver-webui.log,避免当前页面混入以前日志;log只读取最后一次完整日志。
WebUI 使用 KernelSU spawn 的真实事件协议,分别处理 stdout.data、stderr.data、exit 和非零退出后的 error。运行时禁用重复点击;“清空屏幕”只清 DOM,不删除模块日志。
完整协议和 shell 模式见 references/webui-and-driver.md。
保证下载与启动结果可解释
让手动 Action 和游戏自启共享同一个固定 launcher,但使用不同来源标签和日志:
- 手动执行先清空本次 Action 日志并向 Manager 输出当前任务。
- 自启只写轮转后的
auto-start.log,不把旧 Action 日志重新打印。 - 下载保留验证后的服务器原始文件名;不要发明
.bin、最新或无版本别名。 - 先检查当前 payload PID 是否确属当前文件,再决定是否重复启动。
- 根据魔数选择 ELF 直接执行或 Shell 解释器。
- 驱动前置模式中,驱动失败必须阻止 payload;手动驱动模式不得触碰此链。
测试且不碰真实驱动
至少完成:
- 基础版未授权文件逐字节不变。
- Bash、Dash、KernelSU BusyBox ash 解析所有普通 shell;自解包驱动只解析 marker 之前的文本前缀。
- Node 解析 WebUI JS;用假
window.ksu验证所选配置允许的按钮和spawn四类事件。 - 用假驱动覆盖实际加载、重复跳过、退出失败、退出 0 但结果不明、并发锁、文件篡改。
- 静态模拟安装后普通文件为
0644,确认customize.sh给所有运行入口/helper 恢复0755;把缺少set_perm、Action 直接执行 helper、WebUI 传裸路径作为必须失败的负向用例。 xiongda-full才运行本地 0/1 开关、假下载器、游戏边沿和自启取消矩阵;精简配置必须证明这些文件与 WebUI 操作不存在。- 校验源目录和 ZIP、
unzip -t、根布局、源码/ZIP 字节一致、驱动字节一致、可复现构建和最终 SHA-256。
运行专项验证器:
python3 "$SKILL_DIR/scripts/verify_release.py" \
--source WORK/A.xiongda-onekey-start \
--zip DIST/module.zip \
--mode manual-driver \
--profile xiongda-full \
--driver CURRENT_DRIVER.sh \
--base-zip BASE.zip \
--expected-base-delta module.prop \
--expected-base-delta customize.sh \
--expected-base-delta bin/driver-control \
--expected-base-delta driver/CURRENT_DRIVER.sh \
--expected-base-delta webroot/index.html \
--expected-base-delta webroot/app.js \
--expected-base-delta webroot/style.css
精简 Action+WebUI 驱动模块改用:
python3 "$SKILL_DIR/scripts/verify_release.py" \
--source WORK/MODULE_ID \
--zip DIST/module.zip \
--mode manual-driver \
--profile minimal-action-manual-driver \
--action-helper bin/FIXED_LAUNCHER \
--module-id MODULE_ID \
--driver CURRENT_DRIVER.sh
升级本 Skill 后先运行 python3 "$SKILL_DIR/scripts/test_verify_release.py",确认权限和直接执行的五个正反回归全部通过。
按实际批准范围调整 delta,不能把未知差异全部放行。验证细节和校验器误报处理见 references/testing-and-release.md。
诊断时先复盘已知失败
遇到“没执行”“开关失效”“必须重启”“日志混乱”“重复刷入”时,先读 references/failure-lessons.md,再从当前源码、日志和设备状态重新证明原因,不直接套历史结论。
交付
先给可安装 ZIP 和 SHA-256,再说明:
- 基础版本、版本/
versionCode、模块 ID 和覆盖/并存关系。 - 驱动模式以及哪些启动链会或不会加载驱动。
- WebUI 实时日志和设备内最后日志路径。
- 内置驱动与输入的大小、SHA-256、逐字节一致结果。
- 静态、模拟、ZIP、可复现构建分别通过什么。
- 是否完成真机安装、重启、游戏触发和真实驱动加载;未完成时明确写“未实机证明”。
不要用“应该成功”代替证据,也不要把用户先前确认过的旧版本行为冒充新 ZIP 的真机结果。