Android 通过productFlavors实现多渠道打包方法示例

 更新时间:2023年02月12日 10:47:05   作者:ChenYhong  
这篇文章主要为大家介绍了Android 通过productFlavors实现多渠道打包方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

在日常开发中,可能会遇到同一份代码,需要根据运营需求打出不同包名、不同图标、不同名称的Apk,发布到不同的渠道中。Android Studio提供了便捷的多渠道打包实现方法productFlavors

本文介绍一下使用productFlavors来实现多渠道打包。

创建productFlavors

  • 添加Dimension

在app包下的build.gradle中的android闭包下,添加flavorDimension,代码如下:

android {
    ...
    // 方式1
    getFlavorDimensionList().add('example_value')
    // 方式2
    flavorDimensions "example_value"
}

两种方式选择一种即可,方式1有代码补全提示,方式2没有。

  • 创建productFlavor

在app包下的build.gradle中的android闭包下,创建productFlavors,代码如下:

android {
    ...
    productFlavors {
        // 原始渠道
        origin{
            // 这里的值与前面flavorDimensions设置的值保持一致
            dimension 'example_value'
        }
        // 示例渠道
        exampleFlavor {
            // 这里的值与前面flavorDimensions设置的值保持一致
            dimension 'example_value'
        }
    }
}

网上找到的相关文章都说productFlavor中需要配置dimension,但是在尝试的过程中发现,如果只添加了一个flavorDimensions,那么productFlavor中的dimension可以不用特别声明(我的gradle版本为7.6,AGP为7.4.1)。

构建完后可以在Build Variants中看到已配置的变体,如图:

渠道包参数配置

打渠道包时,根据需求可能会需要配置不同参数,例如App的名称、图标、版本信息,服务器地址等。

  • 配置不同的签名信息

如果需要使用不同的签名文件,可以在app包下的build.gradle中的android闭包下配置signingConfigs,代码如下:

android {
    signingConfigs {
        origin {
            keyAlias 'expampledemo'
            keyPassword '123456'
            storeFile file('ExampleDemo')
            storePassword '123456'
        }
        exampleFlavor {
            keyAlias 'exampledemoflavor'
            keyPassword '123456'
            storeFile file('ExampleDemoFlavor.jks')
            storePassword '123456'
        }
    }
    flavorDimensions "example_value"
    productFlavors {
        origin{
            signingConfig signingConfigs.origin
        }
        exampleFlavor {
            signingConfig signingConfigs.exampleFlavor
        }
    }
}

需要注意的是signingConfigs必须在productFlavors前面声明,否则构建会失败。

  • 配置包名、版本号

productFlavors中可以配置渠道包的包名、版本信息,代码如下:

android {
    ...
    defaultConfig {
        applicationId "com.chenyihong.exampledemo"
        versionCode 1
        versionName "1.0"
        ...
    }
    productFlavors {
        origin{
            ...
        }
        exampleFlavor {
            applicationId "com.chenyihong.exampledflavordemo"
            versionCode 2
            versionName "1.0.2-flavor"
        }
    }
}

origin渠道表示的是原始包,不进行额外配置,使用的就是defaultConfig中声明的包名以及版本号。

效果如图:

origin

exampleFlavor

  • 配置BuildConfig,字符串资源

productFlavors中配置BuildConfig或者resValue,可以让同名字段,在打不同的渠道包时有不同的值,代码如下:

android {
    ...
    productFlavors {
        origin{
            buildConfigField("String", "example_value", "\"origin server address\"")
            resValue("string", "example_value", "origin tips")
        }
        exampleFlavor {
            buildConfigField("String", "example_value", "\"flavor server address\"")
            resValue("string", "example_value", "flavor tips")
        }
    }
}

配置完后重新构建一下项目,就可以通过BuildConfig.example_value以及getString(R.string.example_value)来使用配置的字段。

效果如图:

origin

exampleFlavor

  • 配置manifestPlaceholders

有些三方SDK,会在Manifest中配置meta-data,并且这些值跟包名大概率是绑定的,因此不同渠道包需要替换不同的值,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    <application
        ...
        >
        <meta-data
            android:name="channel_value"
            android:value="${channel_value}"/>
        ....
    </application>
</manifest>
android {
    ...
    productFlavors {
        origin{
            manifestPlaceholders = [channel_value: "origin channel"]
        }
        exampleFlavor {
            manifestPlaceholders = [channel_value: "flavor channel"]
        }
    }
}

效果如图:

origin

exampleFlavor

  • 配置不同的依赖

不同渠道包可能会引用不同的三方SDK,配置了productFlavors后,可以在dependencies中区分依赖包,代码如下:

dependencies {
    // origin 包依赖
    originImplementation("com.google.code.gson:gson:2.10.1")
    // exampleFlavor包依赖
    exampleFlavorImplementation("com.google.android.gms:play-services-auth:20.4.1")
}

示例:

FlavorExampleActivity中同时导入Gson包和Google登录包,效果如下:

origin

exampleFlavor

  • 配置不同的资源

在app/src目录下,创建exampleFlavor文件夹,创建与main包下一样的资源文件夹,打渠道包时,相同目录下同名的文件会自动替换,可以通过这种方式来实现替换应用名称和应用图标。

效果如图:

示例Demo

按照惯例,在示例Demo中添加了相关的演示代码。

ExampleDemo github

以上就是Android 通过productFlavors实现多渠道打包方法示例的详细内容,更多关于Android productFlavors多渠道打包的资料请关注脚本之家其它相关文章!

相关文章

  • android自定义环形统计图动画

    android自定义环形统计图动画

    这篇文章主要为大家详细介绍了android自定义环形统计图动画,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android实现将一个Activity设置成窗口样式的方法

    Android实现将一个Activity设置成窗口样式的方法

    这篇文章主要介绍了Android实现将一个Activity设置成窗口样式的方法,涉及Android的窗口样式设置与布局技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-02-02
  • 详解Android 折叠屏适配攻略

    详解Android 折叠屏适配攻略

    这篇文章主要介绍了Android 折叠屏适配攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 简单实现Android闹钟功能

    简单实现Android闹钟功能

    这篇文章主要教大家如何简单实现Android闹钟功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Android中Property模块的键值设置

    Android中Property模块的键值设置

    这篇文章主要介绍了Android中Property模块的键值设置的相关资料,需要的朋友可以参考下
    2017-03-03
  • Android内存溢出及内存泄漏原因进解析

    Android内存溢出及内存泄漏原因进解析

    这篇文章主要介绍了Android内存溢出及内存泄漏原因解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Android 仿京东商城底部布局的选择效果(Selector 选择器的实现)

    Android 仿京东商城底部布局的选择效果(Selector 选择器的实现)

    这篇文章主要介绍了Android 仿京东商城底部布局的选择效果(Selector 选择器的实现),需要的朋友可以参考下
    2017-04-04
  • Android源码中final关键字的用法及final,finally,finalize的区别

    Android源码中final关键字的用法及final,finally,finalize的区别

    Android的源码中很多地方对final关键字的用法很是“别出心裁”,之所以这么说是因为我从没看过是这么使用final关键字的,通过本文给大家分享Android源码中final关键字的用法及final,finally,finalize的区别,感兴趣的朋友一起学习吧
    2015-12-12
  • Android Service详解及示例代码

    Android Service详解及示例代码

    本文主要介绍Android Service,在Android应用开发过程中,Service 会经常用到,这里对Service 的概念,生命周期等做了详细介绍,并附示例代码,有需要的朋友可以参考下
    2016-08-08
  • Android基于讯飞语音SDK实现语音识别

    Android基于讯飞语音SDK实现语音识别

    本例子是一个调用讯飞语音识别SDK的例子源码是一个最纯净的Demo比较容易看懂。实现的是点击按钮开始语音监听,手机需要联网,2/3G的均可,希望本文对大家学习Android有所帮助
    2016-06-06

最新评论