zoukankan      html  css  js  c++  java
  • 手把手教你AndroidStudio多渠道打包

           最近不断有朋友向我咨询AndroidStudio多渠道的打包方法,今天整理一下之前积累的打包套路,写一篇文章,手把手的教给大家。 
           说到多渠道,这里不得不提一下友盟统计,友盟统计是大家日常开发中常用的渠道统计工具,而我们的打包方法就是基于友盟统计实施的。按照友盟官方文档说明,渠道信息通常需要在AndroidManifest.xml中配置如下值:

    <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
    • 1
    • 1

           上面的value值Channel_ID就是渠道标识。我们的期望的就是在编译时候这个值能够自动变化以满足区分多渠道的需求。

    (一)在AndroidManifest.xml里设置动态渠道变量

    <meta-data
        android:name="UMENG_CHANNEL"
        android:value="${UMENG_CHANNEL_VALUE}" />
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    (二)在build.gradle设置productFlavors

    这里假定我们需要打包的渠道为酷安市场、360、小米、百度、豌豆荚
    android {  
        productFlavors {
            kuan {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
            }
            xiaomi {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            }
            qh360 {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
            }
            baidu {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
            }
            wandoujia {
                manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
            }
        }  
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    或者批量修改

    android {  
        productFlavors {
            kuan {}
            xiaomi {}
            qh360 {}
            baidu {}
            wandoujia {}
        }  
    
        productFlavors.all { 
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] 
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

           所谓ProductFlavors其实就是可定义的产品特性,配合 manifest merger 使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。上面这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。

    (三)执行打包操作

    在AndroidStudio菜单栏点击Build菜单–>Generate signed APK–>选择key,并输入密码 
    输入密码

    然后下一步,选择打包渠道

    选择打包渠道

    最后点击完成按钮

    这里写图片描述

    上图可以看到,我们已经成功的将五个渠道包打好。

    (四)执行打包命令 ./gradlew assembleRelease

           除了使用AndroidStudio图形打包操作以外,我们也可以使用命令行进行打包操作,具体步骤如下:

    • 在AndroidStudio窗口左下角打开Terminal面板,输入gradlew assembleRelease命令

    这里写图片描述

    • 如果系统中没有安装Gradle,则会自动下载完成安装及初始化

    这里写图片描述

    • 打包成功后会提示BUILD SUCCESSRUL

    这里写图片描述

    • 在app–>build–>outputs–>apk路径中就可以看到打包成功后的APK

    这里写图片描述

    注意,此时这里的APK包名显示为unsigned,也就是说未签名,我们可以继续在build.gradle文件中配置签名信息

    signingConfigs {
            release{
                storeFile file("../wooyun_keystore") //签名文件路径
                storePassword "123456"
                keyAlias "123456"
                keyPassword "123456"  //签名密码
            }
        }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 然后再次执行gradlew assembleRelease命令

    这里写图片描述

    这次生成的就是含有签名的渠道包。

    • 当我们的渠道包版本比较多时,可以自定义所打APK包名称,用以区分

    // 自定义输出配置,这里我们加上APK版本号1.0
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def outputFile = output.outputFile
                        if (outputFile != null && outputFile.name.endsWith('.apk')) {
                            // 输出apk名称为wooyun_v1.0_wandoujia.apk
                            def fileName = "wooyun_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                            output.outputFile = new File(outputFile.parent, fileName)
                        }
                    }
                }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这里写图片描述

    • assemble是Gradle中的编译打包命令,有如下用法:

    如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:

    gradlew assembleWandoujiaRelease
    • 1
    • 1

    如果我们想打包wandoujia渠道的debug版本,执行如下命令就好了:

    gradlew assembleWandoujiaDebug
    • 1
    • 1

    如果我们只打wandoujia渠道版本,则:

    gradlew assembleWandoujia
    • 1
    • 1

    此命令会生成wandoujia渠道的Release和Debug版本

    同理我想打全部Release版本:

    gradlew assembleRelease
    • 1
    • 1

    这条命令会把Product Flavor下的所有渠道的Release版本都打出来。

    下面是我个人的build.gradle配置文件,分享给大家,以作参考

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion "23.0.3"
    
        defaultConfig {
            applicationId "com.wooyun.castiel"
            minSdkVersion 15
            targetSdkVersion 23
            versionCode 1
            versionName "1.0"
        }
    
         //签名
        signingConfigs {
            debugConfig {
                storeFile file("../wooyun_keystore")      //签名文件
                storePassword "123456"
                keyAlias "123456"
                keyPassword "123456"  //签名密码
            }
            release{
                storeFile file("../wooyun_keystore")      //签名文件
                storePassword "123456"
                keyAlias "123456"
                keyPassword "123456"  //签名密码
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                // 自定义输出配置
                applicationVariants.all { variant ->
                    variant.outputs.each { output ->
                        def outputFile = output.outputFile
                        if (outputFile != null && outputFile.name.endsWith('.apk')) {
                            // 输出apk名称为wooyun_v1.0_wandoujia.apk
                            def fileName = "wooyun_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                            output.outputFile = new File(outputFile.parent, fileName)
                        }
                    }
                }
            }
        }
    
        productFlavors {
            kuan {}
            xiaomi {}
            qh360 {}
            baidu {}
            wandoujia {}
        }
    
        productFlavors.all {
            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:23.4.0'
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

           上面的signingConfigs配置中,可以写两个代码块,分别名为debugConfig和releaseConfig,并在其中写好一个完整签名需要的keyAlias、keyPassword、storeFile file、storePassword。 
           然后在buildTypes中,分两个代码块,分别是debug时用的,和release时用的。在其中引用刚刚写好的debugConfig和releaseConfig即可。

           注意:signingConfigs代码块一定要写在buildTypes前面,否则会报下面这种错:

    Could not find property 'debugConfig' on SigningConfig container.
    • 1
    • 1

    签名密码写在gradle中不安全,故最好在打包上线的时候将相关代码注释掉。

    参考链接:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/

  • 相关阅读:
    《大型网站技术架构》读后感
    质量属性
    课堂作业02
    课堂作业01
    《软件构架实践》读后感06
    《软件构架实践》读后感05
    Storm系列三: Storm消息可靠性保障
    Storm系列二: Storm拓扑设计
    Storm系列一: Storm初步
    网络层协议
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997267.html
Copyright © 2011-2022 走看看