flavorDimensions 多維度理解(版本差異化打包)

Android Studio 自從升級到 3.0 之后握恳,gradle 的玩法也隨之變得更加豐富起來,今天就來講講有關(guān) flavorDimensions (官網(wǎng)翻譯過來是風(fēng)味維度)的配置捺僻。

Android Studio3.0 之前乡洼,進行多模塊依賴開發(fā)的情況下,項目是正常運行的匕坯,然而把 studio 升級到 3.0 之后束昵,原本的項目就出現(xiàn)了問題,具體問題如下:

Error:All flavors must now belong to a named flavor dimension.Learn more at 
 https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

項目是沒問題的葛峻,那么就應(yīng)該是配置上出了問題锹雏,但這又是什么鬼?

經(jīng)過了一番的折騰术奖,終于明白了是怎么回事礁遵。直譯過來的話就是所有的風(fēng)味現(xiàn)在必須屬于一個已命名的風(fēng)味維度轻绞。官網(wǎng)提供的解決方式是:

// Specifies a flavor dimension.
flavorDimensions "color"

productFlavors {
     red {
      // Assigns this product flavor to the 'color' flavor dimension.
      // This step is optional if you are using only one dimension.
      dimension "color"
      ...
    }

    blue {
      dimension "color"
      ...
    }
}

defaultConfig 里面加入 flavorDimensions ,定義風(fēng)味維度(也就是命名風(fēng)味維度)佣耐。
然后在產(chǎn)品風(fēng)味中指定所屬的風(fēng)味維度政勃。

好了,以上只是針對出現(xiàn)的問題進行解決兼砖,接下來就是針對 flavorDimensions 進行一些驗證奸远。

多維度理解

其實這涉及到了版本差異化打包的內(nèi)容,如果說 3.0 以前的版本差異化打包更多的是為了廠商定制的讽挟,那么 3.0 以后的版本差異化打包就是在廠商的基礎(chǔ)之上加入了機型懒叛,渠道等一些參數(shù),變成了多個維度的產(chǎn)品耽梅。

也就是說之前的一個產(chǎn)品只有一個參數(shù)進行描述的話薛窥,現(xiàn)在就可以為其增加多個參數(shù)進行配置,比如 A 廠商的 A 渠道的A機型眼姐、 A 廠商的 B 渠道的 C 機型等拆檬,維度越多,產(chǎn)品的樣式越發(fā)豐富妥凳。

好了竟贯,理論說完,接下來就是進行通俗易懂的一些示例了逝钥,只有實踐才能讓自己檢驗到真理屑那。

新建項目,然后在 app/build.gradle 文件里配置兩個風(fēng)味維度(“company”艘款,“channel”)持际,如下:

defaultConfig {
        applicationId "com.voctex.flavorsapp"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        flavorDimensions "company","channel"
    }

然后進行產(chǎn)品的多維度配置(完整配置在文章下面):

productFlavors{
        //隨便命名,建議根據(jù)該維度的具體信息進行命名
        companyA{
            dimension "company"
        }
        companyB{
            dimension "company"
        }
        channelA{
            dimension "channel"
        }
        channelB{
            dimension "channel"
        }
    }

配置完之后進行 gradle 構(gòu)建哗咆,如果用 Terminal 命令直接構(gòu)建打包的話蜘欲,用如下命令:

//windows
gradlew :app:assembleRelease
//mac
./gradlew :app:assembleRelease

也可以直接用 studio 進行打包,在最右邊有個 Gradle晌柬,里面有很多 task姥份,直接選擇 assembleRelease,如圖:

打包構(gòu)建之后就會出現(xiàn)多個維度的產(chǎn)品年碘,對應(yīng)如下澈歉,如圖:

可以理解為總共有兩個維度,公司(company)和渠道(channel)屿衅,這里公司的維度排前面(排序先后有要求埃难,下面會講到),所以所有的產(chǎn)品就是,A 公司的 A 渠道產(chǎn)品涡尘,A 公司的 B 渠道產(chǎn)品忍弛,B 公司的 A 渠道產(chǎn)品,B 公司的 B 渠道產(chǎn)品考抄。
可見剧罩,增加維度之后,版本差異化的內(nèi)容就更為豐富了座泳。

上面說了,維度的定義先后是有要求的幕与,不可隨便挑势,下面為了驗證這個說法進行了一項測試,我們在 productFlavors 里給每一個特點產(chǎn)品定義一個常量啦鸣,常量的值就是該特點產(chǎn)品的名字潮饱。如下:

productFlavors{
        companyA{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyA\""
        }
        companyB{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyB\""
        }
        channelA{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelA\""
        }
        channelB{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelB\""
        }
    }

這里有個要注意的點就是在 BuildConfig 定義 String 的常量時,需要把雙引號也加進去诫给。

然后進行跟剛才一樣的構(gòu)建香拉,對比幾個風(fēng)味維度的 BuildConfig 文件里的這個 FLAVOR_NAME 常量,會發(fā)現(xiàn)總是顯示第一維度 company 的值中狂,而第二維度 channel 的值并不存在凫碌,所以當產(chǎn)生多維度的產(chǎn)品時,定義的一些常量總是以第一維度的配置為準胃榕。結(jié)果如下:

BuildConfig.java 文件生成后會在app/build/generated/source/buildConfig/companyAChannelA/release/com/voctex/flavorsapp/BuildConfig.java

-------------------------------------------圖片分割線------------------------------------------


-------------------------------------------圖片分割線------------------------------------------


-------------------------------------------圖片分割線------------------------------------------


實驗證明盛险,當你在各個維度各自定義了同一個常量的值,總是以第一維度的為準勋又,只有第一維度的定義或者說是修改才是有效的苦掘。

對了,忘記加上完整的配置信息楔壤,重新貼上:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.voctex.flavorsapp"
        minSdkVersion 18
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        flavorDimensions "company","channel"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors{
        companyA{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyA\""
        }
        companyB{
            dimension "company"
            buildConfigField "String","FLAVOR_NAME","\"companyB\""
        }
        channelA{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelA\""
        }
        channelB{
            dimension "channel"
            buildConfigField "String","FLAVOR_NAME","\"channelB\""
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.0'
//    testImplementation 'junit:junit:4.12'
//    androidTestImplementation 'com.android.support.test:runner:1.0.2'
//    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

因此鹤啡,在項目中可以通過如下方式分別實現(xiàn)代碼邏輯(以下通過FLAVOR變量控制,也可使用或搭配其他變量):

比如本地工具類 Utils.java 中定義了對應(yīng)的字符串變量蹲嚣,對應(yīng) BuildConfig.java中生成的值:
...
 public static final String COMPANYA_CHANNELA= "companyAchannelA";
 public static final String COMPANYA_CHANNELB= "companyAchannelB";
...

然后其它功能類的代碼中就可以通過判斷當前的配置變量實現(xiàn)對應(yīng)型號的邏輯:
...
 if (Utils.COMPANYA_CHANNELA.equals(BuildConfig.FLAVOR)) {
                    //公司 A 產(chǎn)品 A 想實現(xiàn)的代碼邏輯
                } else if (Utils.COMPANYA_CHANNELB.equals(BuildConfig.FLAVOR)) {
                    //公司 A 產(chǎn)品 B 想實現(xiàn)的代碼邏輯
                } else {
                    //默認配置平臺想實現(xiàn)的代碼邏輯
                }
...

最后递瑰,轉(zhuǎn)載自:

Android Studio3.0 flavorDimensions多維度理解(版本差異化打包)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隙畜,隨后出現(xiàn)的幾起案子泣矛,更是在濱河造成了極大的恐慌,老刑警劉巖禾蚕,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件您朽,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機哗总,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門几颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讯屈,你說我怎么就攤上這事蛋哭。” “怎么了涮母?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵谆趾,是天一觀的道長。 經(jīng)常有香客問我叛本,道長沪蓬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任来候,我火速辦了婚禮跷叉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘营搅。我一直安慰自己云挟,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布转质。 她就那樣靜靜地躺著园欣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪休蟹。 梳的紋絲不亂的頭發(fā)上俊庇,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音鸡挠,去河邊找鬼辉饱。 笑死,一個胖子當著我的面吹牛拣展,可吹牛的內(nèi)容都是我干的彭沼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼备埃,長吁一口氣:“原來是場噩夢啊……” “哼姓惑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起按脚,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤于毙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辅搬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唯沮,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了介蛉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萌庆。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖币旧,靈堂內(nèi)的尸體忽然破棺而出践险,到底是詐尸還是另有隱情,我是刑警寧澤吹菱,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布巍虫,位于F島的核電站,受9級特大地震影響鳍刷,放射性物質(zhì)發(fā)生泄漏占遥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一倾剿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚌成,春花似錦前痘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓶盛,卻和暖如春最欠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惩猫。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工芝硬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轧房。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓拌阴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奶镶。 傳聞我的和親對象是個殘疾皇子迟赃,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容