Android多渠道打包配置方案
背景
多渠道打包,顧名思義就是用來區(qū)分同一個(gè)軟件,在不同渠道上的釋放版本。
這個(gè)手機(jī)上大型app幾乎是必配置的一個(gè)項(xiàng),給不同型號(hào)的手機(jī)所用的apk會(huì)做一些細(xì)微的區(qū)別。像筆者使用酷安社區(qū)比較多,在官網(wǎng)下載的酷安apk界面頂部有軟件管理功能,在其他手機(jī)廠的應(yīng)用商店里下載的酷安就沒有這個(gè)功能。
目前我們有需求是要一套軟件代碼庫多個(gè)項(xiàng)目共同使用,針對(duì)不同的項(xiàng)目打包不同的渠道apk,現(xiàn)學(xué)記錄一下。
Gradle腳本和Manifest文件配置
不同渠道的apk既然要做細(xì)微的功能上的區(qū)分,就需要在代碼里能拿到一個(gè)類似鍵值對(duì)的標(biāo)志位。并且能夠全局調(diào)用。首先我們需要在app級(jí)的gradle文件里配置不同的channel名稱。
其中flavorDimensions和productFlavors中的維度名稱需要一一對(duì)應(yīng)。隨便寫一個(gè)"default"即可。
defaultConfig { xxxx = xxxx flavorDimensions.add("default") }
gradle.kts語法與Groovy略有不同,要添加自己配置的東西一般是使用create,register之類的關(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"
來為其賦值。
<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}" />
打包時(shí),可以通過判斷flavor的名稱,來輸出不同的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ū)分不同渠道呢。
這里也有兩種方法來獲取,一種是直接拿取Gradle腳本里創(chuàng)建時(shí)的渠道名,直接通過BuildConfig類的FLAVOR字段來獲?。灰环N是拿取我們?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-08Android實(shí)用控件自定義逼真相機(jī)光圈View
這篇文章主要為大家詳細(xì)介紹了Android實(shí)用控件自定義逼真相機(jī)光圈,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08Win10下android studio開發(fā)環(huán)境配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Win10下android studio開發(fā)環(huán)境配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android通知欄增加快捷開關(guān)的功能實(shí)現(xiàn)教程
對(duì)于Android來說其中一項(xiàng)很方便的操作便是下拉菜單,下拉菜單欄可以快捷打開某項(xiàng)設(shè)置,這篇文章主要給大家介紹了關(guān)于Android通知欄增加快捷開關(guān)的功能實(shí)現(xiàn),需要的朋友可以參考下2023-01-01