我這裡以3518的開發板為例進行講解,3516的也是通用的。
下面是之前全量編譯的指令碼
python build.py ipcamera_hi3518ev300 -b debug
HarmonyOS最初只能支援全量編譯的方式,這種方式最大的弊端就是我們在系統原始碼上開發一個使用者態程式,每次都需要全量編譯好系統之後進行映象的燒錄,每次編譯加燒錄少說需要15分鐘時間,對於我們開發測試及其消耗時間,試想下每次就是想加入一行log除錯下這麼費勁會多麼麻煩。
還好,後面隨著HarmonyOS的原始碼更新,開始支援使用者態程式的單模組編譯了,編譯的指令碼如下:
python build.py ipcamera_hi3518ev300 -T //applications/sample/camera/app:camera_app
這裡以單獨編譯HarmonyOS自帶的HelloWorld專案為例,這個-T引數非常重要,它就是代表單模組編譯的,//applications/sample/camera/app只的要編譯的模組的絕對路徑,camera_app為要編譯的模組名稱。
這裡先結合HarmonyOS原始碼講下-T引數的由來,如果各位是通過下載壓縮包的方式下載的官方的code1.0的原始碼壓縮包解壓的話,肯定是不支援該引數的,也就是說不支援單模組編譯。下面來看下該引數是在什麼時候更新到原始碼庫的吧,首先我們去gitee上找到編譯構建框架所在的程式碼倉,如下圖
然後,我們檢視該倉庫下的commit記錄,然後就可以找到下面的關鍵記錄
看commit的日誌已經很明確了這裡加入了單模組構建,下面我們開啟該commit記錄仔細看看具體修改了什麼
看到這裡,大家就知道這個-T引數怎麼來的了吧,為了讓你的程式碼支援單模組編譯,趕緊去git更新下程式碼吧,如果下載code1.0離線程式碼的也不用著急,可以直接把build倉下的最新程式碼全部下載下來替換之前的build倉即可。
下面再來講講前面單模組編譯最後面的那個模組名稱camera_app怎麼來的吧,關於使用者態程式如何編譯的,建議大家好好看看官方原始碼的“使用者程式框架”倉下的介紹,絕對會受益良多。我這裡挑重點講,首先是在//build/lite/product/ipcamera_hi3518ev300.json這個檔案中進行了使用者程式編譯的相關配置,可以理解為一個配置清單,告訴系統哪些使用者態程式需要參與編譯。我們可以在裡面找到如下配置
{
"name": "applications",
"component": [
{ "name": "camera", "dir": "//applications/sample/camera/app:camera_app", "features":[] },
{ "name": "communication", "dir": "//applications/sample/camera/communication:sample", "features":[] }
]
},
看到dir後面的配置就自然會聯想到我們之前-T後面的引數為何要使用它了吧,那麼最後的冒號後面的camera_app引數又從哪裡來呢?
那麼這裡首先要對linux下的c語言編譯有一定了解才行了,大家如果看不懂後面的可以先去補習下Makefile和gn的知識。
這裡每個使用者態程式都是通過gn檔案配置進行編譯的,我們先在原始碼目錄下找到這個模組路徑,如下圖
哈哈,大家可能會疑惑我咋是用idea在看程式碼,因為本人電腦沒安裝source insight,加上本人最精通的技術是java和Android,所以使用idea習慣了,一個快速檢索功能足夠我閱讀系統原始碼了。
這裡我們看到了BUILD.gn指令碼,開啟瞅瞅,可以看到如下關鍵程式碼,
lite_component("camera_app") {
target_type = "executable"
features = [
":hello_world",
]
}
之前呼叫的引數模組名稱camera_app就是在這裡配置的。
下面簡單列舉一個gn的一個標準的helloworld用法,如下
executable("hello_world") {
sources = [
"hello_world.c",
]
}
後面我在講如何建立一個獨立的使用者態程式會編寫這個gn檔案和json檔案。本篇已經夠長了,就放在下一篇部落格講解了。
看系統原始碼確實還是很有意思的,只奈工作太忙沒有時間看。。。
作者:軟通夏德旺
想了解更多內容,請訪問: 51CTO和華為官方戰略合作共建的鴻蒙技術社群https://harmonyos.51cto.com