`
iaiai
  • 浏览: 2195582 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多渠道打包

 
阅读更多
由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包。
gradle的多渠道打包很简单,因为gradle已经帮我们做好了很多基础功能。

下面以友盟统计为例说明,一般友盟统计在AndroidManifest.xml里面会有这么一段声明:
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="CHANNEL_ID" />

其中CHANNEL_ID就是友盟的渠道标示,多渠道的实现一般就是通过修改CHANNEL_ID值来实现的。

接下来将一步一步来实现多渠道版本打包。

1.在AndroidManifest.xml里配置PlaceHolder,用与在build.gradle文件中来替换成自己想要设置的值
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />

2.在build.gradle设置productFlavors,修改PlaceHolder的值
productFlavors {
        playStore {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "playStore"]
        }
        miui {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "miui"]
        }
        wandoujia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }

或者批量修改
productFlavors {
        playStore {}
        miui {}
        wandoujia {}
}
 //批量处理
productFlavors.all { 
       flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] 
}

按照上面两步即可编译打多渠道包了,命令是 ./gradlew assembleRelease,可以打包所有的多渠道包。

如果只是想打单渠道包,则执行相应的task即可,如gradle assemblePalyStoreRelease就是打PlayStore渠道的Release版本。

3.如果希望可以对最终的文件名做修改,如需要针对不同的需求生成不同的文件。而修改文件名也很简单,参考以下代码即可实现
def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android{
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                File outputDirectory = new File(outputFile.parent);
                def fileName
                if (variant.buildType.name == "release") {
                    fileName =  "app_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "app_v${defaultConfig.versionName}_${packageTime()}_debug.apk"
                }
                output.outputFile = new File(outputDirectory, fileName)
            }
        }
    }

}

此方法有一定局限性,就是渠道包多了之后编译花费的时间会很长,这里推荐美团打包的第三种方法。

完整的gradle脚本
// 声明是Android程序
apply plugin: 'com.android.application'

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

android {
    // 编译SDK的版本
    compileSdkVersion 21
    // build tools的版本
    buildToolsVersion '21.1.2'

    defaultConfig {
        // 应用的包名
        applicationId "com.**.*"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        // dex突破65535的限制
        multiDexEnabled true
        // 默认是umeng的渠道
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
    }

    // 移除lint检查的error
    lintOptions {
        abortOnError false
    }

    //签名配置
    signingConfigs {
        debug {
            // No debug config
        }

        release {
            storeFile file("../yourapp.keystore")
            storePassword "your password"
            keyAlias "your alias"
            keyPassword "your password"
        }
    }

    buildTypes {
        debug {
            // buildConfigField 自定义配置默认值
            buildConfigField "boolean", "LOG_DEBUG", "true"
            buildConfigField "String", "API_HOST", "\"http://api.test.com\""//API Hos
            versionNameSuffix "-debug"
            minifyEnabled false
            //是否zip对齐
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }

        release {
            // buildConfigField 自定义配置默认值
            buildConfigField "boolean", "LOG_DEBUG", "false"
            buildConfigField "String", "API_HOST", "\"http://api.release.com\""//API Host
            //// 是否进行混淆
            minifyEnabled true
            zipAlignEnabled true
            // 移除无用的resource文件
            shrinkResources true
            //混淆规则文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release

            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        // 输出apk名称为boohee_v1.0_2015-06-15_wandoujia.apk
                        def fileName = "boohee_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }

    // 友盟多渠道打包
    productFlavors {
        wandoujia {}
        _360 {}
        baidu {}
        xiaomi {}
        tencent {}
        taobao {}
        ...
    }

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

dependencies {
    // 编译libs目录下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.jakewharton:butterknife:6.0.0'
    ...
}


分享到:
评论

相关推荐

    360的多渠道打包工具

    在IT行业中,多渠道打包工具是开发者们常用于创建针对不同发布渠道的定制化应用包的重要工具。360的多渠道打包工具,正如标题所提及,是360公司提供的一款专门服务于Android应用程序开发者的工具,它允许开发者快速...

    多渠道打包walle

    在Android应用开发中,多渠道打包是一项至关重要的任务,它允许开发者针对不同的分发渠道(如应用商店、合作伙伴等)创建定制化的apk。Walle,源自美团点评的开源项目,正是一个为解决这一问题而设计的高效多渠道...

    Android多渠道打包工具

    在Android应用开发中,多渠道打包是一项非常重要的任务,它允许开发者针对不同的分发渠道(如应用商店、合作伙伴等)创建定制化的apk文件。每个渠道可能有不同的广告ID、统计跟踪码或其他特定设置,因此需要单独的...

    美团多渠道打包配置

    在Android应用开发中,尤其是对于大型的互联网公司如美团,多渠道打包是一项至关重要的任务。它允许开发者根据不同渠道(例如AppStore、应用市场、线下推广等)构建定制化的APK,以便追踪不同来源的下载和用户行为。...

    Android多渠道打包,替换资源文件、logo、包名、项目名

    在Android应用开发中,多渠道打包是一项非常重要的技术,它允许开发者为不同的分发渠道创建定制的apk,比如Google Play、应用宝、华为应用市场等。这样可以针对每个渠道进行特定的推广策略,如添加不同的广告跟踪...

    Python多渠道打包资源

    在Python编程环境中,多渠道打包资源是一个常见的需求,特别是在开发移动应用或游戏时,我们可能需要为不同的分发平台(如Google Play、App Store或其他第三方市场)创建定制化的安装包。这个过程通常涉及到修改配置...

    安卓快速实现多渠道打包.zip

    在Android应用开发中,多渠道打包是一个非常重要的过程,它涉及到将同一个APK根据不同的渠道进行定制,以便在不同的分发平台或者合作方之间区分数据和统计效果。本压缩包"安卓快速实现多渠道打包.zip"包含了一些资源...

    Apk多渠道打包

    1. Apk多渠道打包工具 2. 原理见http://blog.csdn.net/liuyanggofurther/article/details/50978407 3. 此处是实现的代码和使用方法 4. 使用方法 java -jar zip-comment.jar app-release.apk markets.txt 5. 其中zip-...

    美团多渠道打包工具

    《美团多渠道打包工具详解与应用》 在Android应用开发中,为了满足不同推广渠道的需求,通常需要构建多个带有特定标识的APK,这被称为多渠道打包。美团多渠道打包工具便是为此目的而设计的,它极大地简化了这一过程...

    AndroidStrudio gradle 多渠道打包 外部依赖

    本主题将深入探讨如何使用Android Studio和Gradle进行多渠道打包以及处理外部库依赖。 **一、多渠道打包** 多渠道打包是Android应用发布时的一个常见需求,它允许我们为不同的市场或推广渠道创建定制的应用版本。...

    多渠道打包Walle

    **多渠道打包Walle详解** 在移动应用开发中,尤其是Android应用,经常需要针对不同的渠道进行定制化的打包,比如在发布应用时,我们可能需要在不同的应用市场、广告平台或者合作伙伴处部署不同的版本,每个版本可能...

    友盟多渠道打包 Android Apk

    在Android应用开发中,"友盟多渠道打包 Android Apk" 是一个常见的需求,尤其对于那些需要在多个分发渠道发布应用的开发者来说。友盟(Umeng)是中国领先的移动互联网开放平台,提供了多种服务,包括数据分析、推送...

    多渠道打包方案脚本

    在Android开发过程中,多渠道打包是一项重要的任务,它允许开发者为不同的应用市场或者推广渠道创建定制的apk,以便追踪每个渠道的效果。这个“多渠道打包方案脚本”可能就是一个优化过的自动化工具,用于提高开发...

    gradle多渠道打包的两种实现demo

    本文将深入探讨使用Gradle进行多渠道打包的两种实现方式,并结合提供的两个压缩包文件——"gradle替换资源多渠道打包.rar"和"gradle_manifestPlaceholders实现多渠道打包.rar",详细介绍其具体操作步骤和技术细节。...

    多渠道打包VasDolly

    【标题】"多渠道打包VasDolly"是腾讯推出的一种高效的移动应用多渠道打包解决方案。这个工具的主要目的是为了帮助开发者快速、便捷地为不同的发行渠道创建定制化的应用包,无需重复编译和修改代码。在移动应用的发布...

    Gradle多渠道打包(动态设定App名称,应用图标,背景图片,状态栏颜色)

    在Android开发中,经常需要为不同的市场或者客户创建定制化的应用程序包(APK),这通常被称为多渠道打包。Gradle,作为Android Studio的默认构建工具,提供了强大的灵活性来实现这一需求。本文将深入探讨如何使用...

    Android中使用Ant方式友盟多渠道打包

    友盟作为一个提供统计分析、社会化分享等服务的平台,也支持多渠道打包。在这个场景下,我们可以利用Apache Ant,一个开源的自动化构建工具,来实现自动化的多渠道打包流程。下面将详细介绍如何在Android项目中使用...

    Android-ChangeEnvironment一键快速切换开发环境以及多渠道打包

    在Android应用开发过程中,环境切换和多渠道打包是两个重要的环节。`Android-ChangeEnvironment`项目专注于解决这两个问题,提供了一键快速切换开发环境和多渠道打包的功能,大大提升了开发和发布效率。以下是对这些...

    Python-瓦力多渠道打包的Python脚本测试工具

    Python-瓦力多渠道打包的Python脚本测试工具是一个针对美团瓦力(Walle)的自动化打包解决方案。这个脚本极大地简化了应用的多渠道打包过程,尤其适用于Android应用程序的快速迭代发布。以下是对该工具及其相关知识...

Global site tag (gtag.js) - Google Analytics