前言

Gradle是Android目前主流的编译工具,Gradle刚出来的时候确实有很多诟病,比如编译速度,那真是一个慢啊,不过随着版本的更新,现在的gradle可比当年牛逼多了,功能也越来越完善,毕竟是谷歌的亲儿子。那么在用Qt 做android开发时候,也是默认使用Gradle来编译,今天主要来看看如何在Qt工程下修改gradle文件并输出多个渠道的apk并自动签名,输出多个渠道apk主要是用于统计每个渠道的安装信息。

正文

在之前写过的这篇文章中:​​Qt for Android创建AndroidManifest.xml和Java类文件​​ 介绍了如何创建AndroidManifest.xml文件,创建后会自动生成gradle的相关文件,如下图:

Qt for Android gradle编译同时输出多个渠道apk_java


在这里我们只需要编辑build.gradle文件即可,双击打开然后修改该文件,添加签名以及将要输出的渠道信息:

buildscript {
repositories {
jcenter()
}

dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
}
}

allprojects {
repositories {
jcenter()
}
}

apply plugin: 'com.android.application'

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}

android {
/*******************************************************
* The following variables:
* - androidBuildToolsVersion,
* - androidCompileSdkVersion
* - qt5AndroidDir - holds the path to qt android files
* needed to build any Qt application
* on Android.
*
* are defined in gradle.properties file. This file is
* updated by QtCreator and androiddeployqt tools.
* Changing them manually might break the compilation!
*******************************************************/

compileSdkVersion androidCompileSdkVersion.toInteger()

buildToolsVersion androidBuildToolsVersion

sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
//res.srcDirs = [qt5AndroidDir + '/res', 'res']
res.srcDirs = ['res']
resources.srcDirs = ['src']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}

lintOptions {
abortOnError false
}

signingConfigs {
release {
storeFile file("xxxxx.keystore")
storePassword "xxxxxx"
keyAlias "xxxxx"
keyPassword "xxxxxx"
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
}
productFlavors {
yingyongbao {
manifestPlaceholders = [ CHANNEL_NAME:"YingYongBao" ]
}
wandoujia {
manifestPlaceholders = [ CHANNEL_NAME:"WanDouJia" ]
}
yingyongbao {
manifestPlaceholders = [ CHANNEL_NAME:"YingYongBao" ]
}
}
}

def releaseTime() {
return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))
}
//这里是修改输出的apk名称
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 = "Demo_${variant.productFlavors[0].name}_${releaseTime()}.apk"
output.outputFile = new File(outputDirectory, fileName)
}
}
}
}

注意,下面就是配置自动签名流程:

 signingConfigs {
release {
storeFile file("xxxxx.keystore")
storePassword "xxxxxx"
keyAlias "xxxxx"
keyPassword "xxxxxx"
}
}

接下来在AndroidManifest.xml文件中添加渠道获取的信息:

<meta-data android:name="CHANNEL" android:value="${CHANNEL_NAME}"/>

Qt for Android gradle编译同时输出多个渠道apk_androidd_02

接着,回到java代码中,添加获取渠道的接口:

public static String getChannel(){
ComponentName componentName = new ComponentName(m_instance,MainActivity.class);
try
{
ActivityInfo info = m_instance.getPackageManager()
.getActivityInfo(componentName,
PackageManager.GET_META_DATA);
String msg =info.metaData.getString("CHANNEL");
return msg;
}catch (Exception e) {
e.printStackTrace();
return "";
}

}

需要导入包:

import android.content.ComponentName;
import android.content.pm.ActivityInfo;

ok,这就能直接获取到每个安装包的渠道名了。