目录
[1. 前言:从一次遥控器体验优化说起](#1. 前言:从一次遥控器体验优化说起)
[1.1 问题的起源](#1.1 问题的起源)
[1.2 根本原因分析](#1.2 根本原因分析)
[2. 为何换成TV版:不只是换个UI那么简单](#2. 为何换成TV版:不只是换个UI那么简单)
[2.1 用户体验的差异](#2.1 用户体验的差异)
[2.2 TV版Settings的核心优势](#2.2 TV版Settings的核心优势)
[3. 如何干掉自带Settings,打包TvSettings](#3. 如何干掉自带Settings,打包TvSettings)
[3.1 源码结构分析](#3.1 源码结构分析)
[3.2 分析Settings的打包机制](#3.2 分析Settings的打包机制)
[3.3 彻底移除Settings的方法](#3.3 彻底移除Settings的方法)
[3.4 设备配置中添加TvSettings](#3.4 设备配置中添加TvSettings)
[3.5 遥控器MENU键启动Settings的源码修改](#3.5 遥控器MENU键启动Settings的源码修改)
1. 前言:从一次遥控器体验优化说起
1.1 问题的起源
在基于Rockchip RK3568平台的Android 设备开发过程中,遇到了一个看似简单但却影响用户体验的核心问题------遥控器操作设置应用体验极差。
具体表现为:
-
焦点移动异常:在设置界面中,使用遥控器方向键时,焦点经常跳转到意料之外的选项
-
无法进入深层菜单:某些设置子页面无法通过遥控器"确认"键进入
-
布局错位:部分UI元素在大屏电视上显示不全或被拉伸
1.2 根本原因分析
通过源码分析,我们发现问题的根源在于,这个"电视盒子"使用的是平板设备的系统设置应用,而非专门为遥控器优化的TV版本。
| 对比项 | Settings (平板版) | TvSettings (TV版) |
|---|---|---|
| 交互方式 | 触摸屏优化 | 遥控器/D-pad优化 |
| 焦点管理 | 支持多点触控 | 按键导航,焦点高亮明确 |
| 布局 | 多列列表 | 单列大卡片 |
| TV特色功能 | ❌ 无 | ✅ HDMI CEC、屏幕缩放等 |
| 包名 | com.android.settings |
com.android.tv.settings |
2. 为何换成TV版:不只是换个UI那么简单
2.1 用户体验的差异
平板版Settings的操作痛点:
XML
<!-- 平板版设置布局:多列,焦点容易丢失 -->
<LinearLayout orientation="horizontal">
<RecyclerView android:id="@+id/main_menu" /> <!-- 左侧菜单 -->
<FrameLayout android:id="@+id/content" /> <!-- 右侧内容 -->
</LinearLayout>
TV版Settings的遥控器友好设计:
XML
<!-- TV版设置布局:单列大焦点卡片 -->
<LeanbackSettingsFragment>
<PreferenceCategory>
<Preference android:title="网络与互联网"
android:icon="@drawable/ic_network" />
<Preference android:title="显示与声音"
android:icon="@drawable/ic_display" />
</PreferenceCategory>
</LeanbackSettingsFragment>
2.2 TV版Settings的核心优势
-
大焦点导航 :使用
LeanbackPreference提供清晰的大焦点效果 -
简化层级:单列菜单减少用户操作步骤
-
TV专属功能:
-
HDMI CEC控制
-
屏幕缩放与过扫描设置
-
数字音频输出选择
-
遥控器配对与管理
-
3. 如何干掉自带Settings,打包TvSettings
3.1 源码结构分析
首先确认两个Settings模块的源码位置:

3.2 分析Settings的打包机制
查看packages/apps/Settings/Android.bp,发现关键配置:

system_ext_specific: true意味着该模块会被自动 打包到system_ext分区,即使我们不在PRODUCT_PACKAGES中显式添加它。
3.3 彻底移除Settings的方法
我们采用了最直接的方案------修改Settings的Android.bp:

3.4 设备配置中添加TvSettings
在device/rockchip/rk356x/device.mk的packages下添加TvSettings:

3.5 遥控器MENU键启动Settings的源码修改
为了让遥控器的MENU键 能正确打开TvSettings,修改PhoneWindowManager.java:
java
// frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public int interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
// ... 省略其他代码
case KeyEvent.KEYCODE_MENU:
final int chordBug = KeyEvent.META_SHIFT_ON;
// ================== 拦截MENU键,打开TvSettings ==================
Slog.d(TAG, "=== MENU key pressed, launching TvSettings ===");
if (!keyguardOn && down && repeatCount == 0) {
mHandler.post(() -> {
Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
Slog.d(TAG, "=== TvSettings launched successfully ===");
} catch (Exception e) {
Slog.e(TAG, "Failed to launch TvSettings", e);
}
});
return -1; // 消费事件,不传递给应用层
}
// =============================================================
if (down && repeatCount == 0) {
if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
// ... 原有的Bug Report逻辑
}
}
break;
}
总结
本文记录了在Rockchip RK3568 Android平台开发过程中,将默认的平板风格系统设置(Settings)替换为Android TV风格设置(TvSettings)的完整实践过程。文章涵盖了问题背景、技术选型、源码分析、编译配置修改,为Android TV设备开发者提供了一套完整的系统设置迁移方案。