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

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui