1. 多渠道的概念

  • APP发布到不同的应用平台,监测用户是从哪个平台安装的。

2. 为什么要多渠道打包


  • 统计用户安装APP来源
  • 批量修改生成的apk文件名
  • 可更改包名
  • 生成不同应用名称或图标

有的时候你会在不同平台看到XX-小米版,XX-魅族版等等,或者beta版的图标和正式的不一样,其实代码还是那个代码,无非做点小小的改动

3.多渠道怎么打包呢

  • 一般是通过gradle来实现的
1. 在AndroidManifest.xml中添加占位符

一般都是像友盟,腾讯统计分析SDK中使用的方案,网上友盟的较多,我实际用的是腾讯分析所以就拿腾讯的来说(其实都一样)。
首先,在AndroidManifest.xml的application标签里添加一个meta-data标签定义MTA_CHANNEL占位符,腾讯分析SDK会读取里面的value值传到后台,便于我们日后分析。

<meta-data android:name="MTA_CHANNEL"
            android:value="${MTA_CHANNEL_VALUE}" />
2. 修改app下的build.gradle文件,在android闭包中添加productFlavors属性配置占位符
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.aimerd.channel"
        minSdkVersion 11
        targetSdkVersion 21
        versionCode 1
        versionName "1.0.0"
        multiDexEnabled true
    }
    buildTypes {
        release {
            // 不显示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //启用混淆代码的功能
            minifyEnabled true
            //压缩对齐生成的apk包
            zipAlignEnabled true
            //指定混淆规则,需要压缩优化的混淆要把proguard-android.txt换成proguard-android.txt
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //移除无用的资源文件
            shrinkResources true
            //启用multidex的支持
            multiDexEnabled true
        }
    }
    productFlavors 
        baidu {
            manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidu"]
        }
        _91 {
            manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"]
        } 
        wandoujia {
            manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi {
            manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"]
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (variant.buildType.name.equals('release')) {
                //生成apk名字的格式:Channel1.0.0_2016-06-22_baidu.apk
                //可自定义自己想要生成的格式
                def fileName = "Channel${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                       output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
  • ps : 如果觉得productFlavors重复代码太多,还可以这样写:
productFlavors { 
 baidu {} 
 _91 {} 
 wandoujia {} 
 xiaomi {} 
 } 
 //批量处理 
 productFlavors.all { 
 flavor -> flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: name] 
 }

注意:像91和360这种数字的是不可以的,我试过”91”虽然可以编译通过,但打包的时候会报错

Error:Execution failed for task ':app:transformClassesWithRetrolambdaFor91Release'.
> java.lang.NullPointerException (no error message)
3. build->Generate Signed APK…打包即可

如何生成不同包的app,更改百度地图等key,sercert、启动页面img、应用图标等文件

  • 1.修改productFlavors 配置即可生成不同包名的app(需要注意Manifest.xml中的依赖于包名的属性同样可以用占位符 ${applicationId})
1. 更改包名
productFlavors {

            changelife_app { //畅E生活 
                applicationId "info.xinfu.o2o"
                versionCode 71
                versionName "3.3.7.1"
            }

            jinchen_app { //金晨物业
                applicationId "cn.jinchen.o2o"
                versionCode 71
                versionName "1.0.0"
            }

        }

${applicationId}如图:

- 例子

AndroidStudio Main Toolbar没有显示_渠道


- 微信

AndroidStudio Main Toolbar没有显示_应用_02


- 极光

AndroidStudio Main Toolbar没有显示_渠道_03

2. 如何生成不同应用名称或图标
  • 在app模块,src目录下,新建一个与main目录同级的jinchen_app目录(这里的名字跟productFlavors中定义的渠道名要一致):
  • 把values下strings.xml中的”app_name”改成自己想要的应用名称。
  • 其他的需要更改的资源只需要把对应的资源复制过来,替换即可。
  • 打包时候出现你的渠道选型即成功了: