鴻蒙項目構建配置

鴻蒙項目構建配置

參考文檔

深入鴻蒙開發之后,一般會遇到以下幾個問題。

  1. 每次編譯的時候需要手動配置不同的 versionCode 和 versionName;
  2. 在使用 git 管理代碼的時候,不同的人或者不在同一臺電腦上,dev eco 這個編譯器需要經常的給開發版本簽名,在發布版本的時候還需要手動配置相應的簽名;
  3. 每次編譯的產物都叫做 default.app,只能通過文件更新時間來判斷是否編譯完成了;
  4. 華為后臺推出了崩潰分析之后,sourceMap 變的十分重要了,重新編譯會導致老的 sourceMap 被刪除掉;

為了解決上述問題,研究了一下 hvigor 編譯環境,然后就有了這篇的解決方案。基本上能解決以上遇到的問題。

如何做

為了避免看的比較凌亂,遺漏掉某一個步驟,就直接寫怎么做了。看到有用的就參考一下吧。
以下文件都是在根目錄中創建。

  1. 創建 debug-signing-config.json 文件,目的是開發時候使用到的自動簽名;
  2. 創建 release-signing-config.json 文件,目的是發布時候使用到的自動簽名;
  3. 創建 versionName.json,目的是寫一個 versionName,單獨存放存儲,方便修改;
  4. 創建 sourceMaps 文件夾,存放 sourceMaps 文件,方便后續管理編譯的 sourceMap;

一定要把 debug-signing-config.json 跟 release-signing-config.json 配置好,要不然跑不起來,ide 會檢測配置的文件是否存在。可以先都用 debug-signing-config.json 的配置,等弄好了再切換成 release 版本。

debug-signing-config.json

這個是首先先自動簽名一次開發版本的簽名文件,然后把 build-profile.json5 中的內容拷貝到這個里邊。然后在 .gitignore 中忽略掉這個文件,這樣每臺電腦上的這個文件都不需要提交了,也就不會頻繁的簽名了。

{"material": {"certpath": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyeb8iqKwiRH18uy4B2GvE2Yc=.cer","keyAlias": "debugKey","keyPassword": "0000001B01A5432AA50AB7DAD5B8027838C12E3783A6D359BE407801ds714C1E5055FF424DF8A63A4B0FE4D4","profile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHsAyb8iqKwiRH18uy4B2GvE2Yc=.p7b","signAlg": "SHA256withECDSA","storeFile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyfb8iqKwiRH18uy4B2GvE2Yc=.p12","storePassword": "0000001B63267DFD40B6449627CE6220F414AB3A3647558ef3D3A9E5766490A610B7ADFD0875AA1540E4B0C5"}
}

release-signing-config.json

發布版本的簽名配置文件。

{"material": {"certpath": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyeb8iqKwiRH18uy4B2GvE2Yc=.cer","keyAlias": "debugKey","keyPassword": "0000001B01A5432AA50AB7DAD5B8027838C12E3783A6D359BE407801ds714C1E5055FF424DF8A63A4B0FE4D4","profile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHsAyb8iqKwiRH18uy4B2GvE2Yc=.p7b","signAlg": "SHA256withECDSA","storeFile": "xxx/.ohos/config/default_hmplayer_bEe7B3h4YHxQuFjHuAHAyfb8iqKwiRH18uy4B2GvE2Yc=.p12","storePassword": "0000001B63267DFD40B6449627CE6220F414AB3A3647558ef3D3A9E5766490A610B7ADFD0875AA1540E4B0C5"}
}

versionName.json

版本號配置文件;

{"versionName": "1.0.1"
}

最重要的修改 hvigorfile.ts

整體修改代碼如下:

genVersionCode 自動生成 versionCode,格式為:yyMM+(ddhhmm),因為 versionCode 的數字不能太大。

output.artifactName 為 ${versionName}.${versionCode} 能夠看到每次編譯的版本號。

最后把當次編譯的結果都放到了 sourceMaps 的文件夾中,有需要可以直接上傳了。

官方文檔 API 介紹

示例工程

import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import * as debugMaterial from './debug-signing-config.json'; // 引入外部配置
import * as releaseMaterial from './release-signing-config.json'; // release配置
import * as versionData from './versionName.json'; // 引入外部配置
import { hvigor, FileUtil, getNode } from '@ohos/hvigor'
import { rename, rm } from 'fs/promises';function genVersionCode() {const d = new Date();const year = d.getFullYear().toString().slice(-2);const month = (d.getMonth() + 1).toString().padStart(2, '0');const day = d.getDate();const hour = d.getHours();const minute = d.getMinutes();const end = (day * hour * minute).toString().padStart(5, '0');return parseInt(year + month + end);
}const versionName = versionData.versionName
const versionCode = genVersionCode()const properties = hvigor.getParameter().getProperties();
console.log(`properties is ${JSON.stringify(properties)}`)
const startParams = hvigor.getParameter().getStartParams();
console.log(`startParams is ${JSON.stringify(startParams)}`)
const extParams = hvigor.getParameter().getExtParams();
console.log(`extParams is ${JSON.stringify(extParams)}`)
const buildMode = extParams['buildMode']     // 獲取編譯mode,不同的mode使用不同的配置const needCopySourceMap = !!!extParams['module'] ? true : false
console.log(`needCopySourceMap ${needCopySourceMap} ${!!!extParams['module']}`)hvigor.getRootNode().afterNodeEvaluate(rootNode => {const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;const appJsonOpt = appContext.getAppJsonOpt();appJsonOpt['app']['versionCode'] = versionCode;appJsonOpt['app']['versionName'] = versionName;appContext.setAppJsonOpt(appJsonOpt);const buildProfileOpt = appContext.getBuildProfileOpt();buildProfileOpt['app']['signingConfigs'] = [{"name": "default","type": "HarmonyOS","material": buildMode == 'debug' ? debugMaterial.material : releaseMaterial.material}];buildProfileOpt['app']['products'] = [{"name": "default","signingConfig": "default","targetSdkVersion": "5.1.0(18)","compatibleSdkVersion": "5.0.1(13)","runtimeOS": "HarmonyOS","output": {"artifactName": `${versionName}.${versionCode}`},"buildOption": {"strictMode": {"caseSensitiveCheck": true,"useNormalizedOHMUrl": true}}}];appContext.setBuildProfileOpt(buildProfileOpt);
})const currentNode = getNode(__filename);
hvigor.buildFinished(async buildResult => {if (buildResult.getError()) {console.log(buildResult.getError().stack);} else {if (needCopySourceMap) {const context = currentNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;const base = context.getProjectPath()const sourceMaps = FileUtil.pathResolve(base, 'entry/build/default/outputs/default/symbol/release/entry-sourceMaps.map');if (FileUtil.exist(sourceMaps)) {const renameSourceMaps = FileUtil.pathResolve(base, `entry/build/default/outputs/default/symbol/release/${versionCode}.map`);await rename(sourceMaps, renameSourceMaps)const targetSourceMaps = FileUtil.pathResolve(base, `sourceMaps/${versionCode}.map`);FileUtil.copyFileSync(renameSourceMaps, targetSourceMaps);}}}
})export default {system: appTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */plugins:[],         /* Custom plugin to extend the functionality of Hvigor. */
}

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

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

相關文章

os.machine()詳解

核心功能返回硬件架構 返回字符串表示系統的硬件架構,常見值包括: x86_64:64 位 x86 架構(Intel/AMD)armv7l:32 位 ARM 架構(如樹莓派 3B)aarch64:64 位 ARM 架構&#x…

linux-shell腳本

linux-shell腳本一、什么是shell腳本?二、為什么要學習shell腳本?三、腳本執行的方式3.1 bash test.sh3.2 ./test.sh3.3 source test.sh3.4 . test.sh四、變量的使用4.1 變量定義與使用4.2 避免變量混淆4.3 位置變量for循環和位置變量的結合案例4.4 read…

【嵌入式】51單片機學習筆記-Keil5軟件安裝教程

00. 目錄 文章目錄00. 目錄01. Keil C51概述02. Keil C51下載03. Keil C51安裝04. Keil C51注冊05. 附錄01. Keil C51概述 Keil C51 是德國Keil公司(現被ARM收購)開發的嵌入式開發工具,專注于8051單片機的C語言和匯編開發。它是μVision IDE…

ai之 ubuntu本地安裝mineru2.1.0

MinerU 目錄 一、更新內容概述寫在前面的話:總體來看,2.0版本升級為全新的 VLM 解析模式,更優于以前的基礎解析方式。二、MinerU 安裝部署下面使用源碼來進行環境安裝。注意:當前狀態說明推薦解決方案如果是下載插件慢可以 指定阿里源三、MinerU 使用1. 在線體驗2. 命令行使…

華為昇騰NPU與NVIDIA CUDA生態兼容層開發實錄:手寫算子自動轉換工具鏈(AST級代碼遷移方案)

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,按量計費,靈活彈性,頂級配置,學生專屬優惠。 當國產AI芯片崛起遭遇生態壁壘,如何實現CUDA算子到昇騰平臺的無損遷移成為關鍵挑…

GraphRAG Docker化部署,接入本地Ollama完整技術指南:從零基礎到生產部署的系統性知識體系

相關推薦:Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署) 一、技術背景與發展脈絡 1.1 RAG技術演進歷程分析 檢索增強生成(RAG)技術的發展經歷了三個重要…

Android 系統默認Launcher3 菜單模式雙層改成單層-3

Android 系統默認自帶Launcher3 菜單都為雙層模式 各手機大廠的Launcher的菜單模式都為單層 如何將launcher3的菜單模式改為單層模式 mOverviewPanel = (ViewGroup) findViewById(R.id.overview_panel); mWidgetsButton = findViewById(R.id.widget_butto…

基于k8s環境下pulsar高可用測試和擴縮容(上)

#作者:任少近 文章目錄Pulsar高可用測試1. 測試目的2.當前集群環境說明3. 模擬故障場景4.功能驗證5.結論Pulsar高可用測試 1. 測試目的 本次測試旨在驗證 Apache Pulsar 在某個 Broker 節點宕機(down)的情況下,是否仍能正常提供…

JAVA JVM垃圾收集

JVM 垃圾收集是 Java 自動內存管理的核心,本文通過圍繞 “哪些是垃圾、何時回收、怎么回收、用啥回收器、內存咋分配” 等展開一、判斷哪些是垃圾引用計數法:給對象分配引用計數器,有引用時計數加 1,引用失效減 1 ,計數…

UniHttp生命周期鉤子與公共參數實戰:打造智能天氣接口客戶端

> 通過靈活的生命周期鉤子,我們讓HTTP請求從機械操作進化為智能對話 在現代應用開發中,高效處理HTTP請求是核心能力。本文將深入探索UniHttp框架中強大的**HttpApiProcessor生命周期鉤子**,并演示如何利用其**公共參數填充機制**優雅地處理第三方接口。我們將以百度天…

C++高級編程,類模版成員函數類外實現

#include <iostream> #include <string>//類模版成員函數類外實現 template<class T1,class T2> class Person {//Person構造函數 public:Person(T1 name,T2 age);// {// this->m_Namename;// this->m_Ageage;// }//Person的成員函數void show…

[Linux入門 ] RAID存儲技術概述

一.數據存儲架構 1??存儲系統 2??主機系統 3??互連部件 4??存儲設備與磁盤陣列 二.數據存儲技術 1??數據冗余技術 2??RAID 0 3??RAID 1 4??RAID 2 5??RAID 3 6??RAID 4 三.基于硬件的RAID磁盤陣列 1??陣列卡(RAID控制器) 2??陣列卡種類 …

AI繪畫生成章邯全身像提示詞

融合了歷史元素和視覺表現力&#xff0c;力求生成符合秦末名將章邯身份的全身像。 核心提示詞結構&#xff1a; [主體描述]&#xff0c;[服裝/盔甲細節]&#xff0c;[姿態/神情]&#xff0c;[武器]&#xff0c;[背景/氛圍]&#xff0c;[風格/質量]&#xff0c;[參數] 選項一&…

iOS高級開發工程師面試——關于優化

iOS高級開發工程師面試——關于優化 一、TableView 有什么好的性能優化方案?二、界面卡頓和檢測你都是怎么處理?三、談談你對離屏渲染的理解?四、如何降低APP包的大小?五、日常如何檢查內存泄露?六、APP啟動時間應從哪些方面優化?一、TableView 有什么好的性能優化方案?…

線性基學習筆記

我們稱一個線性空間 V V V 的一個極大線性無關集為這個線性空間的線性基,簡稱基。 異或線性基 在異或空間下,我們定義如下內容。 異或和 設 S S

ESP-Timer入門(基于ESP-IDF-5.4)

主要參考資料&#xff1a; ESP 定時器&#xff08;高分辨率定時器&#xff09;: https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32s3/api-reference/system/esp_timer.html 目錄ESP-Timer與FreeRTOS TimerAPI 使用1.創建定時器2.啟動定時器3.管理定時器4.時間管…

014_批處理與大規模任務

批處理與大規模任務 目錄 批處理概述核心優勢技術規格API使用管理和監控應用場景最佳實踐 批處理概述 什么是批處理 批處理&#xff08;Batch Processing&#xff09;是一種異步處理大量Claude API請求的方法&#xff0c;允許您一次性提交多個消息請求&#xff0c;系統將在…

Python淘寶拍立淘按圖搜索API接口,json數據示例參考

淘寶拍立淘按圖搜索API接口示例淘寶的拍立淘(圖片搜索)功能通常是通過淘寶開放平臺提供的API實現的。以下是一個模擬的JSON數據示例和接口調用參考&#xff1a;模擬API請求示例import requestsimport base64# 示例圖片路徑image_path "example.jpg"# 讀取圖片并編碼…

靜默的田野革命—人工智能重構農業生態的技術風暴與文明悖論

一、饑餓困局的數字突圍當全球糧食損失率高達30%&#xff08;約13億噸&#xff09;與8億人營養不良并存&#xff0c;當農藥濫用導致傳粉昆蟲種群崩潰與地下水資源枯竭&#xff0c;傳統農業的生態死結日益收緊。這場危機的核心是生物復雜性對工業化農業的報復&#xff1a;小麥基…

【大模型推理論文閱讀】 Thinking Tokens are Information Peaks in LLM Reasoning

Demystifying Reasoning Dynamics with Mutual Information&#xff1a;Thinking Tokens are Information Peaks in LLM Reasoning 摘要 大語言推理模型&#xff08;LRM&#xff09;在復雜問題解決方面展現出了令人矚目的能力&#xff0c;但其內部推理機制仍未得到充分理解。…