Android多渠道包實現不同功能
阿新 • • 發佈:2018-12-17
需求:華為渠道使用華為支付,其他渠道使用支付寶、微信
這樣就要求在支付頁面,選擇支付方式時,華為渠道顯示的是華為支付,而其他頁面顯示的是支付寶和微信
實現:
1. 使用productFlavors,共用大部分程式碼,而支付頁面做功能上的區分
- 在
src
目錄下新建兩個資料夾huawei
和normal
,跟main
資料夾在同一級。在huawei
和normal
裡可以建java
和res
目錄,裡面就可以放同名的activity了。如果說一個activity大部分地方是相同的,只有個按鈕不同,這個就得靠自己抽象出來了 - 在app級的
build.gradle
檔案中新增productFlavor
android { ... flavorDimensions "app" productFlavors { huawei {} normal {} } sourceSets { main { java.srcDir "src/main/java" res.srcDir "src/main/res" jniLibs.srcDir "src/main/jniLibs" manifest.srcFile "src/main/AndroidManifest.xml" assets.srcDir "src/main/assets" } } } dependencies { ... huaweiImplementation 'com.huawei.android.hms:iap:2.6.1.301' }
這樣就可以在Build Variants
裡看到多種build方式
- 可以通過sourceSets控制程式碼和資源,會使用如下規則:
- 所有的原始碼(src/*/java)會以多資料夾的方式一起被使用生成一個輸出。
- 所有Manifest檔案會合併成一個 manifest 檔案。這允許 Product Flavors 有一些不同的元件定義或者許可權宣告,類似於 Build Types 。
- 所有的資源( Android res 和 assets )都會遵循優先順序覆蓋的原則, Build Type 會覆蓋 Product Flavor ,最後又都會覆蓋 main sourceSet .
- 每一個 Build Variant 會基於資源生成他們自己的R類(或者生成其他的原始碼),variant之間不會共享。 所以如果想把SplashActivity的圖片改成帶華為圖示的,則在huawei/res/裡放入一個相同的檔名的圖片就可以了
2.使用第三方SDK
有些渠道使用第三方sdk,比如在華為渠道新增華為支付,使用下面這種方式,即渠道名+Implementation
,
dependencies {
...
huaweiImplementation 'com.huawei.android.hms:iap:2.6.1.301'
}
3.使用walle,如何打渠道包
walle是在productFlavors下一級生成多個渠道包,如果配置了productFlavor,生成的渠道包會如下:
- huaweiRelease
- 360
- xiaomi
- huawei
- …
- normalRelease
- 360
- xiaomi
- huawei
- … 所以如果想只有華為渠道用huaweiRelease的包,其他渠道用normal的包,可以先將normal的包都打出來,然後再單獨打個huawei的包,如下程式碼
basePath=$(cd '../';pwd)
#把所有normal的包都打出來
../gradlew -p $basePath clean assembleNormalReleaseChannels -PchannelFile=$basePath/app/channel
#單獨打華為的包
../gradlew -p $basePath assembleHuaweiReleaseChannels -PchannelList=huawei