背景介绍

最近学习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

  • 解决方案

    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

  • 解决方案:

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

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

  • 环境

    SDK:Beta4,代码:Beta2

  • 现象

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

  • 排查

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

    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社区能够建立起来,为开发者答疑解惑。

最后,感谢Haoc_小源同学的帮助,感谢TiZizzzOpenHarmony应用签名 - 系统应用签名文章。

OpenHarmony SystemUI开发记录的更多相关文章

  1. CozyRSS开发记录22-界面退化

    CozyRSS开发记录22-界面退化 1.问题1-HtmlTextBlock 找的这个HtmlTextBlock有很严重的bug,有时候显示不完全,有时候直接就崩了.然后看了下代码,完全是学生仔水平写 ...

  2. CozyRSS开发记录21-默认RSS源列表

    CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...

  3. CozyRSS开发记录20-CanResizeWithGrip

    CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...

  4. CozyRSS开发记录19-窗口标题栏交互

    CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...

  5. CozyRSS开发记录18-番外之Atom1.0的支持

    CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...

  6. CozyRSS开发记录17-Html2Xaml

    CozyRSS开发记录17-Html2Xaml 1.RssContentView还需要优化 上回做了RssContentView的显示,但是对于rss返回的描述(摘要),连换行的没有,更别说里面还有h ...

  7. CozyRSS开发记录16-RssContentView显示

    CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...

  8. CozyRSS开发记录15-获取和显示RSS内容

    CozyRSS开发记录15-获取和显示RSS内容 1.内容列表 我们先给RSSContentFrame增加一个ViewModel,里面和RSS源列表一样,提供一个ObservableCollectio ...

  9. CozyRSS开发记录14-RSS源管理初步完工

    CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...

  10. CozyRSS开发记录13-添加订阅的对话框

    CozyRSS开发记录13-添加订阅的对话框 1.设计对话框 首先,还是先用MockPlus来画个原型图: 因为用了MaterialDesignToolkit,那么可以很方便的有一个蒙层的效果. 2. ...

随机推荐

  1. 运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created

    运行python脚本报错:selenium.common.exceptions.SessionNotCreatedException: Message: session not created 原因: ...

  2. What is RSS

    What is RSS?RSS (Rich Site Summary) is a format for delivering regularly changing web content. Many ...

  3. 前端复习之css

    1.css概述 1 1.CSS3概述 2 1.问题 3 1.设置页面中所有的文本颜色为红色 4 2.设置页面中所有div的文本的颜色为蓝色 5 3.将所有的div的文本的颜色改为黄色 6 7 HTML ...

  4. python学习记录(二)-特殊函数

    闭包函数 def outer(): var = 100 def inner(): nonlocal var var += 200 print(var) return inner res = outer ...

  5. Python之简单文件操作

    文件操作,open() 1 # open(file_path, mode='r', encoding='utf-8') 2 # file_path 目标文件路径 3 # mode 文件模式,参数r-读 ...

  6. gongwen

    gongwen 学号 姓名 工作占比 20201307 梁辰鱼 20% 20201323 谭顺心 17% 20201222 龚 杰 16.5% 20201325 夏俊睿 16% 20201317 鲁永 ...

  7. [.Net]Framwork WebAPI添加接口请求监控

    思路: 通过重写 ActionFilterAttribute 拦截Action的请求及返回信息,实现对接口请求的监听. 最终效果如下: 全局启用需配置如下: 局部启用需配置如下: 源码如下: 1 // ...

  8. ubuntu 16.04 安装VNC远程桌面 安装wine+hfs

    1.安装$sudo apt-get install xfce4 $sudo apt-get install vnc4server$sudo apt-get install xrdp 2.启动VNC s ...

  9. ubuntu系统使用 sudo: cd:找不到命令

    1. https://blog.csdn.net/sazass/article/details/125694492 https://blog.csdn.net/weixin_34033624/arti ...

  10. webpack之性能优化(webpack4)

    在讲解性能优化的方案之前,我们需要了解一下webpack的整个工作流程, 方案一:减少模块解析 也就是省略了构建chunk依赖模块的这几个步骤 如果没有loader对该模块进行处理,该模块的源码就是最 ...