版权声明:支持原创,转载请说明~ https://blog.csdn.net/luoyayun361/article/details/84563946
前言
Gradle是Android目前主流的编译工具,Gradle刚出来的时候确实有很多诟病,比如编译速度,那真是一个慢啊,不过随着版本的更新,现在的gradle可比当年牛逼多了,功能也越来越完善,毕竟是谷歌的亲儿子。那么在用Qt 做android开发时候,也是默认使用Gradle来编译,今天主要来看看如何在Qt工程下修改gradle文件并输出多个渠道的apk并自动签名,输出多个渠道apk主要是用于统计每个渠道的安装信息。
正文
在之前写过的这篇文章中:Qt for Android创建AndroidManifest.xml和Java类文件 介绍了如何创建AndroidManifest.xml文件,创建后会自动生成gradle的相关文件,如下图:
在这里我们只需要编辑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}"/>
接着,回到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,这就能直接获取到每个安装包的渠道名了。