這篇文章主要講鴻蒙應用的工程結構及應用配置,講述期間穿插 Android 工程做爲對比及遷移理解。java
直入主題,先看下圖(左鴻蒙右安卓)android
不管是鴻蒙工程仍是安卓工程,其結構類似,按內容可劃分爲:項目構建 及 模塊內容json
這部份內容對於安卓開發者來講,Gradle 構建系統非常熟悉。api
項目構建的內容包含依賴文件(位於 gradle/Wrapper 文件夾),以 .gradle 結尾的腳本文件,.properties 結尾的配置文件,可執行文件及 settings.gradle。安全
settings.gradle 定義項目模塊包含信息等元數據信息,且每一個模塊內部也定義了 .gradle 腳本文件用於描述模塊編譯信息。微信
以下圖編譯信息概要(左鴻蒙右安卓)markdown
編譯信息大體包含插件聲明,模塊信息聲明及依賴聲明。網絡
在安卓側構建模塊,分別使用如下插件:app
而鴻蒙側也有類 Application 的概念,鴻蒙應用以 APP Pack(Application Package)形式發佈,它是由一個或多個 HAP(HarmonyOS Ability Package)以及描述每一個 HAP 屬性的 pack.info 組成。組件化
簡單理解就是鴻蒙應用由一個或多個 HAP 構建,每個 HAP 可對應一個工程模塊
在鴻蒙側,HAP 是支持獨立運行的,劃分兩種類型模塊。
而上述兩種模塊使用的是 com.huawei.ohos.hap 插件構建,最終產物爲 .hap 文件。
而針對 Library 庫的構建,使用的是 com.huawei.ohos.library 插件,最終產物爲 .har 文件,對應安卓側的 .aar 文件。
鴻蒙側應用支持 feature 模塊獨立運行,在組件化工程上協做開發調試變得更爲簡便,再也不須要動態更改模塊 Gradle 腳本切換插件。
從上文可知,每個模塊會有對應的 Gradle 腳本定義編譯信息。
模塊內對應的業務文件都存放在 src 目錄中,以下圖展現 src 目錄結構(左鴻蒙右安卓)
src 目錄下資源可分爲三部分
代碼文件同安卓側一致,同時 src 同目錄的 libs 目錄也一樣用於存放外部依賴,不作多餘描述。
重點放在資源文件 和配置文件的理解上。
應用的資源文件(字符串、圖片、音頻等)統一存放於 resources 目錄下,包括兩大類目錄
以下演示一個簡單的目錄結構。
resources
|---base // 默認存在的目錄
| |---element
| | |---string.json
| |---media
| | |---icon.png
|---en_GB-vertical-car-mdpi // 限定詞目錄示例,須要開發者自行建立
| |---element
| | |---string.json
| |---media
| | |---icon.png
|---rawfile // 默認存在的目錄
複製代碼
其中,base目錄與限定詞目錄按照兩級目錄形式來組織,目錄命名必須符合官方規範,以便根據設備狀態去匹配相應目錄下的資源文件。
一級子目錄爲base目錄和限定詞目錄。
base目錄 是默認存在的目錄,當應用的 resources 資源目錄中沒有與設備狀態匹配的限定詞目錄時,會自動引用該目錄中的資源文件。
限定詞目錄 須要開發者自行建立,如例子中的 en_GB-vertical-car-mdpi,目錄名稱由一個或多個表徵應用場景或設備特徵的限定詞組合而成。
類似於安卓側 res 目錄及資源限定符的理解,但鴻蒙側提供的限定詞更爲豐富,也意味場景更廣,使用更靈活。支持從語言,文字,國家、地區,橫豎屏,設備類型以及屏幕密度多維度自由組合。
二級子目錄爲資源目錄,用於存放 字符串、顏色、布爾值 等基礎元素,以及媒體、動畫、佈局等資源文件。
支持如下多種資源
|---base
| |---element //元素資源
| | |---boolean.json
| | |---string.json
| |---media //媒體資源
| | |---icon.png
| |---animation //動畫資源
| | |---zoom_in.xml
| |---layout //佈局資源
| | |---main_layout.xml
| |---graphic //可繪製資源
| | |---dark.xml
| |---profile //以原始文件形式存放,不限制文件名
| | |---yummylau.txt
複製代碼
好比定義一個 boolean.json
{
"boolean":[
{
"name":"follow_me",
"value":true
},
{
"name":"you_are_happy",
"value":"$boolean:follow_me"
}
]
}
複製代碼
這些資源文件最終會被編譯成二進制文件,並賦予資源文件ID。
rawfile 目錄,支持建立多層子目錄,目錄名稱能夠自定義,文件夾內能夠自由放置各種資源文件。
該目錄的文件不會根據設備狀態去匹配不一樣的資源,資源文件會被直接打包進應用,不通過編譯,也不會被賦予資源文件 ID。
每一個模塊都會有一個 config.json 配置文件,以 JSON 格式形式定義了三部分信息,缺一不可。
{
//應用的全局配置信息
"app":{}
//應用在具體設備上的配置信息
"deviceConfig":{}
//模塊配置信息
"module":{}
}
複製代碼
app,包含應用的包名、生產廠商、版本號等基本信息,以下。
{
//應用包名,用於標識應用的惟一性,類安卓側 applicationId
"bundleName": "com.effective.harmony.study",
//應用開發廠商的描述
"vendor": "effective",
//應用版本信息
"version": {
"code": 1,
"name": "1.0"
},
//依賴的鴻蒙 API 版本
"apiVersion": {
"compatible": 4,
//應用運行須要的 API 目標版本
"target": 4,
"releaseType": "Beta1"
}
}
複製代碼
這部分信息對應安卓側 build.gradle 腳本內 android 節點的聲明信息、
deviceConfig,包含 default、car、tv、wearable、liteWearable、smartVision,phone,tablet等屬性,其用於描述某個設備場景的配置。
default 標籤內的配置是適用於全部設備通用,爲必須設置項。其餘設備類型若是有特殊的需求,則須要在該設備類型的標籤下進行配置。
{
"default": {
//應用進程名
"process": "com.huawei.harmony.study",
//是否支持在設備未解鎖狀態直接啓動
"directLaunch": false,
//是否支持備份和恢復
"supportBackup": false,
//網絡安全性配置
"network": {}
}
}
複製代碼
這部分是安卓側所沒有的。因爲鴻蒙應用可適配多終端,deviceConfig 提供了多終端定製化的能力。好比你但願手錶或車機設備在沒有解鎖場景下接聽來電,則可配置 directLaunch 值爲 true 等。
module,包含每一個 Ability 必須定義的基本屬性(如包名、類名、類型以及 Ability 提供的能力),以及應用訪問系統或其餘應用受保護部分所需的權限等。
這裏咱們簡單理解鴻蒙的Ability等同於安卓的四大組件,它可支撐前臺交互,也可後臺運行。針對 Ability 後續會有專門一篇文章細講。
以核心屬性爲例子。
{
//HAP 的包結構名稱,在應用內應保證惟一性
"package": "com.effective.hramony.study",
//HAP 的入口類名,類 application
"name": ".MyApplication",
//可選,HAP 描述信息
"description":"",
//容許 Ability 運行的設備類型,好比 tv,car,phone等
"deviceType": [],
//HAP 發佈信息
"distro": {},
//可選,申明當前模塊內全部 ability
"abilities": [],
//可選,申明運行時所須要申請的權限
"reqPermissions": []
...
}
}
複製代碼
這部份內容包含了安卓側 AndroidManifest.xml 絕大部分核心功能,包括包名信息,應用入口四大組件申明及權限申明。
到這裏,內容就沒了,真沒了!難道你不以爲挺簡單的麼。
建一個新工程看看唄。
從下一期起,開始講講開發相關內容了,歡迎關注追更。
歡迎關注 「Android之禪」公衆號,和你分享有價值有思考的技術文章。 可添加微信 「Ming_Lyan」備註 「進羣」 加入技術交流羣,討論技術問題嚴禁一切廣告灌水。 若有 Android 領域有遇到技術難題亦或對將來職業規劃有疑惑,一塊兒討論交流。 歡迎來擾。