本文原創發佈在華為開發者聯盟社區,歡迎前往原帖【有搜必應】HarmonyOS TOP5熱搜技術問題解析第五期 ,直接與知識貢獻者進行交流。
本期熱搜揭秘:
【編譯工具】通過 build haps 編譯生成的 HAP 包,應如何安裝?
【ArkWeb】WebView 如何攔截特定域名的請求?
【ArkUI】layoutWeight如何實現寬度拉伸?
【系統】從 Windows 11 的 IPSec 第二層隧道協議(L2TP/IPsec)切換到鴻蒙系統後,應選擇哪一種協議?
【編譯工具】modelVersion、targetSdkVersion、compatibleSdkVersion 分別是什麼意思?
期待您在論壇中繼續發聲:無論是提出新的疑惑、發表見解、或分享實戰經驗,都會為鴻蒙社區注入前行的力量,也是讓我們做得更好的動力!若您存在疑惑,可使用社區-問答-"我要提問題"進行提問。問答專區-華為/鴻蒙開發者論壇
往期問題回顧:
【有搜必應】HarmonyOS 熱搜技術問題解析第一期
【有搜必應】HarmonyOS 熱搜技術問題解析第二期
【有搜必應】HarmonyOS 熱搜技術問題解析第三期
【有搜必應】HarmonyOS 熱搜技術問題解析第四期
問題一:通過 build haps 編譯生成的 HAP 包,應如何安裝?
解決方案:
場景一:單HAP包或HSP包安裝
如果使用的是模擬器,直接把HAP包拖動到模擬器中即可完成安裝。
如果使用的是真機,可以使用以下方式進行安裝:
1. 使用hdc應用管理命令命令,例如:
# 安裝一個HAP
hdc install E:\\example.hap
# 安裝一個HSP
hdc install E:\\example.hsp
2. 使用bm工具來進行安裝,例如:
# 安裝一個HAP
bm install -p /data/app/ohos.app.hap
# 覆蓋安裝一個HAP
bm install -p /data/app/ohos.app.hap -r
# 安裝一個應用間共享庫
bm install -s xxx.hsp
使用DevEco Testing工具,連接真機後,選擇實用工具,點擊開始投屏,點擊右側安裝應用即可選擇HAP包進行安裝。
場景二:多個HAP包或HSP包同時安裝
如果包含的HAP和HSP包不多,可以使用命令依次安裝,但需要注意先安裝HSP包再安裝HAP包。
如果包多的情況,可以使用bm install [-p filePath]命令同時安裝HAP和應用內共享庫。
# 同時安裝HAP和應用內共享庫
bm install -p /data/app/
簡化安裝步驟,可以將簽名後的hap與應用內共享庫hsp放在同一目錄下,執行腳本安裝,腳本實現參考:
@echo off
setlocal EnableDelayedExpansion
set current_dir=%~dp0
echo %current_dir%
hdc shell rm -rf data/local/tmp/421e6d0e2f3d4c709f77e43e8c57cfb3
hdc shell mkdir data/local/tmp/421e6d0e2f3d4c709f77e43e8c57cfb3
for /r "%current_dir%" %%i in (\*.hsp \*.hap) do (
echo %%~nxi
echo %%i
hdc file send %%i "data/local/tmp/421e6d0e2f3d4c709f77e43e8c57cfb3/%%~nxi"
)
hdc shell bm install -p data/local/tmp/421e6d0e2f3d4c709f77e43e8c57cfb3
hdc shell rm -rf data/local/tmp/421e6d0e2f3d4c709f77e43e8c57cfb3
echo Install Done!
@pause
如果HSP是應用間共享庫,可使用bm install [-p filePath] [-s hspDirPath]命令同時安裝HAP和應用間共享庫。
# 同時安裝使用方應用和其依賴的應用間共享庫
bm install -p aaa.hap -s xxx.hsp yyy.hsp
原鏈接:通過 build haps 編譯生成的 HAP 包,應如何安裝?
問題二:WebView 如何攔截特定域名的請求?
解決方案:
【背景知識】
Web組件:提供具有網頁顯示能力的Web組件,@ohos.web.webview提供Web控制能力。
【參考方案】:
可參考網頁訪問攔截示例,使用Web組件實現特定網頁訪問攔截。
1. 通過Web組件的onLoadIntercept事件,在加載網頁前觸發攔截判斷。
2. 根據canUrlAccess方法判斷是否能訪問目標網址,如果禁止訪問該網址,則跳轉至攔截頁。
Web({ src: this.url, controller: this.controller })
.onLoadIntercept((event) => {
let url = event.data.getRequestUrl(); // 獲取訪問目標網址
if (UrlUtils.canUrlAccess(url)) { // 判斷是否能夠訪問該url
return false;
} else {
this.controller.loadUrl(\$rawfile('blocked.html')); // 禁止訪問,則跳轉至攔截頁
return true;
}
})
原鏈接:WebView 如何攔截特定域名的請求?
問題三:layoutWeight如何實現寬度拉伸?
解決方案:
【背景知識】
layoutWeight(value: number | string):設置組件的佈局權重,使組件在父容器(Row/Column/Flex)的主軸方向按照權重分配尺寸。
父容器尺寸確定時,不設置layoutWeight屬性或者layoutWeight屬性生效值為0的元素優先佔位,這些元素佔位後在主軸留下的空間稱為主軸剩餘空間。設置了layoutWeight屬性且layoutWeight屬性生效值大於0的子元素會從主軸剩餘空間中按照各自所設置的權重佔比分配尺寸,分配時會忽略元素本身的尺寸設置。
僅在Row/Column/Flex佈局中生效。
如果容器中有子元素設置了layoutWeight屬性,且設置的屬性值大於0,則所有子元素不會再基於flexShrink和flexGrow佈局。
【解決方案】
在HarmonyOS開發中,Row、Column和Flex支持通過layoutWeight屬性動態調整子元素尺寸佔比的核心容器,適用於需要靈活佈局的場景:
Row容器:水平佈局(從左到右),通過layoutWeight設置子元素在水平方向的佔比。
Row() {
Button('左側').layoutWeight(2) // 佔據2/3寬度
Button('右側').layoutWeight(1) // 佔據1/3寬度
}
Column容器:垂直佈局(從上到下),通過layoutWeight設置子元素在垂直方向的佔比。
Column() {
Text('頂部').layoutWeight(1) // 佔據1/2高度
Text('底部').layoutWeight(1) // 佔據1/2高度
}
Flex容器:結合layoutWeight實現多維比例分配(如水平、垂直或混合方向)。
Flex({ direction: FlexDirection.Row }) {
Text('左').layoutWeight(3) // 水平方向佔比3/5
Text('右').layoutWeight(2) // 水平方向佔比2/5
}
原鏈接:layoutWeight如何實現寬度拉伸?
問題四:從 Windows 11 的 IPSec 第二層隧道協議(L2TP/IPsec)切換到鴻蒙系統後,應選擇哪一種協議?
切換HarmonyOS可以選擇添加 L2TP/IPSec PSK 或者 L2TP/IPSec RSA替代L2TP/IPSec。
【背景知識】
VPN,即虛擬專用網絡(Virtual Private Network),是在公用網絡上建立專用網絡的一種技術。在VPN網絡中,任意兩個節點間的連接並非依賴傳統專用網絡所需要的端到端的物理鏈路,而是構建在公用網絡服務商提供的平台(如Internet)之上的邏輯網絡。用户數據在這一邏輯鏈路中進行傳輸。
【解決方案】
VPN功能支持以下幾種協議:
- IKEv2/IPSec MSCHAPv2
- IKEv2/IPSec PSK
- IKEv2/IPSec RSA
- L2TP/IPSec PSK
- L2TP/IPSec RSA
- IPSec Xauth PSK
- IPSec Xauth RSA
- IPSec Hybrid RSA
- OpenVpn
查看路徑如下:
手機系統設置->VPN->添加VPN網絡->類型。 選擇L2TP/IPSec PSK 或者 L2TP/IPSec RSA。
原鏈接:從 Windows 11 的 IPSec 第二層隧道協議(L2TP/IPsec)切換到鴻蒙系統後,應選擇哪一種協議?
問題五:modelVersion、targetSdkVersion、compatibleSdkVersion分別是什麼意思?
解決方案:
modelVersion
含義:標識開發態版本號(即當前開發環境使用的 DevEco Studio 配套工具版本)。
説明:
- 該字段與開發工具的版本嚴格對應,例如 DevEco Studio 6.0.0.858 配套的 modelVersion 值為 6.0.0。
- 主要用於工具鏈兼容性校驗,開發者無需手動修改。
compatibleSdkVersion
含義:標識應用/元服務運行所需兼容的最低SDK版本,應用/元服務不能安裝在低於該版本的設備。當前支持的版本參考所有HarmonyOS版本。相關字段與應用兼容性關係參見應用兼容性説明。
説明:
- 運行環境是HarmonyOS時,字段類型是字符串,配置示例:"compatibleSdkVersion": "6.0.0(20)"。
- 運行環境是OpenHarmony時,字段類型是數值,配置示例:"compatibleSdkVersion": 20。
targetSdkVersion
含義:標識應用/元服務運行所需目標SDK版本,是系統提供的前向兼容手段。如果新SDK版本中API行為發生變更,將應用/元服務安裝到新系統後,可通過該字段提供向前兼容手段,在新系統版本保持老的API行為。
如未配置,默認與compileSdkVersion保持一致。當前支持的版本參考所有HarmonyOS版本。相關標籤與應用兼容性關係參見應用兼容性説明。
説明:
- 運行環境是HarmonyOS時,字段類型是字符串,配置示例:"targetSdkVersion": "6.0.0(20)"。
- 運行環境是OpenHarmony時,字段類型是數值,配置示例:"targetSdkVersion": 20。
modelVersion不需要跟targetSdkVersion對應,由於compatibleSdkVersion字段即標識應用/元服務運行所需兼容的最低SDK版本,所以如果改動這些版本號,需要真機或者模擬器版本兼容最低compatibleSdkVersion版本。
原鏈接:modelVersion、targetSdkVersion、compatibleSdkVersion 分別是什麼含義?