這篇我們來了解一下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的生命周期,生命周期很重要,如果想合理的使用應用資源,給用戶良好的體驗,生命周期至關重要。