Android多渠道包实现不同功能

需求:华为渠道使用华为支付,其他渠道使用支付宝、微信

这样就要求在支付页面,选择支付方式时,华为渠道显示的是华为支付,而其他页面显示的是支付宝和微信

实现:

1. 使用productFlavors,共用大部分代码,而支付页面做功能上的区分

  1. src目录下新建两个文件夹huaweinormal,跟main文件夹在同一级。在huaweinormal里可以建javares目录,里面就可以放同名的activity了。如果说一个activity大部分地方是相同的,只有个按钮不同,这个就得靠自己抽象出来了
    Android多渠道包实现不同功能_第1张图片
  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方式
Android多渠道包实现不同功能_第2张图片

  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

Demo地址:https://github.com/cnting/ProductFlavorDemo

参考:
[1]: https://www.mtyun.com/library/mt-apk-adaptation
[2]: http://www.cfm880.com/2017/07/08/记一次gradle多渠道,功能分割/
[3]: https://blog.csdn.net/u012551350/article/details/51274284
[4]: https://ghui.me/post/2015/03/create-several-variants/
[5]:https://zhuanlan.zhihu.com/p/33722674
[6]:https://gradle-guide.books.yourtion.com/Chapter06/64.html

你可能感兴趣的:(android学习)