目錄
1 -> 定制HAR多目標構建產物
1.1 -> 定義產物的deviceType
1.2 -> 定義C++工程依賴的.so文件
1.3 -> 定義產物的資源
2 -> 配置APP多目標構建產物
2.1 -> 定義產物的APP包名和供應商名稱
2.2 -> 定義product的bundleName
2.3 -> 定義product的bundleType
2.4 -> 定義product的簽名配置信息
2.5 -> 定義product的icon和label
2.6 -> 定義product中包含的target
3 -> 多產物構建target
1 -> 定制HAR多目標構建產物
每一個HAR模塊均支持定制不同的target,通過在模塊中的build-profile.json5文件中實現差異化定制,當前支持設備類型(deviceType)、資源(resource)、buildOption配置項(如C++依賴的.so、混淆配置、abi類型、cppFlags等)、源碼集(source)的定制。
說明
當前版本,在DevEco Studio中編譯時,僅支持編譯target為default的模塊。若需指定其他target,需通過命令行來指定,并通過命令行來編譯。
例如構建指定的自定義target:free的har,可參考執行以下命令:
hvigorw --mode module -p product=default -p module=library@free -p buildMode=debug assembleHar
1.1 -> 定義產物的deviceType
每一個target均可以指定支持的設備類型deviceType,也可以不定義。如果不定義,則該target默認支持config.json或module.json5中定義的設備類型。
同時,在定義每個target的deviceType時,支持的設備類型必須在config.json或module.json5中已經定義。例如,在上述定義的2個target中,分別定義default默認支持所有設備類型,free版本只支持2in1設備。
{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default" //未定義deviceType,默認支持config.json或module.json5中定義的設備類型 }, { "name": "free","config": { "deviceType": [ //定義free支持的設備類型為2in1"2in1" ] } }]
}
1.2 -> 定義C++工程依賴的.so文件
在 C++ 工程中,可以對每個target依賴的.so文件進行定制。例如某模塊依賴了function1.so、function2.so和function3.so三個文件,其中target為default的產物依賴了function1.so和function2.so;其中target為vip的產物依賴了function1.so和 function3.so,則示例代碼如下所示:
{"apiType": 'stageMode',"buildOption": {"externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": [],"abiFilters": ["arm64-v8a","x86_64"],"cppFlags": "",}},"targets": [ //定義不同的target {"name": "default","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的優先級順序,打包最高優先級的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function3.so文件 "excludes": ["**/function3.so"],//允許當.so中資源重名沖突時,使用高優先級的.so文件覆蓋低優先級的.so文件 "enableOverride": true}}}}},{"name": "vip","config": {"buildOption": {"nativeLib": {"filter": {//按照.so文件的優先級順序,打包最高優先級的function1.so文件 "pickFirsts": ["**/function1.so"],//排除不打包的function2.so文件 "excludes": ["**/function2.so"],//允許當.so中資源重名沖突時,使用高優先級的.so文件覆蓋低優先級的.so文件 "enableOverride": true}}}}}]
}
1.3 -> 定義產物的資源
每個target使用的資源文件可能存在差異,在開發過程中,開發者可以將每個target所使用的資源存放在不同的資源目錄下。其中,ArkTS工程支持對main目錄下的資源文件目錄(resource)進行定制;JS工程支持對main目錄下的資源文件目錄(resource)及Ability下的資源文件目錄(res)進行定制。如下為ArkTS工程的資源文件目錄定制示例:
{ "apiType": 'stageMode', "buildOption": { }, "targets": [ { "name": "default","resource": { //定義默認版target使用的資源文件目錄 "directories": [ "./src/main/resources_default" ] } }, { "name": "free", "config": { "deviceType": [ "2in1" ] }, "resource": { //定義免費版target使用的資源文件目錄 "directories": [ "./src/main/resources_default", "./src/main/resources_free" ] } },]
}
2 -> 配置APP多目標構建產物
APP用于應用/元服務上架發布,針對不同的應用場景,可以定制不同的product,每個product中支持對bundleName、bundleType、簽名信息、icon和label以及包含的target進行定制。
定義目標產物product
每一個product對應一個定制的APP包,因此,在定制APP多目標構建產物前,應提前規劃好需要定制的product名稱。例如,定義productA和productB。工程級build-profile.json5文件示例如下:
在定制product時,必須存在"default"的product,否則編譯時會出現錯誤。
"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", }, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ]
}
2.1 -> 定義產物的APP包名和供應商名稱
每一個product均可以指定產物命名和供應商名稱。
{ "app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputName-1.0.0" //產物名稱為customizedProductOutputName-1.0.0}, "vendor": "customizedProductVendorName" //供應商名稱為customizedProductVendorName}, { "name": "productA", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameA-1.0.0" //產物名稱為customizedProductOutputNameA-1.0.0}, "vendor": "customizedProductVendorNameA" //供應商名稱為customizedProductVendorNameA}, { "name": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "output": { "artifactName": "customizedProductOutputNameB-1.0.0" //產物名稱為customizedProductOutputNameB-1.0.0}, "vendor": "customizedProductVendorNameB" //供應商名稱為customizedProductVendorNameB} ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ] },
}
如果已配置簽名,product產物對應的APP包名為開發者定制的名稱;如果未配置簽名,product產物對應的APP包名為定制的名稱+unsigned。
2.2 -> 定義product的bundleName
針對每個定義的product,均可以定制不同的bundleName,如果product未定義bundleName,則采用工程默認的bundleName。示例如下所示:
"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com" //定義default的bundleName信息 }, { "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com" //定義productA的bundleName信息}, { "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" //定義productB的bundleName信息 } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ]
}
2.3 -> 定義product的bundleType
針對每個定義的product,均可以定制不同的bundleType。開發者可以通過定義每個product的bundleType,分別定義產物類型:
- bundleType值為app,表示產物為應用;
- bundleType值為atomicService,表示產物為元服務。
如果product未定義bundleType,則采用工程的bundleType(即創建工程時選擇的Application/Atomic Service)。示例如下所示:
"app": { "signingConfigs": [], "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com", "bundleType": "app" //定義default的bundleType信息 },{ "name": "productA", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com", "bundleType": "atomicService" //定義productA的bundleType信息 },{ "name": "productB", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com", "bundleType": "atomicService" //定義productB的bundleType信息 } ], "buildModeSet": [ { "name": "debug", },{ "name": "release"} ]
}
2.4 -> 定義product的簽名配置信息
針對每個定義的product,均可以定制不同的signingConfig簽名文件,如果product未定義signingConfig,則構建生成未簽名的APP包。
通常情況下,您首先需要在簽名配置界面或工程的build-profile.json5文件中配置簽名信息。例如在File > Project Structure > Project > Signing Configs界面,分別配置default、productA和productB的簽名信息,如下圖所示:
簽名信息配置完成后,再添加各個product對應的簽名文件,示例如下所示:
您也可以提前在product中定義簽名文件信息,然后在簽名界面對每個product進行簽名,確保配置的product簽名文件與簽名界面配置的簽名文件保持一致即可。
"app": { "signingConfigs": [], //此處通過界面配置簽名后會自動生成相應的簽名配置,本文略 "products": [ { "name": "default", "signingConfig": "default", //定義default的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com" }, { "name": "productA", "signingConfig": "productA", //定義productA的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com" }, { "name": "productB", "signingConfig": "productB", //定義productB的簽名文件信息"compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "buildModeSet": [ { "name": "debug", }, { "name": "release" } ]
}
2.5 -> 定義product的icon和label
針對每個定義的product,均可以定制不同的icon和label,如果product未定義icon和label,則采用工程默認的icon和label。示例如下所示:
說明
products中的icon和label字段在編譯時會替換app.json5中對應的字段,app.json5和module.json5均可以配置這兩個字段。
{"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:default_icon", //定義default的icon"label":"$string:default_name", //定義default的label},{"name": "productA","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","icon":"$media:productA_icon", //定義productA的icon"label":"$string:productA_name", //定義productA的label},{"name": "productB","signingConfig": "default","compatibleSdkVersion": "5.0.2(14)","runtimeOS": "HarmonyOS","icon":"$media:productB_icon", //定義productB的icon"label":"$string:productB_name", //定義productB的label}],"buildModeSet": [{"name": "debug",},{"name": "release"}]},...
}
2.6 -> 定義product中包含的target
可以選擇需要將定義的target分別打包到哪一個product中,每個product可以指定一個或多個target。
同時每個target也可以打包到不同的product中,但是同一個module的不同target不能打包到同一個product中(除非該module的不同target配置了不同的deviceType或distributionFilter/distroFilter)。
例如,前面定義了default、free和pay三個target,現需要將default target打包到default product中;將free target打包到productA中;將pay target打包到productB中,對應的示例代碼如下所示:
{ "app": { "signingConfigs": [], //此處通過界面配置簽名后會自動生成相應的簽名配置,本文略 "products": [ { "name": "default", "signingConfig": "default","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example00.com" }, { "name": "productA", "signingConfig": "productA","compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example01.com" }, { "name": "productB", "signingConfig": "productB", "compatibleSdkVersion": "5.0.2(14)", "runtimeOS": "HarmonyOS", "bundleName": "com.example02.com" } ], "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [ { "name": "default", //將default target打包到default APP中 "applyToProducts": [ "default" ] }, { "name": "free", //將free target打包到productA APP中 "applyToProducts": [ "productA" ] }, { "name": "pay", //將pay target打包到productB APP中 "applyToProducts": [ "productB" ] } ] } ]
}
3 -> 多產物構建target
align target:編譯構建時,優先級最高的target。工程配置align target后,如果模塊中存在align target,那么將自動選擇align target進行構建。align target作用范圍是整個工程,只能配置一個,支持命令行和配置文件兩種方式。
- 命令行方式示例如下:
hvigorw -c properties.ohos.align.target=target1 assembleHap
- 在hvigor-config.json5配置文件中添加ohos.align.target,示例如下:
"properties": {'ohos.align.target': 'target1'
},
fallback target:當模塊不存在指定的target時會選用default進行構建,但如果不想用default進行構建,那么可以配置fallback target,當找不到指定target時,如果模塊中存在fallback target,則使用fallback target進行構建。fallback target作用范圍是整個工程,可配置多個,配置多個時按數組順序先命中的生效。
- 命令行方式示例如下:
hvigorw -c properties.ohos.fallback.target=target1,target2 assembleHap
- 在hvigor-config.json5配置文件中添加ohos.fallback.target,示例如下:
"properties": {'ohos.fallback.target': ['target1', 'target2']
}
說明
- align target和fallback target配置方式命令行優先級高于配置文件。
- 使用配置文件配置align target和fallback target,僅支持DevEco Studio界面Build菜單欄功能,不支持Run菜單欄功能,可通過hdc命令行工具進行推包運行、調試。
多個target的優先級順序為:align target > 命令行指定模塊target > 父級模塊target > fallback target > default。
舉例說明:
工程依賴entry->lib1->lib2,需要構建多個產品A、B、C,工程中target配置如下:
entry: A、B、default
lib1: B、C、default
lib2: A、C、default
指定align target為A,fallback target為C。那么構建hap時的編譯命令為:
hvigorw --mode module -p module=entry -c properties.ohos.align.target=A -c properties.ohos.fallback.target=C assembleHap
編譯的target選擇就是:entry@A, lib1@C, lib2@A。
說明
以上所有說明僅針對非ohosTest模式。在ohosTest模式下,依賴的target固定為default,其他target均不生效。
感謝各位大佬支持!!!
互三啦!!!