【HarmonyOS Next之旅】DevEco Studio使用指南(三十六) -> 配置構建(三)

目錄

1 -> 定制HAR多目標構建產物

1.1 -> 定義產物的deviceType

1.2 -> 定義C++工程依賴的.so文件

1.3 -> 定義產物的資源

2 -> 配置APP多目標構建產物

2.1 -> 定義產物的APP包名和供應商名稱

2.2 -> 定義product的bundleName

2.3 -> 定義product的bundleType

2.4 -> 定義product的簽名配置信息

2.5 -> 定義product的icon和label

2.6 -> 定義product中包含的target

3 -> 多產物構建target


1 -> 定制HAR多目標構建產物

每一個HAR模塊均支持定制不同的target,通過在模塊中的build-profile.json5文件中實現差異化定制,當前支持設備類型(deviceType)、資源(resource)、buildOption配置項(如C++依賴的.so、混淆配置、abi類型、cppFlags等)、源碼集(source)的定制。

說明

當前版本,在DevEco Studio中編譯時,僅支持編譯target為default的模塊。若需指定其他target,需通過命令行來指定,并通過命令行來編譯。

例如構建指定的自定義target:free的har,可參考執行以下命令:

hvigorw --mode module -p product=default -p module=library@free -p buildMode=debug assembleHar

1.1 -> 定義產物的deviceType

每一個target均可以指定支持的設備類型deviceType,也可以不定義。如果不定義,則該target默認支持config.json或module.json5中定義的設備類型。

同時,在定義每個target的deviceType時,支持的設備類型必須在config.json或module.json5中已經定義。例如,在上述定義的2個target中,分別定義default默認支持所有設備類型,free版本只支持2in1設備。

{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default"  //未定義deviceType,默認支持config.json或module.json5中定義的設備類型 }, { "name": "free","config": { "deviceType": [  //定義free支持的設備類型為2in1"2in1" ] } }] 
}

1.2 -> 定義C++工程依賴的.so文件

在 C++ 工程中,可以對每個target依賴的.so文件進行定制。例如某模塊依賴了function1.so、function2.so和function3.so三個文件,其中target為default的產物依賴了function1.so和function2.so;其中target為vip的產物依賴了function1.so和 function3.so,則示例代碼如下所示:

{"apiType": 'stageMode',"buildOption": {"externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": [],"abiFilters": ["arm64-v8a","x86_64"],"cppFlags": "",}},"targets": [  //定義不同的target {"name": "default","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的優先級順序,打包最高優先級的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function3.so文件 "excludes": ["**/function3.so"],//允許當.so中資源重名沖突時,使用高優先級的.so文件覆蓋低優先級的.so文件 "enableOverride": true}}}}},{"name": "vip","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的優先級順序,打包最高優先級的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function2.so文件 "excludes": ["**/function2.so"],//允許當.so中資源重名沖突時,使用高優先級的.so文件覆蓋低優先級的.so文件 "enableOverride": true}}}}}]
}

1.3 -> 定義產物的資源

每個target使用的資源文件可能存在差異,在開發過程中,開發者可以將每個target所使用的資源存放在不同的資源目錄下。其中,ArkTS工程支持對main目錄下的資源文件目錄(resource)進行定制;JS工程支持對main目錄下的資源文件目錄(resource)及Ability下的資源文件目錄(res)進行定制。如下為ArkTS工程的資源文件目錄定制示例:

{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default","resource": {  //定義默認版target使用的資源文件目錄 "directories": [ "./src/main/resources_default" ] } }, { "name": "free", "config": { "deviceType": [ "2in1" ] }, "resource": {  //定義免費版target使用的資源文件目錄 "directories": [ "./src/main/resources_default", "./src/main/resources_free" ] } },] 
}

2 -> 配置APP多目標構建產物

APP用于應用/元服務上架發布,針對不同的應用場景,可以定制不同的product,每個product中支持對bundleName、bundleType、簽名信息、icon和label以及包含的target進行定制。

定義目標產物product

每一個product對應一個定制的APP包,因此,在定制APP多目標構建產物前,應提前規劃好需要定制的product名稱。例如,定義productA和productB。工程級build-profile.json5文件示例如下:

在定制product時,必須存在"default"的product,否則編譯時會出現錯誤。

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.1 -> 定義產物的APP包名和供應商名稱

每一個product均可以指定產物命名和供應商名稱。

{ "app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputName-1.0.0"  //產物名稱為customizedProductOutputName-1.0.0}, "vendor": "customizedProductVendorName"   //供應商名稱為customizedProductVendorName}, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameA-1.0.0"  //產物名稱為customizedProductOutputNameA-1.0.0}, "vendor": "customizedProductVendorNameA"   //供應商名稱為customizedProductVendorNameA}, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameB-1.0.0" //產物名稱為customizedProductOutputNameB-1.0.0}, "vendor": "customizedProductVendorNameB"   //供應商名稱為customizedProductVendorNameB} ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] }, 
}

如果已配置簽名,product產物對應的APP包名為開發者定制的名稱;如果未配置簽名,product產物對應的APP包名為定制的名稱+unsigned。

2.2 -> 定義product的bundleName

針對每個定義的product,均可以定制不同的bundleName,如果product未定義bundleName,則采用工程默認的bundleName。示例如下所示:

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  //定義default的bundleName信息 }, { "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  //定義productA的bundleName信息}, { "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com"  //定義productB的bundleName信息 } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.3 -> 定義product的bundleType

針對每個定義的product,均可以定制不同的bundleType。開發者可以通過定義每個product的bundleType,分別定義產物類型:

  • bundleType值為app,表示產物為應用;
  • bundleType值為atomicService,表示產物為元服務。

如果product未定義bundleType,則采用工程的bundleType(即創建工程時選擇的Application/Atomic Service)。示例如下所示:

"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com",   "bundleType": "app" //定義default的bundleType信息 },{ "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com",    "bundleType": "atomicService"  //定義productA的bundleType信息 },{ "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com",    "bundleType": "atomicService"  //定義productB的bundleType信息 } ], "buildModeSet": [ { "name": "debug", },{ "name": "release"} ] 
}

2.4 -> 定義product的簽名配置信息

針對每個定義的product,均可以定制不同的signingConfig簽名文件,如果product未定義signingConfig,則構建生成未簽名的APP包。

通常情況下,您首先需要在簽名配置界面或工程的build-profile.json5文件中配置簽名信息。例如在File > Project Structure > Project > Signing Configs界面,分別配置default、productA和productB的簽名信息,如下圖所示:

簽名信息配置完成后,再添加各個product對應的簽名文件,示例如下所示:

您也可以提前在product中定義簽名文件信息,然后在簽名界面對每個product進行簽名,確保配置的product簽名文件與簽名界面配置的簽名文件保持一致即可。

"app": { "signingConfigs": [], //此處通過界面配置簽名后會自動生成相應的簽名配置,本文略 "products": [ { "name": "default", "signingConfig": "default", //定義default的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  }, { "name": "productA", "signingConfig": "productA", //定義productA的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  }, { "name": "productB", "signingConfig": "productB", //定義productB的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] 
}

2.5 -> 定義product的icon和label

針對每個定義的product,均可以定制不同的icon和label,如果product未定義icon和label,則采用工程默認的icon和label。示例如下所示:

說明

products中的icon和label字段在編譯時會替換app.json5中對應的字段,app.json5和module.json5均可以配置這兩個字段。

{"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:default_icon", //定義default的icon"label":"$string:default_name", //定義default的label},{"name": "productA","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","icon":"$media:productA_icon", //定義productA的icon"label":"$string:productA_name", //定義productA的label},{"name": "productB","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:productB_icon", //定義productB的icon"label":"$string:productB_name",  //定義productB的label}],"buildModeSet": [{"name": "debug",},{"name": "release"}]},...
}

2.6 -> 定義product中包含的target

可以選擇需要將定義的target分別打包到哪一個product中,每個product可以指定一個或多個target。

同時每個target也可以打包到不同的product中,但是同一個module的不同target不能打包到同一個product中(除非該module的不同target配置了不同的deviceType或distributionFilter/distroFilter)。

例如,前面定義了default、free和pay三個target,現需要將default target打包到default product中;將free target打包到productA中;將pay target打包到productB中,對應的示例代碼如下所示:

{ "app": { "signingConfigs": [], //此處通過界面配置簽名后會自動生成相應的簽名配置,本文略 "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com"  }, { "name": "productA", "signingConfig": "productA","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com"  }, { "name": "productB", "signingConfig": "productB",  "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [ { "name": "default",  //將default target打包到default APP中 "applyToProducts": [ "default" ] }, { "name": "free",  //將free target打包到productA APP中 "applyToProducts": [ "productA" ] }, { "name": "pay",  //將pay target打包到productB APP中 "applyToProducts": [ "productB" ] } ] } ] 
}

3 -> 多產物構建target

align target:編譯構建時,優先級最高的target。工程配置align target后,如果模塊中存在align target,那么將自動選擇align target進行構建。align target作用范圍是整個工程,只能配置一個,支持命令行和配置文件兩種方式。

  • 命令行方式示例如下:
hvigorw -c properties.ohos.align.target=target1 assembleHap
  • 在hvigor-config.json5配置文件中添加ohos.align.target,示例如下:
"properties": {'ohos.align.target': 'target1'
},

fallback target:當模塊不存在指定的target時會選用default進行構建,但如果不想用default進行構建,那么可以配置fallback target,當找不到指定target時,如果模塊中存在fallback target,則使用fallback target進行構建。fallback target作用范圍是整個工程,可配置多個,配置多個時按數組順序先命中的生效。

  • 命令行方式示例如下:
hvigorw -c properties.ohos.fallback.target=target1,target2 assembleHap
  • 在hvigor-config.json5配置文件中添加ohos.fallback.target,示例如下:
"properties": {'ohos.fallback.target': ['target1', 'target2']
}

說明

  • align target和fallback target配置方式命令行優先級高于配置文件。
  • 使用配置文件配置align target和fallback target,僅支持DevEco Studio界面Build菜單欄功能,不支持Run菜單欄功能,可通過hdc命令行工具進行推包運行、調試。

多個target的優先級順序為:align target > 命令行指定模塊target > 父級模塊target > fallback target > default。

舉例說明:

工程依賴entry->lib1->lib2,需要構建多個產品A、B、C,工程中target配置如下:

entry: A、B、default

lib1: B、C、default

lib2: A、C、default

指定align target為A,fallback target為C。那么構建hap時的編譯命令為:

hvigorw --mode module -p module=entry -c properties.ohos.align.target=A -c properties.ohos.fallback.target=C assembleHap

編譯的target選擇就是:entry@A, lib1@C, lib2@A。

說明

以上所有說明僅針對非ohosTest模式。在ohosTest模式下,依賴的target固定為default,其他target均不生效。


感謝各位大佬支持!!!

互三啦!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90762.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據賦能(340)——技術平臺——共享平臺

概述重要性如下:提高數據利用效率:數據共享平臺能夠將分散在各部門的數據進行集中管理,促進數據流通和共享,避免數據孤島現象,從而提高數據利用效率。促進決策科學化:通過共享平臺,各部門可以獲…

開閉原則在C++中的實現

開閉原則(Open/Closed Principle,簡稱 OCP)是面向對象設計中的一個重要原則,屬于“SOLID”原則之一。它的核心思想是:“軟件實體(如類、模塊、函數等)應該對擴展開放,對修改關閉。”…

C語言:*p++與p++有何區別

1. 指針基礎練習&#xff1a;演示p、p和(*p)的區別核心目的&#xff1a;區分指針自增與指針指向值自增的不同邏輯&#xff0c;理解運算符優先級對指針操作的影響。#include <stdio.h>void arr1() {int arr[] {11,13,15,17,19};int *p arr;printf("結果1&#xff1…

【設計】設計一個web版的數據庫管理平臺后端(之二)

在之前&#xff0c;我寫過一篇【設計】設計一個web版的數據庫管理平臺后端精要 的文章&#xff0c;文章講了一個web版數據庫管理平臺的實現思路及主要代碼。 最近&#xff0c;我看了下Mybatis的源碼&#xff0c;覺得Mybatis的分層架構挺好&#xff0c;所以想到了完善下web版數據…

Visual tudio 各版本下 C++ 開發的核心區別與實踐指南

C語言的發展經歷了數十年的演進&#xff0c;從 C98 到現代的 C20/23&#xff0c;語言本身發生了巨大的變革。與此同時&#xff0c;Visual Studio 作為主流的 C 開發環境之一&#xff0c;其編譯器對各個 C 標準的支持程度也隨版本不斷演進&#xff0c;直接影響著開發者的編程方式…

怎樣讓阿里云服務器(centos)有界面

要讓阿里云服務器 CentOS 有圖形界面&#xff0c;可以按照以下步驟進行操作&#xff1a;登錄服務器&#xff1a;使用 SSH 客戶端工具&#xff0c;通過 IP 地址和賬號登錄到阿里云服務器。更新系統軟件源&#xff1a;輸入命令sudo yum update&#xff0c;更新系統軟件源&#xf…

Qt 異步編程模式與應用

在現代軟件開發中&#xff0c;異步編程已成為提升應用性能和響應性的關鍵技術。Qt 作為一個強大的跨平臺框架&#xff0c;提供了多種異步編程模式&#xff0c;包括信號槽機制、事件循環、線程池、異步 I/O 等。本文將深入探討 Qt 異步編程的各種模式及其應用場景&#xff0c;幫…

面試150 數字范圍按位與

思路 只要 left < right&#xff0c;說明兩者在某些低位上存在不同&#xff0c;為了找到它們的公共前綴&#xff08;高位相同部分&#xff09;&#xff0c;不斷將 left 和 right 同時右移&#xff08;即除以2&#xff09;&#xff0c;直到它們相等&#xff0c;記錄右移的次數…

數據庫HB OB mysql ck startrocks, ES存儲特點,以及應用場景

這些數據庫和存儲引擎主要有:HB(HBase)、OB(OceanBase)、MySQL、ClickHouse(CK)、StarRocks、Elasticsearch(ES),下面分別介紹它們的存儲特點以及典型應用場景。 1. HBase (HB) 存儲特點 分布式、面向列的NoSQL數據庫 采用HDFS存儲,數據以表、row key、列族、時間戳…

Java技術棧/面試題合集(17)-Git篇

場景 Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享: Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享_java高級進階-CSDN博客 通過對面試題進行系統的復習可以對Java體系的知識點進行查漏補缺。…

破局與重構:King’s LIMS 引領電子行業實驗室智能化轉型

在全球化高新技術競爭白熱化背景下&#xff0c;電子行業正經歷從規模導向擴張向質量效益躍升的戰略轉型。終端用戶對產品性能的極致化追求、行業質量合規標準的持續迭代升級&#xff0c;以及檢測數據的指數級增長&#xff0c;共同形成"需求牽引供給、供給創造需求"的…

暑期算法訓練.9

目錄 43 .力扣75 顏色分類 43.1 題目解析&#xff1a; 43.2 算法思路&#xff1a; 43.3 代碼演示&#xff1a; 43.4 總結反思&#xff1a; 44. 力扣 912 排序數組 44.1 題目解析&#xff1a; 44.2 算法思路&#xff1a; 44.3 代碼演示&#xff1a; ?編輯 44.4 總結反…

2.安裝CUDA詳細步驟(含安裝截圖)

2.安裝CUDA 第一步&#xff1a;安裝anaconda 注意&#xff1a;安裝CUDA之前需要安裝好anaconda&#xff0c;詳見安裝anaconda詳細步驟&#xff08;含安裝截圖&#xff09; 文章目錄2.安裝CUDA2.0 CUDA是什么&#xff0c;為什么要安裝它&#xff1f;2.1 驗證計算機是否安裝CUDA2…

Triton IR

Triton IR語法 Triton IR的語句遵從MLIR Dialect的語法定義規范&#xff0c;示例如下&#xff1a; %3 tt.splat %1 : i32 -> tensor<1024xi32> loc(#loc5) 其中&#xff1a; %0&#xff1a;右邊expression的結果值的名字&#xff08;Value的name&#xff09; tt…

掌握JavaScript函數封裝與作用域

JavaScript 基礎 - 第4天筆記理解封裝的意義&#xff0c;能夠通過函數的聲明實現邏輯的封裝&#xff0c;知道對象數據類型的特征&#xff0c;結合數學對象實現簡單計算功能。理解函數的封裝的特征掌握函數聲明的語法理解什么是函數的返回值知道并能使用常見的內置函數函數理解函…

Datawhale AI 夏令營—科大訊飛AI大賽(大模型技術)—讓大模型理解表格數據(列車信息表)

目錄 一、本次賽事目標&#xff1a;讓大模型理解表格數據&#xff08;列車信息表&#xff09; 二、分析賽題、對問題進行建模 賽事背景 賽題解讀 數據分析與探索 賽題要點與難點 解題思考過程 三、Baseline方案 Baseline概況 Baseline運行步驟 Baseline文件概況 Ba…

SSH連接失敗排查與解決教程: Connection refused

前言 當使用云服務器&#xff08;如阿里云、騰訊云、AWS 等&#xff09;時&#xff0c;嘗試在本地PC端使用圖形化工具如 FinalShell、XShell可能會遇到 SSH 連接失敗的問題。本文列舉 SSH 連接失敗的常見原因&#xff0c;并提供對應解決方案&#xff0c;幫助快速定位并解決問題…

性能優化:Vue 3 `v-memo` 指令詳解

v-memo 是 Vue 3 提供的一個性能優化工具&#xff0c;能幫助開發者緩存模板內容&#xff0c;減少不必要的渲染開銷。本文將介紹 v-memo 的引入版本、作用、使用方法和實現原理&#xff0c;并通過示例說明如何使用它。內容基于 Vue 3.5.18&#xff08;截至 2025 年 7 月的最新版…

標準庫開發和寄存器開發的區別

1.標準庫void GPIO_Toggle_INIT(void)//初始化GPIO {GPIO_InitTypeDef GPIO_InitStructure {0};//定義GPIO結構體RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIO時鐘GPIO_InitStructure.GPIO_Pin GPIO_Pin_2;//GPIO引腳選擇GPIO_InitStructure.GPIO_Mode …

在 WebSocket 中使用 @Autowired 時遇到空指針異常

背景&#xff1a;在websocket在有新的連接加入進來時&#xff0c;調用servier中的服務&#xff0c;使用 Autowired 注入的 Bean 竟然是 null&#xff01;這并非 Spring 的 Bug&#xff0c;而是對 WebSocket 生命周期管理理解不足導致的。了解這個問題&#xff0c;我們需要區分兩…