Android 系统设置从平板版迁移至TV版实践

目录

[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的核心优势

  1. 大焦点导航 :使用LeanbackPreference提供清晰的大焦点效果

  2. 简化层级:单列菜单减少用户操作步骤

  3. 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设备开发者提供了一套完整的系统设置迁移方案。

相关推荐
杉氧4 小时前
打破边界(一):实战编写 Android/iOS 原生模块 (Native Modules)
android·react native·前端框架
baidu_247438614 小时前
Android 35适配
android
mmsx5 小时前
osmdroid 踩坑清单:大级别崩溃/路径消失/低内存卡顿/范围缩放不准
android·源码·地图·osmdroid
gf13211115 小时前
【python_回复邮件】
android·java·python
段一凡-华北理工大学6 小时前
高炉智能布料技术与炉料分布优化~专栏简介与目录
android·人工智能·高炉智能化·高炉布料·高炉布料分布·高炉布料参数优化·高炉布料矩阵
hunterandroid6 小时前
Android 多渠道打包与 Gradle 构建优化实战
android·前端·kotlin
小白羊丨6 小时前
异步任务创建接口如何幂等?
android·数据库
用户0934077735147 小时前
HarmonyOS WPS Open SDK 实践:把水印与修订收成打开策略层
android·typescript·harmonyos