OpenHarmony SystemUI开发记录

背景介绍

最近学习OpenHarmony应用开发, SDK版本是3.2.9.2 Beta4,IDE版本是3.1.0.200。参考官方文档,做了个Demo应用,调试、运行非常顺利。启动应用后,状态栏和导航栏占用的高度过高,显得很奇怪,尝试修改一下系统应用。

摸石头过河

因为没做过移动端开发,最初以为状态栏和导航栏是由Launcher控制的,从示例中找了个launcher,按照文档进行编译,放在设备上怎么也起不来,Google查了半天,最后发现该版本中文档描述不全,参考最新版本文档进行编译,运行成功。

有了经验之后,使用系统Launcher进行编译,报了一堆错误,哪里报错改哪里,修改完之后编译成功,因为是系统应用,不能使用自动签名。根据官方提供的签名方式进行签名,放到设备中无法显示应用中心和Dock。

看了系统Launcher代码,感觉状态栏和导航栏并不是由Launcher控制的,又下载了系统SystemUI代码,编译时也有几个报错,不知道怎么解决,后来发现下载的代码不对,应该从分支中选择版本,从标签中选择的版本代码可能不全或者有问题。

编译安装

替换系统应用方法:

// 获取系统目录读写权限
hdc shell "mount -o remount,rw /"
// 拷贝应用到SystemUI目录
hdc file send phone_statusbar-phone_entry-default-signed.hap /system/app/com.ohos.systemui/SystemUI-StatusBar.hap
// 应用放在/data目录下,删除/data目录下的所有文件,系统会重新安装系统应用。
hdc shell "rm -rf /data/*"
// 重启设备
hdc shell reboot
1.系统应用签名
  • 环境

    SDK:Beta4,代码:Beta4

  • 现象

    系统应用无法使用自动签名。

  • 解决方案

    参考链接:系统应用签名,我使用的是标准签名。

    下载material文件夹、OpenHarmony.p12文件、OpenHarmonyApplication.pem文件,放在signature目录下,修改项目中的build-profile.json5文件,添加以下信息,重新编译即可。

        "products": [
          {
            "name": "default",
            "signingConfig": "default"
          }
        ],
        "signingConfigs": [{
          "name": "default",
          "material": {
            "storePassword": "00000016D9DCF063F0FC4BBD0E7FE1E3B06A67C07BECE1BDD4E2A3EFDAE20F890810EC02AA2A",
            "certpath": "signature/OpenHarmonyApplication.pem",
            "keyAlias": "OpenHarmony Application Release",
            "keyPassword": "00000016FD3897FD4C46940ED39FFC652872B7B18BEDCCA07400A6EBEE307C9C41B96DB6B64D",
            "profile": "signature/systemui.p7b",
            "signAlg": "SHA256withECDSA",
            "storeFile": "signature/OpenHarmony.p12"
          }
        }]
    
2.SystemUI编译报错(SDK问题)
  • 环境

    SDK:Beta4,代码:Beta4

  • 现象

    编译报错,信息如下:

    > hvigor ERROR: Failed :phone_statusbar:default@CompileArkTS... 
    > hvigor ERROR: Tools execution failed.
     ArkTS:ERROR File: /xxx/applications_systemui-OpenHarmony-3.2-Beta4/features/batterycomponent/src/main/ets/default/batteryModel.ts:16:25
     Cannot find module '@ohos.batteryinfo' or its corresponding type declarations.
     Module not found: Error: Can't resolve 'bundle/extensionAbilityInfo' in '/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource'
     Module not found: Error: Can't resolve 'bundle/extensionAbilityInfo' in '/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource/common'
     Module not found: Error: Can't resolve 'bundle/metadata' in '/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource/common'
    
  • 排查

    查看API发现bundle目录下没有extensionAbilityInfometadata文件,而bundleManager中有这两个文件。

  • 解决方案

    在报错的地方将bundle/extensionAbilityInfo改为bundleManager/extensionAbilityInfobundle/metadata改为bundleManager/metadata,编译通过。

  • 环境

    SDK:Beta2,代码:Beta4

  • 现象

    编译报错,信息如下:

    > hvigor ERROR: Failed :pc_statusbar:default@CompileArkTS... 
    > hvigor ERROR: Tools execution failed.
     ETS:ERROR File: /xxx/applications_systemui-OpenHarmony-3.2-Beta4/features/batterycomponent/src/main/ets/default/batteryModel.ts:16:25
     Cannot find module '@ohos.batteryInfo' or its corresponding type declarations.
    
  • 排查

    api中info的i为小写,而文件中导入包的时候是大写I

    image

  • 解决方案

    batteryModel.ts文件中大写I改为小写i,即可编译成功,如下:

    import BatteryInfo from "@ohos.batteryinfo";
    
3.SystemUI应用安装失败
  • 环境

    SDK:Beta4,代码:Beta4

  • 现象

    替换状态栏应用后,状态栏消失

  • 排查

    使用bm命令手动安装应用报错:

    手动安装应用
    bm install -p /system/app/com.ohos.systemui/SystemUI-Status.hap -u 0
    // 报错信息
    error: failed to install bundle.
    error: install releaseType not same
    

    报错信息意思是设备中SystemUI中SDK版本与我自己编译的SystemUI SDK版本不一致,查看一下设备中SystemUI的SDK版本:

    hdc shell cat /data/app/el1/bundle/public/com.ohos.systemui/phone_statusbar/module.json
    

    image

  • 解决方案:

    系统中使用的是SDK Beta2,而我编译使用的是SDK Beta4,所以需要将SDK切换到Beta2版本(Beta2编译Beta4版本代码也会有问题,参考:SystemUI编译报错(SDK问题))。

4.安装导航栏后状态栏消失
  • 环境

    SDK:Beta4,代码:Beta2

  • 现象

    单独安装状态栏正常,安装导航栏后状态栏消失

  • 排查

    查看状态栏日志,发现有很多日志没有打出来,追踪了一下,定位到features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts文件中,发现卡在这里

    image

    status_bar_size_landscape搜索一下这个字段,发现base/element/string.json文件中存在该字段,zh_CN/element/string.json文件中不存在该字段。(zh_CN/element/string.json添加字段后状态栏正常显示,是什么原因不清楚)

  • 解决方案

    product/phone/statusbar/src/main/resources/zh_CN/element/string.json文件中添加以下内容:

        {
          "name": "status_bar_size_portrait",
          "value": "16"
        },
        {
          "name": "status_bar_size_landscape",
          "value": "16"
        },
        {
          "name": "phone_status_bar_size_portrait",
          "value": "16"
        },
        {
          "name": "phone_status_bar_size_landscape",
          "value": "16"
        },
    

定制化开发

经过摸索,状态栏和导航栏布局在窗口管理中控制,可以修改模块下的ServiceExtAbility.ts文件来自定义实现,也可以修改配置文件resources/zh_CN/element/string.json中的以下字段,来控制状态栏和导航栏的高度(这里高度不能加单位,按照官网文档的说法默认使用的VP单位)。

    {
      "name": "nav_bar_size_portrait",
      "value": "26"
    },
    {
      "name": "nav_bar_size_landscape",
      "value": "26"
    },
    {
      "name": "status_bar_size_portrait",
      "value": "16"
    },
    {
      "name": "status_bar_size_landscape",
      "value": "16"
    },

总结

做普通应用Demo上手容易,ArkTS做页面布局方便,使用组件点点点即可得到想要的样式。因为使用的是Beta版本,修改SystemUI过程中遇到很多坑,比如编译报错,应用安装失败,应用消失等问题,在Google上基本搜不出来解决方案,只能在官方文档、51CTO社区、华为开发者联盟上搜索、提问来解决。像是安装导航栏后状态栏消失问题,解决起来很容易,但是寻找解决方法要花很长时间,这也是写这篇文章的原因,希望可以帮助开发者解决问题,同时也希望OpenHarmony社区能够建立起来,为开发者答疑解惑。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Android 系统界面的一部分是 SystemUI。它是 Android 操作系统的一个系统应用程序,提供了通知栏、状态栏、快捷设置等重要的用户界面元素。如果您想要自定义 SystemUI,可以按照以下步骤进行操作: 1. 首先,您需要了解 SystemUI 的架构和工作原理。它是一个基于 Java 的应用程序,使用 Android 的 Binder 机制与系统服务通信。您可以通过下载 Android 源代码并查看源代码来深入了解其工作原理。 2. 然后,您需要创建一个新的 Android 应用程序项目,并将其配置为 SystemUI 扩展。这可以通过在 manifest 文件中声明一个文件提供者来实现。例如: ```xml <provider android:name=".SystemUIProvider" android:authorities="com.example.systemui.provider" android:exported="true" android:grantUriPermissions="true"> <meta-data android:name="com.android.systemui" android:resource="@xml/systemui_extensions" /> </provider> ``` 其中,`SystemUIProvider` 是您创建的文件提供者类的名称,`com.example.systemui.provider` 是您自己的包名,`@xml/systemui_extensions` 是您的扩展配置文件的资源 ID。 3. 接下来,您需要创建一个扩展配置文件,以指定 SystemUI 如何加载您的扩展。例如: ```xml <extensions> <extension class="com.example.systemui.MyExtension" targetPackage="com.android.systemui" targetClass="com.android.systemui.statusbar.phone.PhoneStatusBar" attach="true" /> </extensions> ``` 其中,`MyExtension` 是您创建的扩展类的名称,`com.android.systemui.statusbar.phone.PhoneStatusBar` 是您要扩展的目标类的完全限定名称。 4. 最后,您需要创建一个扩展类,并实现所需的功能。例如,如果您想要添加一个新的按钮到状态栏,您可以创建一个 `View`,并将其添加到状态栏中。您可以使用 Android 提供的 `StatusBarManager` 类来添加视图。 以上是自定义 Android SystemUI 的大致步骤,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2201_75761617

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值