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

版权声明:支持原创,转载请说明~ 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,这就能直接获取到每个安装包的渠道名了。

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/84563946