让被深度定制系统限制的 Android 电视盒子也能用上第三方桌面。
许多国产电视盒子(如阿里云 YunOS、乐视等)通过 Intent Firewall (IFW)、白名单 secure launcher_list 等机制,阻止用户设置第三方桌面为默认桌面,强行捆绑系统桌面广告。
本项目不试图替换系统桌面(这在很多盒子上会导致黑屏),而是通过开机自启动 + 无障碍服务 HOME 键拦截的方式,让第三方桌面在体验上接近默认桌面。
- 开机自动拉起:开机后按自定义延时自动启动第三方桌面
- 待机唤醒自动拉起:盒子待机后唤醒,自动再次启动第三方桌面
- HOME 键拦截:按 HOME 键后自动拉回第三方桌面(需开启无障碍服务)
- 智能区分:从第三方桌面主动跳转到系统桌面时不会拦截,仅在按 HOME 键时拉回
- 可配置延时:开机延时和唤醒延时均可自定义
- 失败重试:如果被系统桌面抢回,会自动重试
不依赖 Gradle,使用 Android SDK 纯命令行工具链构建。
前置条件:
- JDK 8+
- Android SDK(需设置
ANDROID_SDK_ROOT环境变量,默认为~/Library/Android/sdk) - 默认使用 build-tools 37.0.0 和 android-34 平台
# 如需指定 SDK 版本
export BUILD_TOOLS_VERSION=37.0.0
export PLATFORM_VERSION=android-34
bash build.sh产物:build/dangbei-helper.apk
adb install -r build/dangbei-helper.apkAndroid 系统在应用更新/重装时会自动清空无障碍服务绑定,需要手动启用:
adb shell settings put secure enabled_accessibility_services com.localtv.dangbeiautostart/com.localtv.dangbeiautostart.HomeMonitorAccessibilityService
adb shell settings put secure accessibility_enabled 1验证:
adb shell settings get secure enabled_accessibility_services
adb shell settings get secure accessibility_enabledadb shell settings put secure enabled_accessibility_services ""
adb shell settings put secure accessibility_enabled 0┌─────────────────────────────────────────────────────┐
│ BOOT_COMPLETED / SCREEN_ON / USER_PRESENT 广播 │
└─────────────────┬───────────────────────────────────┘
▼
┌───────────────┐
│ BootReceiver │
└───────┬───────┘
▼
┌───────────────┐
│ AlarmManager │ (延时调度)
└───────┬───────┘
▼
┌──────────────────┐
│ LaunchProxyActivity │ (透明中转页)
└──────┬─────────────┘
▼
┌──────────────┐
│ 当贝桌面 / │
│ 第三方桌面 │
└──────────────┘
HOME 键拦截:
AccessibilityService 监听 TYPE_WINDOW_STATE_CHANGED
→ 检测到系统桌面回到前台
→ 如果上一个前台应用不是第三方桌面(非主动跳转)
→ 自动拉回第三方桌面
| 组件 | 文件 | 用途 |
|---|---|---|
| 主界面 | MainActivity.java |
配置延时、开关、状态显示 |
| 开机广播 | BootReceiver.java |
接收 BOOT_COMPLETED / SCREEN_ON 等广播 |
| 调度核心 | LaunchHelper.java |
延时启动、重试、配置存储 |
| 中转页 | LaunchProxyActivity.java |
被 AlarmManager 拉起,在前台启动第三方桌面 |
| 无障碍服务 | HomeMonitorAccessibilityService.java |
监听 HOME 键,自动拉回第三方桌面 |
修改 LaunchHelper.java 中的常量即可:
static final String DANGBEI_PACKAGE = "com.dangbei.tvlauncher";
static final String DANGBEI_ACTIVITY = "com.dangbei.launcher.ui.main.MainActivity";同时修改 HomeMonitorAccessibilityService.java 中的 DANGBEI_PACKAGE 常量。
- 部分盒子的系统桌面不可禁用,禁用会导致黑屏
- 某些设备为 production build,不支持
adb root,无法直接修改 IFW 策略 - 每次重装 APK 后,无障碍服务需要重新通过 ADB 启用
- 不是真正的默认桌面替换,按 HOME 键可能先闪现系统桌面再跳转
MIT License - 详见 LICENSE