Qt Android выходной apk, сгенерированный в ~/android-build\build\output \apk\debug
Проблема: я хочу использовать систему сборки Android (версия 3 Gradle) с проектом Qt, но эта версия Gradle (по сравнению со старой версией 2) изменит местоположение сгенерированного вывода apk
файл находиться под $buildDir/outputs/apk/debug
вместо $buildDir/outputs/apk
(добавлено debug
папку), но когда Qt Android kit пытается установить приложение на устройство 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-deb:
Эта проблема возникает только когда я делаю изменения по умолчанию build.gradle
сгенерированный Qt для установки 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
, вот обновленные файлы:
build.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
2 ответа
Я использую это на моем build.gradle:
android {
...
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "../" + outputFileName
}
}
}
Я до сих пор не знаю, где и как проинструктировать Qt изучить новую структуру вывода, но в качестве временного решения я добавил конфигурацию в build.gradle
сделать копию сгенерированного apk
вернуться к ~/apk
где Qt ищет!
// 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
вместо implementation
за FireBase
и любые необходимые модули:compile 'com.google.firebase:firebase-core:16.0.1'
...