kolezka/NL5H00X
GitHub: kolezka/NL5H00X
一款针对锁定版 Android 投影仪的固件修改工具,提供完整备份与自定义启动器替换功能。
Stars: 7 | Forks: 1
# Android 投影仪工具包
用于绕过被锁定的 Android 投影仪上的安全限制并安装自定义启动器的工具。
## 目录
- [概述](#overview)
- [快速开始](#quick-start)
- [功能](#features)
- [脚本](#scripts)
- [文档](#documentation)
- [已测试设备](#tested-devices)
- [安全](#safety)
- [紧急恢复](#emergency-recovery)
- [贡献](#contributing)
- [许可证](#license)
## 概述
修复不允许安装应用或更换启动器的 Android 投影仪。创建完整的设备备份,并安全地将锁定的原厂启动器替换为 [Projectivy](https://github.com/spocky/miproja1) 或您选择的其他启动器。
## 快速开始
```
./scripts/PROJECTOR.sh
```
这就是全部操作。它会找到投影仪,显示其当前状态,并
引导您完成 备份 → 验证 → 解锁,并为耗时 15 分钟的
备份提供进度条。任何操作都会先征求您的同意。
```
NL5H00X Projector Toolkit
-----------------------------------------------------------
device NL5H00X_TP root: yes
backup verified 7.65 GB projector-backup-20260728_054611
launcher locked stock launcher
-----------------------------------------------------------
[1] Back up the device again ~13 min
[2] Unlock the launcher
[3] Restore the stock launcher
[4] Detailed unlock state
[5] Refresh
[q] Quit
> 1
```
备份过程会在实时视图后台运行,而不是让您对着无响应的屏幕等上十五分钟:
```
Backing up NL5H00X_TP
-----------------------------------------------------------
[########################................] 62%
pulled 4.74 GB / 7.65 GB
block 18 of 29
rate 10.4 MB/s 4 min left
stalls 3 killed and retried expected on this device
-----------------------------------------------------------
[INFO] 56% 4.28 GB / 7.65 GB
[WARN] Transfer stalled 30s at 4.41 GB - killing it
[WARN] Block at 4.41 GB: got 113156093 bytes, wanted 268435456 (try 1/3)
[INFO] 62% 4.74 GB / 7.65 GB
the backup keeps running even if you close this
```
`stalls killed` 在这种硬件上很正常,并不是警告信号 —— 远程
`dd` 会定期被清理,每个数据块都会简单重试。即使显示了
三次该提示的运行,依然能生成字节精确的镜像。
如果您愿意,或者想针对它们编写脚本,各个脚本依然可以独立运行:
```
./scripts/TOOLS.sh # opens hidden settings screens; no root needed
./scripts/MAKE_BACKUP.sh # full device image, resumable
./scripts/UNLOCK.sh --status # what is applied; changes nothing
./scripts/UNLOCK.sh --apply-all
```
## 解锁启动器
投影仪出厂时锁定在 `com.newlink.hisilauncher`,且不允许您
从“设置”中更改主屏幕。`UNLOCK.sh` 可以解决这个问题。
```
./scripts/UNLOCK.sh # interactive menu
./scripts/UNLOCK.sh --status # what is and is not applied; changes nothing
./scripts/UNLOCK.sh --apply-all # do everything, then stop
./scripts/UNLOCK.sh --revert # put the stock launcher back
```
**仅仅将启动器 APK 复制到 `/system/app` 是不够的。** 这是每个人
都会首先尝试的方法,但它不起作用:当原厂启动器仍然
启用时,它会在下次开机时重新夺回主屏幕。解锁操作会先禁用它,
然后再设置主屏幕 Activity。这个执行顺序才是关键所在。
它每次执行的一项操作及其目的 —— 每一步都会通过从设备回读值来进行检查,
而不是盲目信任命令的退出代码:
| 步骤 | 改动 |
|------|--------|
| `dev_options` | 打开开发者选项,允许从未知来源安装 |
| `launcher_present` | 安装 Projectivy(如果已安装则跳过) |
| `launcher_default` | 禁用原厂启动器,将 Projectivy 设置为主屏幕 |
| `cleanup_leftovers` | 移除先前尝试留下的空文件夹或重复文件夹 |
值得了解的安全行为:
- 拒绝在非 NL5H00X 设备上运行。
- 没有经过验证的备份拒绝进行任何更改(`--status` 除外)。
- 重新运行它是无操作(no-op);它会报告已经完成了什么。
- **原厂启动器只有在确认替代启动器已经运行后才会被禁用。** 已安装并不
等于能正常工作 —— 启动时崩溃的启动器依然会出现在 `pm list packages` 中,如果
在此基础上禁用原厂启动器,最终会导致您完全失去主屏幕。因此,新的启动器
会先被启动并确认其仍在运行,然后才会禁用原厂启动器。
- 如果原厂启动器无法被禁用,程序会重新启用它,而不是
让您彻底失去主屏幕。
- `--revert` 可恢复原厂启动器,并且该过程同样会经过验证。
之后请重启投影仪,以使新的主屏幕生效。
### 为什么选 Projectivy
投影仪是通过遥控器操作的,而不是触摸屏。Projectivy 是一款
leanback 启动器:它声明了 `LEANBACK_LAUNCHER`,为方向键(D-pad)进行了布局优化,并且
专为这类设备而构建。Nova —— 之前的一次尝试将其留在了
`/system/app` 中 —— 是一款手机启动器,用鼠标操作尚可,但用包装盒里附带的
遥控器操作则非常别扭。
它的 APK 取自开发者自己的 GitHub releases,而不是镜像源,并且其包名、SDK 范围、ABIs 和
签名证书都记录在 [`apks/PROVENANCE.md`](apks/PROVENANCE.md) 中。如果您已经从 Google Play
安装了 Projectivy,请保留它 —— `launcher_present` 会检测到它并且什么也不做。
没有硬编码强制要求使用 Projectivy。要使用其他启动器:
```
LAUNCHER_PKG=com.teslacoilsw.launcher \
LAUNCHER_NAME=Nova \
LAUNCHER_APK_GLOB='nova-launcher*.apk' \
./scripts/UNLOCK.sh --apply-all
```
主屏幕 Activity 也从不被硬编码 —— 它是通过询问设备上实际由哪个组件处理 `CATEGORY_HOME` 来解析的,因此即使某个启动器在不同版本之间重命名了它的 Activity,也不会导致任何问题。
## 功能
- **隐藏设置访问** - 无需修改即可解锁厂商限制的功能
- **完整备份** - 支持 7GB 以上取证设备镜像及分块存储
- **自定义启动器** - 用 Projectivy、Nova 或其他启动器替换锁定的原厂启动器(需要 root)
## 脚本
| 脚本 | 用途 | 需要 Root |
|--------|---------|---------------|
| [`PROJECTOR.sh`](scripts/PROJECTOR.sh) | **从这里开始** —— 涵盖以下所有功能的引导式界面 | 视情况而定 |
| [`TOOLS.sh`](scripts/TOOLS.sh) | 打开隐藏的设置界面;也可以重置主屏幕 | 否 |
| [`MAKE_BACKUP.sh`](scripts/MAKE_BACKUP.sh) | 创建完整的设备备份 | 是 |
| [`UNLOCK.sh`](scripts/UNLOCK.sh) | 替换锁定的原厂启动器 | 是 |
## 文档
| 文档 | 描述 |
|----------|-------------|
| [技术说明](docs/TECHNICAL_NOTES.md) | 设备分析、ADB 命令、分区布局 |
| [安全分析](docs/SECURITY_ANALYSIS.md) | 详细的安全限制分析 |
| [文档 README](docs/README.md) | 文档概述 |
## 已测试设备
| 设备 | Android | 状态 |
|--------|---------|--------|
| Newlink NL5H00X | 9 | 已测试 |
## 仓库结构
```
scripts/
PROJECTOR.sh # Guided interface -- start here
TOOLS.sh # Access hidden features
MAKE_BACKUP.sh # Complete device backup
UNLOCK.sh # Launcher unlock, interactive CLI
lib/
common.sh # Shared functions
unlock.sh # Unlock steps (state/apply/revert per step)
tests/
run-tests.sh # Backup regression suite
unlock-tests.sh # Unlock end-to-end suite
ui-tests.sh # TOOLS.sh and PROJECTOR.sh front ends
fake-adb/adb # Emulated projector -- no hardware needed
device-emu/seed.sh # Seeds the emulator from measured firmware values
docs/
TECHNICAL_NOTES.md # Technical documentation
SECURITY_ANALYSIS.md # Security analysis
README.md # Docs overview
apks/
projectivy-launcher-4.71.apk # installed by default
nova-launcher-7.0.57.apk # fallback, via LAUNCHER_* overrides
PROVENANCE.md # where each came from and what was verified
assets/
img1.png # Console demo
```
## 安全
- **必须备份** - 修改脚本要求先进行完整备份
- **需要 Root** - 系统修改需要现有的 root 访问权限
- **失去保修** - 使用风险自负
## 紧急恢复
```
# 放回原装 launcher(受支持的方式——它会验证结果)
./scripts/UNLOCK.sh --revert
# 手动操作,如果你无法运行该 script。请注意,在原装 launcher 被禁用的情况下,仅这样做无法
# 在重启后依然生效。
# # 该 component 是 .WizardAciticity,在固件中就是完全这样拼写的。
# .MainActivity 是你实际看到的屏幕,但它不带有 HOME 过滤器,
# 因此 set-home-activity 会拒绝它。询问设备,而不是盲目相信任何一方:
adb shell 'echo "pm enable com.newlink.hisilauncher" | su'
adb shell cmd package query-activities --brief \
-a android.intent.action.MAIN -c android.intent.category.HOME
adb shell cmd package set-home-activity com.newlink.hisilauncher/.WizardAciticity
```
从镜像完全恢复则是另一回事。`RESTORE.sh` **是由 `MAKE_BACKUP.sh` 生成到备份目录中的** —— 它不在 `scripts/` 目录下 —— 所以请从该目录运行它:
```
cd projector-backup-/
./RESTORE.sh
```
如果设备完整镜像与 `backup-manifest.txt` 不匹配,它会拒绝写入;如果缺少清单文件,它会直接拒绝执行。将一个残缺的镜像覆盖恢复到整个设备,正是导致投影仪无法开机的元凶。
## 无需投影仪进行开发
整个工具包可以在模拟设备上运行,因此可以测试更改而无需触碰硬件 —— 当被测试的对象是“您将用来恢复的备份”或“您开机所需的启动器”时,这一点尤为重要。
```
bash tests/run-tests.sh # backup suite
bash tests/unlock-tests.sh # unlock suite
bash tests/ui-tests.sh # TOOLS.sh and PROJECTOR.sh
```
UI 测试套件通过 `/bin/bash` 运行前端,而不是通过 `$PATH` 解析出的
`bash`,因为 shebang 指定的就是这个路径。macOS 依然自带 bash 3.2,而在 Homebrew 提供的
较新版 bash 中进行测试,曾掩盖了一个会导致每个 Mac 用户的 `TOOLS.sh` 直接崩溃的
`local -n` 问题。
模拟器的数据源自真实 NL5H00X 上的测量值:包括它的
`build.prop`、它的 `/system/app` 清单、仅限管道方式的 `su`(拒绝 `su -c`,与真实设备一致)、只读挂载的 `/system`,以及在原厂启动器启用时会重新强制设为默认的启动流程。它会**拒绝设备所拒绝的操作**,因此,如果某个解锁操作忘记重新挂载 `/system` 或忘记禁用原厂启动器,在模拟器上同样会失败。
如果想要针对您自己提取的固件而不是内置替代品来运行脚本:
```
export FAKE_ADB_STATE=/tmp/fakedev
mkdir -p "$FAKE_ADB_STATE/sdcard"
cp projector-backup-*/full-system-backup.img "$FAKE_ADB_STATE/blockdev"
PATH="$PWD/tests/fake-adb:$PATH" ./scripts/TOOLS.sh
```
## 贡献
请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。
## 许可证
[MIT 许可证](LICENSE) - 仅限教育用途。
标签:ADB工具, 启动器替换, 固件修改, 安卓, 投影仪, 系统定制, 设备Root