如何将 AOSP 系统 UI 替换为自定义 UI?

Posted

技术标签:

【中文标题】如何将 AOSP 系统 UI 替换为自定义 UI?【英文标题】:How to replace the AOSP System UI with a custom one? 【发布时间】:2021-12-27 15:37:57 【问题描述】:

AOSP 中的 SysUI 只是一个应用程序。虽然对 android 框架非常严格。是否有推荐的方法来禁用 vanilla SysUI 并用完全独立的自定义 apk 替换此功能? 我相信这应该是可行的,因为 Wear OS 似乎做了类似的事情。

【问题讨论】:

猜测安装lineageos.org 并使用您可以调整的系统用户界面。 【参考方案1】:

是的。您可以将其替换为自定义的。

SysUI 实现IStatusBar 并通过IStatusBarService#registerStatusBar 将其注册到框架中,并创建一个StatusBarView 和add it to WindowManager 类型为WindowManager.LayoutParams.TYPE_STATUS_BAR。如果你和SysUI做同样的逻辑,你可以替换它。

WearOS 只实现了 SysUI 的两个功能:

    显示和管理通知。它实现了 NotificationListenerService。并且默认启用监听器,或者要求用户确认。然后它会收到所有通知。 一些切换。

因此,您可以像 AOSP 一样实现一个全功能的 SystemUI,它对框架来说会有点紧。如果 IStatusBar 已更改,您也应该更改您的应用程序。 或者你可以实现一个像 WearOS 这样的小功能 SystemUI。 NotificationListenerService 稳定。

【讨论】:

【参考方案2】:

对于不耐烦的人:

让我们使用 LOCAL_OVERRIDES_PACKAGES

  LOCAL_SRC_FILES := new_system_ui.apk
  LOCAL_OVERRIDES_PACKAGES := SystemUI 

在您的 Android.mk 文件中

详情: 让我们以这个 Android.mk 文件为例,从这里How to Add Pre-built App (System App) in AOSP source code

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := Signal
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := Signal-website-universal-release-4.55.8.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

假设您有一个 new_system_ui.apk(可能是 system_ui 与您的自定义代码的一个分支)

创建您的自定义 Android.mk 以使用“new_system_ui.apk”覆盖默认的“system_ui.apk”

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := Signal
LOCAL_CERTIFICATE := platform
LOCAL_SRC_FILES := new_system_ui.apk <-------YOUR APK---->
LOCAL_OVERRIDES_PACKAGES := SystemUI <-------HERE-------->
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)

补充说明:你怎么知道一切都是对的:

"com.android.systemui" 将是在您决定使用LOCAL_OVERRIDES_PACKAGES := SystemUI 之前执行adb shell pm list packages 的结果的一部分 一旦您开始使用LOCAL_OVERRIDES_PACKAGES := SystemUI 并构建/刷新映像,就不会再有“com.android.systemui”了

【讨论】:

以上是关于如何将 AOSP 系统 UI 替换为自定义 UI?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新 UITabbarController 中的默认徽章 UI 外观?

如何将自定义 json 转换为自适应卡片 json 格式

如何将网页不可用页面替换为自定义页面? (网络浏览)

jqGrid 将 URL 设置为自定义按钮

如何禁用 Visual Studio 的默认构建并将其替换为自定义构建工具?

FirebaseUi - Swift - 将 UITableViewCell 的值转换为自定义类