鴻蒙(HarmonyOS)開發筆記四:專案結構
這篇我們來了解一下harmonyOS的專案結構,包括目錄結構及其作用,配置檔案的基礎配置資訊
1.專案整體結構
之前我們建立過一個專案,有一個文字展示和一個按鈕,每點選一次數字加1並顯示在文字框中。本篇我們基於這個基礎專案瞭解一下專案的整體結構和其中的配置,專案的整體結構如圖:
首先有一個entry目錄,結合上篇的內容,我們知道一個應用是由一個或多個Hap包所組成的,Hap包又可以分為entry型別和feature型別,每個Hap包由:程式碼、資源、第三方庫及應用配置檔案組成。所以我們程式碼中的entry目錄其實就一個應用的Hap包,它的型別的entry型別的Hap包。一個Hap包由程式碼、資源、第三方庫及應用配置檔案組成,接著我們來看這些資源,程式碼等都分佈在entry包的哪裡
在src/main/java下以包名命名的資料夾內分佈著Java程式碼。這裡的程式碼可以用來建立佈局,動態調整佈局以及為互動提供支撐服務。
和java資料夾同級的resources目錄下分佈應用資源,該目錄的base目錄下,按資源用途又分為多個資料夾資源:
- element:表示元素資源,該資料夾下主要存放json格式的檔案,主要用來表示字串、顏色值、布林值等,可以在其他地方被引用
- graphic:表示可繪製資源。用xml檔案來表示,比如我們專案中設定的 圓角按鈕、按鈕顏色等都是通過引用這裡的資源來統一管理的
- layout:表示佈局資源,用xml檔案來表示,比如頁面的佈局資源,都放在這裡
- media:表示媒體資源,包括圖片、音訊、視訊等非文字格式的檔案。
除了上述的這四類,還有其他型別的資源,因為我們專案暫時用不到,先不做考慮。resources目錄儲存的內容截圖如下:
和main目錄平級的test目錄是測試目錄,可以用於對自己寫的功能新增單元測試,確保程式碼的正確性
和src平級的libs目錄用來儲存引用三方一些包,例如jar包,so包等。
而和entry目錄平級的build目錄,則用來存放最終編譯完成後的包,也就是hap包。編譯後該包的內容如下:
最終在該目錄下會生成一個hap包。這個hap包中包含了我們專案中用到的圖片,佈局,程式碼和各種資源。
2.專案的配置檔案:
每一個hap包下都包含了該hap包的配置資訊,這個配置檔案位於:entry/src/main/目錄下,由工具幫我們生成,命名為config.json,harmonyOS應用配置採用json格式的形式。下面我們來看一下這個配置檔案中的內容,並簡要介紹一下配置的作用。該配置檔案中,主要有三個模組,如下圖:
- app:表示應用的全域性配置資訊。同一個應用的不同HAP包的“app”配置必須保持一致。
- deviceConfig:表示應用在具體裝置上的配置資訊。
- module:表示HAP包的配置資訊。該標籤下的配置只對當前HAP包生效。
配置檔案採用json格式,其中的屬性不分先後順序,每個屬性只允許出現一次。
下面具體看一下我們專案中出現的配置項都有哪些,以及它的作用:
2.1 app下的屬性
bundleName:表示應用的包名,用於標識應用的唯一性。通常採用反轉的域名
vendor:表示開發應用的廠商
version:code表示內部版本號,用於系統管理版本使用,對使用者不可見,name表示應用的版本號,用於向用戶呈現
apiVersion:包含三個選項。
compatible:表示應用執行需要的API最小版本。
target:表示應用執行需要的API目標版本。
releaseType:表示應用執行需要的API目標版本的型別,取值為“CanaryN”、“BetaN”或者“Release”,其中,N代表大於零的整數。
- Canary:受限釋出的版本。
- Beta:公開發布的Beta版本。
- Release:公開發布的正式版本。
deviceConfig:表示應用在具體裝置上的配置資訊。我們這裡暫時沒用到
2.2 module下的配置:
"module": { "package": "com.example.demo", //表示HAP的包結構名稱,在應用內應保證唯一性。採用反向域名格式 "name": ".MyApplication", //表示HAP的類名。採用反向域名方式表示,因為我們指定了package,所以可以直接以.加類名的形式指定 "deviceType": [ //表示允許Ability執行的裝置型別。phone表示手機 "phone" ], "distro": { //表示HAP釋出的具體描述 "deliveryWithInstall": true, //表示當前HAP是否支援隨應用安裝。true為支援隨應用安裝 "moduleName": "entry", //表示當前HAP的名稱。 "moduleType": "entry" //表示當前HAP的型別,包括兩種型別entry和feature }, "abilities": [ //表示當前模組內的所有Ability { "skills": [ //表示Ability能夠接收的Intent的特徵 { "entities": [ "entity.system.home" //表示能夠接收的Intent的Ability的類別(如視訊、桌面應用等),可以包含一個或多個entity。 ], "actions": [ "action.system.home" //表示能夠接收的Intent的action值,可以包含一個或多個action ] } ], "orientation": "unspecified", //表示該Ability的顯示模式,這裡表示由系統自動判斷方向 "name": "com.example.demo.MainAbility", //表示Ability名稱。取值可採用反向域名方式表示,由包名和類名組成,也可以才用.開頭的形式表示 "icon": "$media:icon", //表示Ability圖示資原始檔的索引,$media表示引用media目錄下的icon資源 "description": "$string:mainability_description", //表示對Ability的描述 "label": "first_demo", //表示Ability對使用者顯示的名稱,也就是你的應用安裝使用者裝置後顯示的名稱 "type": "page", //表示Ability的Type型別,可以為page,service或data "launchType": "standard" //表示Ability的啟動模式,支援“standard”和“singleton”兩種模式, standard表示可以有多個例項,single則是一個例項。 } ] }
由於module下的配置較多,截圖無法截全,把配置貼出來,同時採用註釋的形式對每個配置進行說明
本篇瞭解了基本的專案結構,以及各個資源目錄的情況,還有config配置檔案中的基本配置項。
下一篇會介紹Ability的生命週期,生命週期很重要,如果想合理的使用應用資源,給使用者良好的體驗,生命週期至關重要。