0

问题:我想在 Qt 项目中使用 Android 构建系统(gradle 版本 3),但是这个版本的 gradle(与旧版本 2 相比)会将生成的输出apk文件的位置更改为在下面$buildDir/outputs/apk/debug而不是$buildDir/outputs/apk(添加的debug文件夹),但是当 Qt Android 工具包尝试将应用程序安装到 Android 设备,它只在旧位置查找,并且无法找到 apk 文件。我检查了 Android Studio,它表明 gradle 3 工作正常

旧位置:$build_folder/android-build\build\outputs\apk\my.apk

新地点:$build_folder/android-build\build\outputs\apk\debug\my.apk

错误(编译)

adb:错误:无法统计“D:/Qt/FireBase/build-client01-Android_for_armeabi_v7a_GCC_4_9_Qt_5_11_0_for_Android_armv73-Release/android-build//build/outputs/apk/android-build-debug.apk”:没有这样的文件或目录

仅当我对build.gradleQt 生成的默认值进行更改以将 gradle 设置为版本 3 时,才会出现此问题,默认生成的文件已classpath设置为旧版本2.3.3

老的:classpath 'com.android.tools.build:gradle:2.3.3'

新的 :classpath 'com.android.tools.build:gradle:3.1.0

我所做的其他更改也需要更改gradle-wrapper.properties,这里是更新的文件:

构建.gradle

buildscript {
    repositories {
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }

    dependencies {
        //classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.google.gms:google-services:4.0.1' // google-services plugin
        classpath 'com.android.tools.build:gradle:3.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
        //google() // Google's Maven repository
        maven {
            url "https://maven.google.com"
        }
    }
}

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']
            resources.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
       }
    }

    lintOptions {
        abortOnError false
    }
}

dependencies {
  // ...


    //libfirebase_auth.a
    //libfirebase_app.a
    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.google.firebase:firebase-auth:16.0.2'
    implementation 'com.google.android.gms:play-services-base:15.0.1'

  // Getting a "Could not find" error? Make sure you have
  // added the Google maven respository to your root build.gradle
}
apply plugin: 'com.google.gms.google-services'

gradle-wrapper.properties

#Mon Feb 20 10:43:22 EST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
4

2 回答 2

2

我在 build.gradle 上使用它:

android {
...
    applicationVariants.all { variant ->
        variant.outputs.all {
            outputFileName = "../" + outputFileName
        }
    }
}
于 2018-07-28T04:50:06.847 回答
1

我仍然不知道在哪里以及如何指示 Qt 查看新的输出结构,但作为目前的解决方法,我添加了配置以build.gradle将生成的副本复制apk~/apkQt 查找的位置!

// make a copy of APK from "$buildDir/outputs/apk/debug" back to "$buildDir/outputs/apk"
def archiveBuildTypes = ["release", "debug"];
applicationVariants.all { variant ->
    variant.outputs.all { output ->
        if (variant.buildType.name in archiveBuildTypes) {
            def taskSuffix = variant.name.capitalize()
            def assembleTaskName = "assemble${taskSuffix}"
            if (tasks.findByName(assembleTaskName)) {
                def copyAPKFolderTask = tasks.create(name: "archive${taskSuffix}", type: org.gradle.api.tasks.Copy) {
                    description "copy APK to old folder"
                    def sourceFolder = "$buildDir/outputs/apk/$output.baseName"
                    def destinationFolder = "$buildDir/outputs/apk"
                    print "Copy apk from: $sourceFolder into $destinationFolder\n"
                    from(sourceFolder)
                    into destinationFolder
                    eachFile { file ->
                        file.path = file.name // so we have a "flat" copy
                    }
                    includeEmptyDirs = false
                }
                tasks[assembleTaskName].finalizedBy = [copyAPKFolderTask]
            }
        }
    }
}

更新: gradle 3.1.x至少需要更高androidBuildToolsVersion 27,而 Qt 目前支持不高于androidBuildToolsVersion 26,所以实际上回退到 gradle 3.0.x哪个支持构建工具可能更安全 26

甚至可以回退到gradle 2.3.3(使用compile而不是implementationforFireBase和任何必需的模块:

compile 'com.google.firebase:firebase-core:16.0.1'
...
于 2018-07-27T00:08:34.267 回答