最近學(xué)習(xí) OpenHarmony 應(yīng)用開發(fā), SDK 版本是 3.2.9.2 Beta4,IDE 版本是 3.1.0.200。
參考官方文檔,做了個 Demo 應(yīng)用,調(diào)試、運行非常順利。啟動應(yīng)用后,狀態(tài)欄和導(dǎo)航欄占用的高度過高,顯得很奇怪,嘗試修改一下系統(tǒng)應(yīng)用。
摸石頭過河
因為沒做過移動端開發(fā),最初以為狀態(tài)欄和導(dǎo)航欄是由 Launcher 控制的。
https://gitee.com/openharmony/applications_app_samples/tree/master/ability/Launcher
從示例中找了個 launcher,按照文檔進行編譯,放在設(shè)備上怎么也起不來,Google 查了半天,最后發(fā)現(xiàn)該版本中文檔描述不全,參考最新版本文檔進行編譯,運行成功。
有了經(jīng)驗之后,使用系統(tǒng) Launcher 進行編譯,報了一堆錯誤。
https://gitee.com/openharmony/applications_launcher
哪里報錯改哪里,修改完之后編譯成功,因為是系統(tǒng)應(yīng)用,不能使用自動簽名。根據(jù)官方提供的簽名方式進行簽名,放到設(shè)備中無法顯示應(yīng)用中心和 Dock。
看了系統(tǒng) Launcher 代碼,感覺狀態(tài)欄和導(dǎo)航欄并不是由 Launcher 控制的,又下載了系統(tǒng) SystemUI 代碼,編譯時也有幾個報錯,不知道怎么解決。
后來發(fā)現(xiàn)下載的代碼不對,應(yīng)該從分支中選擇版本,從標簽中選擇的版本代碼可能不全或者有問題。
編譯安裝踩坑
替換系統(tǒng)應(yīng)用方法:
//獲取系統(tǒng)目錄讀寫權(quán)限 hdcshell"mount-oremount,rw/" //拷貝應(yīng)用到SystemUI目錄 hdcfilesendphone_statusbar-phone_entry-default-signed.hap/system/app/com.ohos.systemui/SystemUI-StatusBar.hap //應(yīng)用放在/data目錄下,刪除/data目錄下的所有文件,系統(tǒng)會重新安裝系統(tǒng)應(yīng)用。 hdcshell"rm-rf/data/*" //重啟設(shè)備 hdcshellreboot
①系統(tǒng)應(yīng)用簽名
環(huán)境:SDK:Beta4,代碼:Beta4
現(xiàn)象:系統(tǒng)應(yīng)用無法使用自動簽名。
解決方案:參考系統(tǒng)應(yīng)用簽名,我使用的是標準簽名。
下載 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":"OpenHarmonyApplicationRelease", "keyPassword":"00000016FD3897FD4C46940ED39FFC652872B7B18BEDCCA07400A6EBEE307C9C41B96DB6B64D", "profile":"signature/systemui.p7b", "signAlg":"SHA256withECDSA", "storeFile":"signature/OpenHarmony.p12" } }]
②SystemUI 編譯報錯(SDK 問題)
環(huán)境:SDK:Beta4,代碼:Beta4
現(xiàn)象:編譯報錯
信息如下:
>hvigorERROR:Faileddefault@CompileArkTS... >hvigorERROR:Toolsexecutionfailed. ArkTS:ERRORFile:/xxx/applications_systemui-OpenHarmony-3.2-Beta4/features/batterycomponent/src/main/ets/default/batteryModel.ts:16:25 Cannotfindmodule'@ohos.batteryinfo'oritscorrespondingtypedeclarations. Modulenotfound:Error:Can'tresolve'bundle/extensionAbilityInfo'in'/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource' Modulenotfound:Error:Can'tresolve'bundle/extensionAbilityInfo'in'/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource/common' Modulenotfound:Error:Can'tresolve'bundle/metadata'in'/xxx/applications_systemui-OpenHarmony-3.2-Beta4/common/src/main/ets/plugindatasource/common'
排查:查看 API 發(fā)現(xiàn) bundle 目錄下沒有 extensionAbilityInfo 和 metadata 文件,而 bundleManager 中有這兩個文件。
解決方案:在報錯的地方將 bundle/extensionAbilityInfo 改為 bundleManager/extensionAbilityInfo,bundle/metadata 改為 bundleManager/metadata,編譯通過。
環(huán)境:SDK:Beta2,代碼:Beta4
現(xiàn)象:編譯報錯
信息如下:
>hvigorERROR:Faileddefault@CompileArkTS... >hvigorERROR:Toolsexecutionfailed. ETS:ERRORFile:/xxx/applications_systemui-OpenHarmony-3.2-Beta4/features/batterycomponent/src/main/ets/default/batteryModel.ts:16:25 Cannotfindmodule'@ohos.batteryInfo'oritscorrespondingtypedeclarations.排查:api 中 info 的 i 為小寫,而文件中導(dǎo)入包的時候是大寫 I。
解決方案:將 batteryModel.ts 文件中大寫I改為小寫 i,即可編譯成功。
如下:
importBatteryInfofrom"@ohos.batteryinfo";
③SystemUI 應(yīng)用安裝失敗
環(huán)境:SDK:Beta4,代碼:Beta4
現(xiàn)象:替換狀態(tài)欄應(yīng)用后,狀態(tài)欄消失
排查:使用 bm 命令手動安裝應(yīng)用報錯
手動安裝應(yīng)用 bminstall-p/system/app/com.ohos.systemui/SystemUI-Status.hap-u0 //報錯信息 error:failedtoinstallbundle. error:installreleaseTypenotsame
報錯信息意思是設(shè)備中 SystemUI 中 SDK 版本與我自己編譯的 SystemUI SDK 版本不一致。
查看一下設(shè)備中 SystemUI 的 SDK 版本:
hdcshellcat/data/app/el1/bundle/public/com.ohos.systemui/phone_statusbar/module.json
解決方案:系統(tǒng)中使用的是 SDK Beta2,而我編譯使用的是 SDK Beta4,所以需要將 SDK 切換到 Beta2 版本。
Beta2 編譯 Beta4 版本代碼也會有問題,參考:SystemUI 編譯報錯(SDK 問題))。
④安裝導(dǎo)航欄后狀態(tài)欄消失
環(huán)境:SDK:Beta4,代碼:Beta2
現(xiàn)象:單獨安裝狀態(tài)欄正常,安裝導(dǎo)航欄后狀態(tài)欄消失
排查:查看狀態(tài)欄日志,發(fā)現(xiàn)有很多日志沒有打出來,追蹤了一下,定位到 features/statusbarcomponent/src/main/ets/com/ohos/common/StatusBarConfiguration.ts 文件中,發(fā)現(xiàn)卡在這里:
status_bar_size_landscape 搜索一下這個字段,發(fā)現(xiàn) base/element/string.json 文件中存在該字段,zh_CN/element/string.json 文件中不存在該字段。
zh_CN/element/string.json 添加字段后狀態(tài)欄正常顯示,是什么原因不清楚。
解決方案:product/phone/statusbar/src/main/resources/zh_CN/element/string.json 文件中添加以下內(nèi)容:
{ "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" },
定制化開發(fā)
經(jīng)過摸索,狀態(tài)欄和導(dǎo)航欄布局在窗口管理中控制,可以修改模塊下的 ServiceExtAbility.ts 文件來自定義實現(xiàn)。
也可以修改配置文件 resources/zh_CN/element/string.json 中的以下字段,來控制狀態(tài)欄和導(dǎo)航欄的高度(這里高度不能加單位,按照官網(wǎng)文檔的說法默認使用的 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" },
總結(jié)
做普通應(yīng)用 Demo 上手容易,ArkTS 做頁面布局方便,使用組件點點點即可得到想要的樣式。
因為使用的是 Beta 版本,修改 SystemUI 過程中遇到很多坑,比如編譯報錯,應(yīng)用安裝失敗,應(yīng)用消失等問題。
在 Google 上基本搜不出來解決方案,只能在官方文檔、51CTO 社區(qū)、華為開發(fā)者聯(lián)盟上搜索、提問來解決。
像是安裝導(dǎo)航欄后狀態(tài)欄消失問題,解決起來很容易,但是尋找解決方法要花很長時間,這也是寫這篇文章的原因。
希望可以幫助開發(fā)者解決問題,同時也希望 OpenHarmony 社區(qū)能夠建立起來,為開發(fā)者答疑解惑。
-
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68611 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32870 -
開發(fā)者
+關(guān)注
關(guān)注
1文章
575瀏覽量
17010 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3722瀏覽量
16317
原文標題:OpenHarmony SystemUI開發(fā)記錄
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論