AndroidStudio3.0实现多渠道打包

   日期:2020-05-26     浏览:138    评论:0    
核心提示:多渠道打包概述什么是多渠道包渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等产品在不同的应用市场可能有不同的统计需求,需要为每个应用市场的Android包设定一个可以区分应用市场的标识,这个为Android包设定应用市场标识的过程就是多渠道打包。为什么要提供多渠道包国内存在着有众多的应用市场,产品在不同的渠道可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。移动开发

多渠道打包概述

什么是多渠道包
渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等
产品在不同的应用市场可能有不同的统计需求,需要为每个应用市场的Android包设定一个可以区分应用市场的标识,这个为Android包设定应用市场标识的过程就是多渠道打包。

为什么要提供多渠道包
国内存在着有众多的应用市场,产品在不同的渠道可能有不同的统计需求,为此Android开发人员需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。
在安装包中添加不同的标识,应用在请求网络的时候携带渠道信息,方便后台做运营统计。

通过配置gradle脚本实现多渠道打包
这种打包方式是使用Android Studio的编译工具gradle配合使用的,其核心原理就是通过脚本修改AndroidManifest.xml中的mate-date内容,执行N次打包签名操作实现多渠道打包的需求。然后就可以在java中通过API获取对应的数据。

 

多渠道打包实现步骤(友盟为例)

打包配置

  1. 按照umeng的要求,manifest文件中需要有(在application下,和activity是并列关系):
    <meta-data
         android:name="UMENG_CHANNEL"
         android:value="${UMENG_CHANNEL_VALUE}">

    这段配置,value那里就是渠道名称,但是我们在这里不会去写渠道名,写的是一个占位符,后面gradle编译的时候会动态的替换掉它。

  2. 在module(一般也就是app)的build.gradle的android{}中添加配置渠道:
        // productFlavors是需要打包的纬度名称,下方的脚本是将配置文件中的占位符替换成渠道名称
        productFlavors{
            xiaomi {
                dimension "versionCode"
            }
            baidu {
                dimension "versionCode"
            }
            vivo {
                dimension "versionCode"
            }
            _360 {
                dimension "versionCode"
            }
        }
        // 纬度信息
        flavorDimensions("versionCode")
    
        productFlavors.all {flavor ->
            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    
        }

    AS3.0以后需要将你原来所有的flavor进行统一管理,用属性名flavor dimension进行配置,即使你只有一维属性也需要这样做,否则你就会得到错误。Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html #85

    如果没有错误的情况下我们会在Android studio的BuildVariant看到对应的渠道,如下图所示:
  3. 获取渠道
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            String channel=getChannel();
            Toast.makeText(MainActivity.this, "channel==" + channel, Toast.LENGTH_SHORT).show();
        }
    
        private String getChannel() {
            try {
                PackageManager pm = getPackageManager();
                ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
                return appInfo.metaData.getString("UMENG_CHANNEL");
            } catch (PackageManager.NameNotFoundException ignored) {
            }
            return "";
        }
  4. 配置buildTypes信息以及Apk自定义名称
    buildTypes {
            debug {
                // debug 使用release的签名信息,也可以不配置
                // 自动签名打包时要用到签名配置
                signingConfig signingConfigs.release
            }
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
                // 自动签名打包时要用到签名配置
                signingConfig signingConfigs.release
                // 修改生成的 apk 文件名,输出 apk 名称:MyApp_v1.0.0_2017-11-10_debug.apk;MyApp是app的名称
                android.applicationVariants.all { variant ->
                    def suffix
                    if (variant.buildType.name == 'release') {
                        suffix = 'release'
                    } else {
                        suffix = 'debug'
                    }
                      // AS3.0之前这样重命名
    //                variant.outputs.each { output ->
    //                    def outputFile = output.outputFile
    //                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
    //                        def fileName = "MyApp_v${defaultConfig.versionName}_${releaseTime()}_${suffix}.apk"
    //                        output.outputFile = new File(outputFile.parent, fileName)
    //                    }
    //                }
                    // AS3.0之后这样重命名
                    variant.outputs.all {
                        outputFileName = "WanAndroid_v${defaultConfig.versionName}_${releaseTime()}_" +
                                "${variant.productFlavors[0].name}_${suffix}.apk"
                    }
                }
            }
        }

    releaseTime()是获取当前时间的方法,配置在build文件的根节点

    // 定义打包时间
    static def releaseTime() {
        return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
    }

    签名信息

        // 签名配置
        signingConfigs {
            release {
                storeFile file('/Users/zly/Downloads/DemoProject/WanAndroid/wanAlias.jks')
                storePassword '123456'
                keyAlias = 'wanAndroid'
                keyPassword '123456'
            }
        }

     

打包

根据签名方式可分为两种打包方式

  1. 手动签名打包
    1. (build -> Generrate Signed Bundle/Apk)选择已有的签名文件或者新建
    2. 选择打包已经配置过的渠道(选择release版本)
  2. 自动签名打包
    1. 打开Project Stucture图形化界面,选择已有的签名文件

点击ok之后就会生成signingConfigs

在Terminal中使用./gradlew assembleRelease  或者 gradle assembleRelease  可进行所有渠道打包。

也可以单独打包一个渠道,例如 ./gradlew assembleVivoRelease得到Vivo的包

PS:使用gradle命令的前提是配置gradle环境

 

参考资料:

Android的多渠道打包

Android多渠道打包方案汇总

 

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服