日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

flavor android build,android BuildType和BuildFlavor

發布時間:2025/3/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flavor android build,android BuildType和BuildFlavor 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Build Variant

android gradle 插件,允許對最終的包以多個維度進行組合

BuildVariant = ProductFlavor x BuildType

兩個維度

最常見的就是這樣:

productFlavors {

pro {

}

fre {

}

}

lintOptions {

abortOnError false

}

buildTypes {

debug {

}

release {

}

}

其中,buildTypes 一般都會有 debug 或者release,標示編譯的類型,通常在混淆代碼、可調式、資源壓縮上做一些區分。

productFlavor 則為了滿足“同一個project,根據一個很小的區分,來打不同的包”這個需求。

這兩個維度的組合,會產生如下包:

proDebug

proRelease

freDebug

proRelease

更多的維度

flavorDimensions 'abi', 'version'

productFlavors {

pro {

dimension 'version'

}

fre {

dimension 'version'

}

arm {

dimension 'abi'

}

mips {

dimension 'abi'

}

}

buildTypes {

debug {

}

release {

}

}

productFlavor 本身定義了2個維度,記上 buildType,則有三個維度,會產生如下的包:

armProDebug

armProRelease

armFreDebug

armFreRelease

mipsProDebug

mipsProRelease

mipsFreDebug

mipsFreRelease

其中每個維度組合,都可以設置本身的 dependency、test source。下面做一個舉例。

Flavor 與 Dependency

需求

module 中有若干個 flavors,例如:fre 和 pro,分別依賴不同的庫,這些庫有的是本地 jar 庫,有的是遠程庫。

方案

image.png

屏幕快照 2020-06-19 下午1.38.36.png

BuildType,構建類型,主要針對開發生命周期的不同階段進行配置。一個模塊或者項目,默認有兩種類型,release 和 debug。 debug 類型下 debuggable 屬性是 true,從而使得我們可以打斷點進行調試。debug 類型在打包的時候,會使用默認的自動生成的簽名,對于 release 類型來說,發布的時候需要使用我們自己的密鑰進行簽名。同時,我們還可以在發布的時候,進行代碼混淆。

signingConfigs {

a {

}

release {

}

defaultSigning {

keyAlias 'xxx'

keyPassword 'xxx'

storeFile file('xxxxx')

storePassword 'xxxx'

}

}

resnginConfings 里邊可以隨便命名寫配置名字,如:a,release,defaultSigning直接在buildTypes 的類型里邊配置 signingConfig來配置

buildTypes {

release {

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

debuggable false

signingConfig signingConfigs.defaultSigning

}

debug {

}

buildToolsVersion '28.0.3'

}

你建立幾個buildType,在buildFlavor就會出現幾個類型

屏幕快照 2020-06-19 下午1.37.38.png

注意:

屏幕快照 2020-06-19 下午2.16.32.png

你在Active Build Variant選擇了那個,那個文件夾中的java的顏色就變成深藍色,res文件夾就變成res的文件夾了

如何使用構建變體

上一節,說了什么是構建變體,但是,我們該怎么使用以滿足我們的需求呢?有兩個地方,給我們帶來了可能性:BuildConfig 和 SourceSet(源集)。

BuildConfig

也許你已經注意到了上面 productFlavor 中的

buildConfigField "String", "NAME", "\"免費版\""

事實上,對于每一種變體,都會有一個 BuildConfig 與之一一對應。

我們來看看構建變體free.debug 的BuildConfig:

public final class BuildConfig {

public static final boolean DEBUG = Boolean.parseBoolean("true");

public static final String APPLICATION_ID = "com.ygs.test.free.debug";

public static final String BUILD_TYPE = "debug";

public static final String FLAVOR = "free";

public static final int VERSION_CODE = 1;

public static final String VERSION_NAME = "1.0-free";

// Fields from product flavor: free

public static final String NAME = "免費版";

}

這些字段都是靜態常量,在項目中,我們都可以通過 BuildConfig 直接訪問。比如,你可以通過 BuildConfig.DEBUG 判斷當前版本是否是 debug 版本;可以通過 BuildConfig.FLAVOR 判斷當前的 productFlavor,已決定是否啟用某個功能。當然,我們也可以自定義字段,比如

把格式說一下 buildConfigField("常量類型","常量名稱","常量值")

buildConfigField "String", "NAME", "\"免費版\""

flavorDimensions "mode"

productFlavors{

dev{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/dev/"')

buildConfigField("boolean", "UPDATE", "true")//那里需要用了,直接BuildConfig.UPDATE就取出來了,就這么簡單

}

tes{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/tes/"')

buildConfigField("boolean", "UPDATE", "false")

}

pro{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/pro/"')

buildConfigField("boolean", "UPDATE", "false")

}

}

可以用來配置清單文件里面的值

這個最常用的就是在清單文件里面需要配置app_key,app_id的時候了,很多的三方SDK是需要配置這個東西的,比如某盟,某語音等等一大堆,這個時候,開發是用的key和id肯定不能正是環境也用,或者給不同的客戶打不同的包,用的也不能一樣,這是后,需要進行一些配置:

在清單文件(AndroidManifest)里面,application節點下這樣配置:

android:name="app_id"

android:value="${app_id_value}" />//占位符

android:name="app_key"

android:value="${app_key_value}" />

在剛剛的productFlavors下面這樣配置:

productFlavors{

dev{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/dev/"')

manifestPlaceholders = [app_id_value : "123456"

,app_key_value : "654321"]

}

tes{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/tes/"')

manifestPlaceholders = [app_id_value : "111111"

,app_key_value : "222222"] //替換兩個以上的用逗號隔開

}

pro{

dimension "mode"

buildConfigField("String", "HTTP_BASE", '"https://www.xxx.com/pro/"')

manifestPlaceholders = [app_id_value : "223344"

,app_key_value : "556677"]

}

}

上述這些字段,無論是自定義的,還是默認的,都可以成為我們在項目中的判斷條件。

image.png

SourceSet

所以源集,即代碼和資源的分組。這可能有點抽象,舉個栗子,src/main 就是一個源集。

每個 buildType 可以有一個源集,每個 buildFlavor 可以有一個源集,每個 buildVariant 同樣可以有一個源集。

其中,src/main 這個源集是所有源集所共有的,除此之外,源集之間互斥。

image.png

如上圖所示,一共有三個源集:freeDebug、freeRelease、main。

注意,freeDebug、freeRelease 實際上是使用 buildVariant 的構建的源集,需要和構建變體的名字一樣(當然可以通過配置修改這種默認行為)。

這里有幾點注意事項:

對于 java 文件來講,freeDebug 中不能出現和 main 中一樣在同一個包下類名相同的 java 文件,因為他們之間是共享關系,相當于將 main 中的所有 java 和 freeDebug 合并在一起。如果出現兩個相同名字的 java 文件,會報錯。freeDebug 和 freeRelease 不同,它們所有的資源都是互斥的,相互不影響,因為我們在構建的時候,也只能選擇其中一種進行構建。假設我們選擇了 freeDebug,那么 freeRelease 就會被剔除在外。

對于 res 文件夾下的這些資源文件,freeDebug 和 freeRelease 這些源集之間同樣是互斥的,相互沒有任何影響。但是對于不同源集和 main之間,卻存在著資源合并或替換的情況。

對于 drawable 及其相關文件夾下的圖片而言,freeDebug 中的圖片會直接覆蓋 main 中的同名圖片。對于 layout 文件夾下的布局文件也是這樣。

但是,對于 values 文件夾下的 xml 文件來說,確是文件內容的合并。比如在源集 main 中的 strings.xml 中

App

Hello world!

在源集 freeDebug 中的 strings.xml 中

FreeDebug

它們合并之后就是

FreeDebug

Hello world!

最后,非常重要的一點,合并或者替換時會遵照優先級:

buildVariant > buildType > buildFlavor> main > 庫依賴項

總結

以上是生活随笔為你收集整理的flavor android build,android BuildType和BuildFlavor的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人精品一区二区在线观看 | 中文字幕伦理 | 欧美视频在线一区二区三区 | 精品97人妻无码中文永久在线 | 久久精品一区二区三区不卡牛牛 | 亚欧精品在线 | 黄视频在线免费看 | 波多野结衣视频在线观看 | 一起草最新网址 | 国产精品100 | 青青草婷婷 | 国产欧美精品一区二区色综合 | 日本一本在线观看 | 欧美色激情| 亚洲国产综合久久 | 少妇激情在线 | 91挑色 | 久久精品欧美一区二区三区不卡 | 色999在线| 豆花av| 亚洲涩涩爱 | 丰满少妇一区二区三区 | 人妻aⅴ无码一区二区三区 阿v免费视频 | 麻豆国产在线 | 午夜精品成人毛片非洲 | 久久精品老司机 | 性色av一区二区三区免费 | 粗喘呻吟撞击猛烈疯狂 | 女女互慰揉小黄文 | 欧美性猛交一区二区三区精品 | 在线观看www. | 日韩1区2区3区| 日韩免费播放 | 日日av| 伊人老司机 | 99re只有精品| 日本一级片在线观看 | 致命弯道8在线观看免费高清完整 | 波多野结衣一级 | 喷潮在线 | 男女网站视频 | 永久免费不卡在线观看黄网站 | 亚洲欧美日韩精品在线观看 | 国产麻豆乱码精品一区二区三区 | 九一国产精品 | 日韩精品人妻无码一本 | 超碰凹凸 | 91中文在线 | 日韩久久精品视频 | 亚洲天堂一区 | 一区二区中文在线 | 免费视频91蜜桃 | 偷拍亚洲| 日本123区| 亚洲精品免费看 | 亚洲av片一区二区三区 | 樱空桃在线观看 | av网站在线观看免费 | 亚洲在线视频观看 | 亚洲AV无码成人精品区东京热 | 天天干人人干 | 男女日批在线观看 | 日韩av在线免费看 | 两性囗交做爰视频 | 一区二区三区有限公司 | 欧美一级不卡视频 | 青草视频在线 | 午夜在线一区二区三区 | 欧美亚洲另类图片 | 亚洲性生活网站 | 国产一区二区三区视频免费观看 | 亚洲专区欧美专区 | 日韩国产在线观看 | 少妇视频网 | 亚洲啊啊 | 青青草在线免费视频 | www.黄在线观看 | 美女流白浆视频 | 欧美女同在线 | 久久艹在线观看 | 成人国产一区二区三区 | 欧美激情视频在线播放 | 久草中文在线观看 | 9l视频自拍九色9l视频 | 精品无码一区二区三区蜜臀 | 乌克兰av在线 | japansexxxxhd医生 夜夜操导航 | 99久久久精品免费观看国产 | 日本欧美久久久久免费播放网 | 欧美久久精品 | 可以免费看毛片的网站 | 国产精品天天看 | 在线天堂中文 | 国产4区 | 亚洲一区你懂的 | 就要操av | 俄罗斯一级片 | 91漂亮少妇露脸在线播放 | 极品色av影院 |