天天看点

Gradle 多渠道打包

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.配置签名信息

app

module

中的

build.gradle

添加下列信息:别名、别名密码、签名文件地址和签名密码

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

3.设置

buildTypes

的签名配置

因为要打

release

包,所以需要设置

buildTypes

release

的签名配置,如下

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()
            }
        }
    }
}
           

继续阅读