1. 程式人生 > >Android多渠道包實現不同功能

Android多渠道包實現不同功能

需求:華為渠道使用華為支付,其他渠道使用支付寶、微信

這樣就要求在支付頁面,選擇支付方式時,華為渠道顯示的是華為支付,而其他頁面顯示的是支付寶和微信

實現:

1. 使用productFlavors,共用大部分程式碼,而支付頁面做功能上的區分

  1. src目錄下新建兩個資料夾huaweinormal,跟main資料夾在同一級。在huaweinormal裡可以建javares目錄,裡面就可以放同名的activity了。如果說一個activity大部分地方是相同的,只有個按鈕不同,這個就得靠自己抽象出來了 新建huawei和normal資料夾
  2. 在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方式 Build Variants

  1. 可以通過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