Android多渠道打包配置方案
背景
多渠道打包,顧名思義就是用來(lái)區(qū)分同一個(gè)軟件,在不同渠道上的釋放版本。
這個(gè)手機(jī)上大型app幾乎是必配置的一個(gè)項(xiàng),給不同型號(hào)的手機(jī)所用的apk會(huì)做一些細(xì)微的區(qū)別。像筆者使用酷安社區(qū)比較多,在官網(wǎng)下載的酷安apk界面頂部有軟件管理功能,在其他手機(jī)廠的應(yīng)用商店里下載的酷安就沒(méi)有這個(gè)功能。
目前我們有需求是要一套軟件代碼庫(kù)多個(gè)項(xiàng)目共同使用,針對(duì)不同的項(xiàng)目打包不同的渠道apk,現(xiàn)學(xué)記錄一下。
Gradle腳本和Manifest文件配置
不同渠道的apk既然要做細(xì)微的功能上的區(qū)分,就需要在代碼里能拿到一個(gè)類(lèi)似鍵值對(duì)的標(biāo)志位。并且能夠全局調(diào)用。首先我們需要在app級(jí)的gradle文件里配置不同的channel名稱(chēng)。
其中flavorDimensions和productFlavors中的維度名稱(chēng)需要一一對(duì)應(yīng)。隨便寫(xiě)一個(gè)"default"即可。
defaultConfig {
xxxx = xxxx
flavorDimensions.add("default")
}
gradle.kts語(yǔ)法與Groovy略有不同,要添加自己配置的東西一般是使用create,register之類(lèi)的關(guān)鍵字,不熟悉配置的可以先試試。
不同渠道包的域里,我們可以區(qū)分很多參數(shù)值,像這里我是配置了不同渠道使用不同平臺(tái)的簽名。
productFlavors {
create("cheetah") {
dimension = "default"
signingConfig = signingConfigs.getByName("cheetah")
manifestPlaceholders["CHANNEL_VALUE"] = "cheetah_channel"
}
create("redfin") {
dimension = "default"
signingConfig = signingConfigs.getByName("aaos")
manifestPlaceholders["CHANNEL_VALUE"] = "redfin_channel"
}
}
為了可以設(shè)置成自己想要的鍵值對(duì),建議在Manifest清單文件里設(shè)置一組元數(shù)據(jù),在打包時(shí)讓Gradle去賦值它。結(jié)合上下兩段代碼,我們?cè)贛anifest里的一組元數(shù)據(jù),key設(shè)為CHANNEL,value為引用型的變量CHANNEL_VALUE,在Gradle渠道配置里,我們使用:
manifestPlaceholders["CHANNEL_VALUE"] = "cheetah_channel"
來(lái)為其賦值。
<meta-data
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" />
打包時(shí),可以通過(guò)判斷flavor的名稱(chēng),來(lái)輸出不同的apk名字。
android.applicationVariants.configureEach {
outputs.all {
if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl) {
if (flavorName == "redfin") {
this.outputFileName = "RedfinChannel_V${versionName}.apk"
} else if (flavorName == "cheetah") {
this.outputFileName = "CheetahChannel_V${versionName}.apk"
}
}
}
}
代碼調(diào)用
全局性的打包配置完畢后,我們?nèi)绾卧诖a里去使用區(qū)分不同渠道呢。
這里也有兩種方法來(lái)獲取,一種是直接拿取Gradle腳本里創(chuàng)建時(shí)的渠道名,直接通過(guò)BuildConfig類(lèi)的FLAVOR字段來(lái)獲??;一種是拿取我們?cè)贛anifest里設(shè)置的元數(shù)據(jù)的value值,操作稍復(fù)雜一些。具體代碼如下:
object FlavorConfig {
const val REDFIN = "redfin"
const val CHEETAH = "cheetah"
private var manifestMetaData = ""
private var gradleData = ""
init {
val appInfo = appContext.packageManager.getApplicationInfo(
appContext.packageName,
PackageManager.GET_META_DATA
)
manifestMetaData = appInfo.metaData.getString("CHANNEL") as String
gradleData = BuildConfig.FLAVOR
}
fun getMetaDataOne() = manifestMetaData.apply {
infoLog("metaData value: $this")
}
fun getMeatDataTwo() = gradleData.apply {
infoLog("gradle metaData value: $this")
}
}
到此這篇關(guān)于Android多渠道打包配置方案的文章就介紹到這了,更多相關(guān)Android打包配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào))
本篇文章主要介紹了Android動(dòng)態(tài)人臉檢測(cè)的示例代碼(臉數(shù)可調(diào)),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Android實(shí)用控件自定義逼真相機(jī)光圈View
這篇文章主要為大家詳細(xì)介紹了Android實(shí)用控件自定義逼真相機(jī)光圈,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Win10下android studio開(kāi)發(fā)環(huán)境配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Win10下android studio開(kāi)發(fā)環(huán)境配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android對(duì)稱(chēng)加密與非對(duì)稱(chēng)加密
這篇文章主要為大家詳細(xì)介紹了Android對(duì)稱(chēng)加密與非對(duì)稱(chēng)加密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
Android通知欄增加快捷開(kāi)關(guān)的功能實(shí)現(xiàn)教程
對(duì)于Android來(lái)說(shuō)其中一項(xiàng)很方便的操作便是下拉菜單,下拉菜單欄可以快捷打開(kāi)某項(xiàng)設(shè)置,這篇文章主要給大家介紹了關(guān)于Android通知欄增加快捷開(kāi)關(guān)的功能實(shí)現(xiàn),需要的朋友可以參考下2023-01-01

