OpenHarmony SA 動態(tài)庫服務拉起的main入口
簡介
OpenHarmony 很多服務都是編譯成動態(tài)庫, 動態(tài)庫服務,沒有main函數(shù)入口。服務的拉起的入口在哪?
以在線升級服務為例說明服務入口,說明如下:
一. 服務的動態(tài)庫:libupdateservice.z.so
這個編譯代碼里面有,學習者可以在源代碼中去看:
配置路徑:base\update\updateservice\engine\BUILD.gn
二. main入口:sa_main
sa_main是含有main入口的獨立可執(zhí)行文件。學習者可以自己在代碼中去看:
配置路徑:foundation\distributedschedule\safwk\services\safwk\BUILD.gn
三. sa_main如何加載 libupdateservice.z.so
updater_sa.xml配置了動態(tài)庫libupdateservice.z.so的各項信息。
sa_main通過讀取解析updater_sa.xml, 把動態(tài)庫libupdateservice.z.so加載到自身進程中來。
即運行命令:/system/bin/sa_main /system/profile/updater_sa.xml
1. 動態(tài)庫服務的編譯配置
1.1 動態(tài)庫的編譯配置
動態(tài)庫編譯配置:
- base\update\updateservice\engine\BUILD.gn
動態(tài)庫編譯后的名稱:
- libupdateservice.z.so
1.2 xml的編譯配置
1.2.1 xml的原始文件
原始xml的文件路徑:base\update\updateservice\engine\sa_profile\3006.xml
內(nèi)容:
- <info>
- <process>updater_sa</process>
- <systemability>
- <name>3006</name>
- <libpath>libupdateservice.z.so</libpath>
- <run-on-create>true</run-on-create>
- <distributed>false</distributed>
- <dump-level>1</dump-level>
- </systemability>
- </info>
1.2.1.1 3006:
是UPDATE_DISTRIBUTED_SERVICE_ID的值,該值定義在
utils\system\safwk\native\include\system_ability_definition.h中。
1.2.1.2 libupdateservice.z.so:
是服務對應的動態(tài)庫
1.2.2 xml的編譯配置BUILD.gn
編譯文件配置路徑:base\update\updateservice\engine\sa_profile\BUILD.gn
內(nèi)容:
- import("//build/ohos/sa_profile/sa_profile.gni")
- ohos_sa_profile("updater_sa_profile") {
- sources = [ "3006.xml" ]
- part_name = "updater"
- }
1.2.3 編譯配置ohos.build
文件路徑:base\update\updater\ohos.build
內(nèi)容如下:

1.2.4 編譯成功生產(chǎn)的文件
1.2.4.1 編譯后Ubuntu路徑:
out/ohos-arm-release/packages/phone/system/profile/updater_sa.xml
1.2.4.2 內(nèi)容:
- <?xml version="1.0" encoding="utf-8"?>
- <info>
- <process>updater_sa</process>
- <loadlibs>
- <libpath>libupdateservice.z.so</libpath>
- </loadlibs>
- <systemability>
- <name>3006</name>
- <libpath>libupdateservice.z.so</libpath>
- <run-on-create>true</run-on-create>
- <distributed>false</distributed>
- <dump-level>1</dump-level>
- </systemability>
- </info>
1.2.4.3 燒入開發(fā)板后的路徑:
system/profile/updater_sa.xml

2. 服務的啟動配置
2.1 服務啟動配置
配置文件路徑:base\update\updateservice\engine\etc\updater_sa.cfg
文件內(nèi)容如下:
- {
- "jobs" : [{
- "name" : "boot",
- "cmds" : [
- "start updater_sa"
- ]
- }
- ],
- "services" : [{
- "name" : "updater_sa",
- "path" : ["/system/bin/sa_main", "/system/profile/updater_sa.xml"],
- "uid" : "system",
- "gid" : ["system", "shell"]
- }
- ]
- }
2.2 啟動編譯配置
配置文件路徑:base\update\updateservice\engine\BUILD.gn
內(nèi)容如下:

2.3 編譯成功生成的文件
編譯后Ubuntu路徑:out\ohos-arm-release\packages\phone\system\etc\init\updater_sa.cfg
燒入開發(fā)板后的路徑:system\etc\init\updater_sa.cfg
3 運行過程
每次開機,init階段會讀取配置updater_sa.cfg,啟動updater_sa。即拉起服務動態(tài)庫libupdateservice.z.so
進程啟動查詢:ps -A | grep updater
串口終端顯示:

重新拉取服務
運行hdc_std.exe shell 終端運行 sa_main /system/profile/updater_sa.xml:

串口終端查詢,多運行了一個update_sa進程:

服務拉起注冊到SAMGR進程的日志:

服務拉起之后:
客戶端就可以與服務端通信了,客戶端獲取與服務端通信的對象 代碼塊如下所示: