Android systemUI移植

本文详细介绍了Android SystemUI的移植过程,包括navigation_bar.xml的修改、虚拟按键的添加、导航栏位置调整以及QuickSetting的添加。讨论了如何根据不同分辨率适配布局,以及如何实现导航栏的竖直放置和右侧显示。此外,还涵盖了电量百分比显示和自定义状态的添加方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SystemUI

Android4.3或以前版本,SystemUI是分为TabletPhone两种不同代码文件的,在Android4.4已经整合了phonetablet,统一为phone,只区分phonetv对于Phone来说SystemUI指的是:StatusBar(状态栏)NavigationBar(导航栏)

启动后Phone界面上的信号,蓝牙标志,Wifi标志等等这些状态显示标志都会在StatusBar上显示。当我们的设备开机后,首先需要给用户呈现的就是各种界面同时也包括了我们的SystemUI,因此对于整个Android系统来说,SystemUI都有举足轻重的作用。

StatusBarNavigationBar都是在

/SourceCode/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.javastart()方法中,完成初始化并显示到界面上的。

 

1.分辨率

适配不同分辨率需要修改的文件主要有:navigation_bar.xml、以及values-swXXXdp下的dimens.xml

1.1. navigation_bar.xml(导航栏)

只要修改几个虚拟按键的大小和边距,sw600dp上面的布局:android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp",因为默认的导航栏是水平放置,所以使用的边距是paddingLeft,如果是竖直放置就用paddingTop

现在有几种分辨率就有几个navigation_bar.xml,在修改增加分辨率的时候会很麻烦,实际上可以用dimen来给这些大小和边距布局,例如:android:layout_width="@dimen/virtualButtonWidth" android:paddingLeft="@dimen/virtualButtonpaddingLeft" android:paddingRight="@dimen/virtualButtonpaddingRight"

然后在value-swXXXdp目录下的dimen.xml文件下定义对应的值,例如<dimen name="virtualButtonWidth">128dp</dimen>等。以后在增加修改分辨率的时候,就不需要在navigation_bar.xml里面一个一个地修改了。实际上除了navigation_bar.xml的布局,其他布局文件都使用了dimen来定义大小。

Android系统默认在600dp以上分辨率才会显示导航栏,可以在PhoneWindowManager.java中修改mNavigationBarCanMove = shortSizeDp < 600mNavigationBarCanMove = shortSizeDp < 480,那么就能在480dp上显示导航栏。

1.2. values-swXXXdp

目前dimens.xml中主要定义了通知栏和快捷设置的(notification_panel)的布局大小:

1.notification_panel_width:定义了通知栏宽度和快捷设置的宽度,快捷设置里面的每一个小块会根据总宽度平均分成三小块;

### 将 Android SystemUI 源码导入 Android Studio 并正确配置环境 #### 一、准备工作 为了成功将 Android SystemUI 源码迁移到 Android Studio 中并作为可调试的项目运行,需要完成一系列前期准备。首先确认已安装最新版本的 Android Studio 和 JDK,并设置好 NDK 支持[^1]。 #### 二、模块划分与创建 根据现有文档说明,SystemUI 的源码结构较为复杂,因此需要将其拆分为多个独立模块以便于管理。具体来说,通常会划分为以下几个主要模块: - **Keyguard**: 对应 `com.android.keyguard` 包名。 - **Plugins**: 对应 `com.android.systemui.plugins` 包名。 - **Shared**: 对应 `com.android.systemui.shared` 包名。 - **SettingsLib**: 对应 `com.android.settingslib` 包名。 每个模块对应一个单独的 `AndroidManifest.xml` 文件,这是基于原始项目的构建脚本 `Android.mk` 所决定的逻辑分割方式[^2]。 #### 三、删除不必要的测试文件 在迁移过程中,建议移除所有与单元测试相关的目录及其内容(即 `test` 和 `androidTest`),因为这些部分可能依赖特定的 AOSP 构建工具链,在纯 Android Studio 环境下无法正常工作。此操作可以通过简单的批量命令实现[^3]。 #### 四、Gradle 配置调整 由于目标是兼容旧版支持库而非使用最新的 androidx 库体系,需修改全局 Gradle 属性文件 (`gradle.properties`) 如下所示: ```properties android.useAndroidX=false android.enableJetifier=false ``` 同时清空各子模块内的默认依赖项声明区域 (位于各自的 build.gradle 文件中的 dependencies 块),仅保留必要的基础组件定义。 #### 五、资源拷贝同步 最后一步是从原生 AOSP 工程复制所需的全部 Java/Kotlin 源代码以及关联资源至新建立好的各个 module 下对应的 src/main/java 或者 res 子路径当中去。 通过上述流程即可初步达成将整个 Android SystemUI 移植到现代 IDE 上面的目标,从而方便后续进一步定制化开发或者深入研究其内部机制的工作开展起来更加便捷高效。 ```python # 示例 Python 脚本用于自动化处理某些重复劳动环节(非必需) import os def remove_tests(root_dir): """Recursively removes all test directories.""" for dirpath, dirs, files in os.walk(root_dir): if 'tests' in dirs or 'androidTests' in dirs: try: os.rmdir(os.path.join(dirpath,'tests')) os.rmdir(os.path.join(dirpath,'androidTests')) except Exception as e: print(f"Error removing {dirpath}: {e}") remove_tests('/path/to/systemui') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值