在build.gradle里面通過productFlavors就可以方便的實(shí)現(xiàn)不同的編譯方案。
flavorDimensions定義維度
flavorDimensions 從單詞字面理解知道是 “風(fēng)味維度”,是需要結(jié)合 “產(chǎn)品風(fēng)味(即productFlavors)” 來一起使用的。flavorDimensions 的使用會(huì)定義出維度,供接下來的 productFlavors 使用。
android {
// 省略其他參數(shù)
flavorDimensions('abi', 'version')
}
使用上面代碼,則會(huì)定義出兩個(gè)維度:version 和 abi。一個(gè)參數(shù)一個(gè)維度。
productFlavors的意義
productFlavors 從字面了解是“產(chǎn)品風(fēng)味”。他需要和一個(gè)風(fēng)味維度對接,否則會(huì)報(bào)錯(cuò)。
android{
// ...
flavorDimensions('abi', 'version')
// 創(chuàng)建產(chǎn)品風(fēng)味
productFlavors {
v1 {
// 關(guān)聯(lián)緯度
dimension 'version'
}
v2 {
dimension 'version'
}
x86 {
dimension 'abi'
}
armV7 {
dimension 'abi'
}
}
}
在 abi 維度上關(guān)聯(lián)了兩個(gè)產(chǎn)品,即 “armV7” 和 “x86”,在 version 的維度上關(guān)聯(lián)了兩個(gè)個(gè)產(chǎn)品,而這些維度的交織就會(huì)形成最終的風(fēng)味,即我們上面所標(biāo)出來的 “armV7V1”、“armV7V2”、“x86V1”、“x86V2”。
我們可以根據(jù)不同的風(fēng)味,打出不同的apk包,便可以實(shí)現(xiàn)一套核心代碼打出多個(gè)有些差異的包。
我的flavorDimensions & productFlavors
我的項(xiàng)目對abi不區(qū)分,只需要區(qū)分高通和mtk,所以維度就只定義了platform,cmake部分針對qcom和mtk分別定義了不同的宏,還可以指定其他native的參數(shù)。
flavorDimensions "platform"
productFlavors {
// Qualcomm platform
qcom {
dimension "platform"
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DCMAKE_BUILD_TYPE=Release",
"-DUSE_QCOM=TRUE"
}
}
}
// mtk platform
mtk {
dimension "platform"
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
arguments "-DCMAKE_BUILD_TYPE=Release",
"-DUSE_MTK=TRUE",
"-DCMAKE_ANDROID_NDK=\$(System.getenv('ANDROID_NDK_HOME'))"
}
}
}
}
實(shí)驗(yàn)證明上面的"-DCMAKE_ANDROID_NDK=$(System.getenv('ANDROID_NDK_HOME'))"不生效的。換成"-DANDROID_NDK=/home/tools/android-ndk/android-ndk-r19c"這樣的絕對路徑也不行。
只有通過修改local.properties才可以,可以通過編譯腳本修改ndk.dir。
#!/usr/bin/env bash
#set build ndk to android-ndk-r19c
ndkdir=${ANDROID_NDK}
echo "ndk.dir=${ndkdir}" >> local.properties
# clean
./gradlew clean
# build snpe
./gradlew assembleqcomRelease
# build mace
./gradlew assemblemtkRelease
參考:
https://blog.csdn.net/weixin_37625173/article/details/100867037