美文网首页
Gradle 多渠道打包

Gradle 多渠道打包

作者: 路Promenade | 来源:发表于2016-11-24 14:57 被阅读1448次

    Studio中基于 umeng 统计的多渠道打包。

    1.配置友盟环境

    在AndroidMainfest.xml的<application>标签中添加相关信息:APP_KEY和渠道号。这里渠道号只是一个占位符,在打包的阶段可以动态的替换占位符里的信息。

    <application
        ... >
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="@string/UMENG_APPKEY"/>
        <meta-data
            android:name="UMENG_CHANNEL" 
            android:value="${UMENG_CHANNEL_VALUE}" 
            />
        ...
    </application>
    

    2.配置签名信息

    appmodule中的build.gradle添加下列信息:别名、别名密码、签名文件地址和签名密码

    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('C:/Users/Administrator/Desktop/xxx.jks')
            storePassword 'xxx'
        }
    }
    

    3.设置buildTypes的签名配置

    因为要打release包,所以需要设置buildTypesrelease的签名配置,如下

    buildTypes {
        // 设置debug版本默认渠道设置
        debug {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng_channel"]
        }
        // 正式版本签名设置
        release {
            zipAlignEnabled true
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release // 加上这句话即可
        }
    }
    

    4.配置渠道信息

    渠道号是自己定的,比如wandoujia(豌豆荚)等。不要使用数字开头的命名方式,也不要使用 unknow 这样的名字 。build.gradle(Module:app) 设置productFlavors。xml 中的渠道号占位符${UMENG_CHANNEL_VALUE},这里就是要动态的替换占位符的内容,配置信息如下:

    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"]
            }
        }
    }
    

    5.执行打包命令

    gradlew clean
    gradlew assembleRelease
    

    3.sycn project一下再打包即可,Build-->Generate signed APK,Flavors中多选,选择需要的渠道

    5.完成,注意生成目录

    6.隐藏签名信息

    签名信息这种东西属于私密的信息,应该保护起来,最好不要明文写到 build.gradle 里,更不要上传到代码仓库中去。应该放在单独的文件中,在 build.gradle 里去引用这个文件读取签名信息。

    清空 signingConfigs
    // TODO

    7.跟踪打包过程

    建议在命令后面加上 --stacktrace 参数,这样万一命令执行失败,可以看到详细的出错信息

    gradlew clean --stacktrace
    gradlew assembleRelease --stacktrace
    

    8.定制 apk 的文件名:app_版本名称_版本号_日期_渠道号.apk

    def packageTime() {
        return new Date().format("yyyyMMdd-HHmmss", TimeZone.getTimeZone("UTC"))
    }
    
    android {
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                // 重命名产出的apk文件
                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}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
                    } else {
                        fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
                    }
                    output.outputFile = new File(outputDirectory, fileName)
                }
            }
        }
    }
    

    输出的目录:app/build/outputs/apk

    9.删除冗余的unaligned apk文件

    在 app/build/outputs/apk 文件夹中,可以看到一些文件名末尾带有 unaligned 文字的冗余文件,这些文件没有用,可以删掉,只需要在 build.gradle 中添加下列命令就好了

    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // 重命名产出的apk文件
            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}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
                }
                output.outputFile = new File(outputDirectory, fileName)
            }
    
            // 删除unaligned apk
            if (output.zipAlign != null) {
                output.zipAlign.doLast {
                    output.zipAlign.inputFile.delete()
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Gradle 多渠道打包

          本文链接:https://www.haomeiwen.com/subject/ydyvpttx.html