從配置Product Flavor拆解Gradle
什麼情況下我們使用Product Flavor
1、 需要用相似的代碼創建不同的產品,或者爲不同產品分配專有屬性,或者設置不同的產品引入不同的包
2、 設置不同代碼或引用
這種情況下不管對不對app內容做修改,我們都需要使用Product Flavor,確保你一臺手機能上能安裝多個渠道的app,即使看起來他們長得一樣,比較通用的一個案例是手遊。
使用這個東西看着很簡單,覺得分分鐘上手,然而其實有各種坑,本文就是踩坑手冊
1、如何劃分渠道?
android{
//增加如下配置
flavorDimensions("app", "ar") //注意這裏聲明的下面一定要有,沒有編譯就會報錯
productFlavors {
app_fir {
dimension "app"
}
app_google {
dimension "app"
}
app_ar {//如果刪除該渠道,flavorDimensions中的ar也要刪掉
dimension "ar"
}
}
}
2、僅劃分渠道
這種情況下代碼層級還是跟原有的編碼結構沒有變化,只需要寫一個單例類用於判斷當前渠道,剩下的操作就根據值自己寫吧。
關鍵代碼如下
String TAG = BuildConfig.FLAVOR; //這個裏面得出的結果和你在Product Flavor中定義的“app_fir ”是一致的
3、根據不同渠道顯示不一樣的內容
這個就稍微複雜點了,實際上我找了不少博客研究了挺久的,最後搞通了,先上圖
上面這個五顏六色框子的圖片就是我的項目結構圖,其實東西很少,主要是爲了測試。
項目一定要在“project”下才能看見全貌,增加的分支和main要有同級目錄,也就是說java和res如果用得到一個都不能少,用不到就不用寫了。
你這樣寫完之後,其實編譯是編譯不過去的,爲啥?因爲此處有坑阿!他會給你提示一個**“錯誤:類重複 ”**的錯誤,那啥原因呢?因爲你沒有指定渠道,它默認把所有代碼合在一起了就發現同名文件夾下有多個同名類。
那咋解決呢?通過Build Variant配置Build Types,其實還有第二種辦法註釋掉其他的選擇,但這樣不方便測試。
這是找了幾個博客才找到的,但問題看完我是懵逼的,平時寫代碼側邊這一溜都是關上的,完全沒注意還能選擇渠道
選完了就正常了。
Product Flavor裏面的屬性都是做什麼用的?
lavorDimensions "app"//維度
productFlavors {
app_fir {
applicationId "com.test.package" //包名
dimension "app" //所屬維度
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "huawei", app_name: "AppForHUAWEI"]
}
}
1、applicationId 配置包名
2、dimension 配置所屬維度
3、manifestPlaceholders 此項目涉及到AndroidManifest的配置
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />