diff options
author | Raphaël Cotty <raphael.cotty@gmail.com> | 2020-10-13 15:38:08 +0200 |
---|---|---|
committer | Raphaël Cotty <raphael.cotty@gmail.com> | 2020-10-21 07:40:09 +0000 |
commit | 2f5f049ecf777bcfcbfe4a17af72768248f73eab (patch) | |
tree | 9e3d27c2a21c37e16de52c89db9b367cb2c76fd4 | |
parent | eb7adb8d9787dddef89e46f7bf6e594d0b5faf4b (diff) | |
download | qbs-2f5f049ecf777bcfcbfe4a17af72768248f73eab.tar.gz |
Android: Update for Qt 5.15
Use java.additionalClassPaths property to allow compilation of binding classes
because starting with Qt 5.15 they depend on QtAndroid.jar
Update AndroidManifest.xml with uses-sdk node using new properties Android.sdk.minVersion
and Android.sdk.targetVersion because Qt 5.15 uses androiddeployqt to set it.
Fixes: QBS-1580
Change-Id: I2fa5e77bb183be1b55e9dd9756fb7b6eb1f3c9d4
Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r-- | doc/reference/modules/android-sdk-module.qdoc | 16 | ||||
-rw-r--r-- | share/qbs/module-providers/Qt/templates/android_support.qbs | 4 | ||||
-rw-r--r-- | share/qbs/modules/Android/sdk/sdk.qbs | 16 | ||||
-rw-r--r-- | src/lib/corelib/jsextensions/process.cpp | 4 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxandroid.cpp | 73 |
5 files changed, 71 insertions, 42 deletions
diff --git a/doc/reference/modules/android-sdk-module.qdoc b/doc/reference/modules/android-sdk-module.qdoc index 676eaa825..af68aca1f 100644 --- a/doc/reference/modules/android-sdk-module.qdoc +++ b/doc/reference/modules/android-sdk-module.qdoc @@ -250,3 +250,19 @@ \defaultvalue \c "apk" */ + +/*! + \qmlproperty string Android.sdk::minimumVersion + + Minimum API Level required for the application to run. + + \defaultvalue \c "21" +*/ + +/*! + \qmlproperty string Android.sdk::targetVersion + + API Level that the application targets. + + \defaultvalue \c platformVersion +*/ diff --git a/share/qbs/module-providers/Qt/templates/android_support.qbs b/share/qbs/module-providers/Qt/templates/android_support.qbs index a7eb8fdcf..b1165dab5 100644 --- a/share/qbs/module-providers/Qt/templates/android_support.qbs +++ b/share/qbs/module-providers/Qt/templates/android_support.qbs @@ -53,6 +53,10 @@ Module { java._tagJniHeaders: false // prevent rule cycle } Properties { + condition: _enableSdkSupport && Utilities.versionCompare(version, "5.15") >= 0 + java.additionalClassPaths: [FileInfo.joinPaths(_qtInstallDir, "jar", "QtAndroid.jar")] + } + Properties { condition: _enableNdkSupport && (Android.ndk.abi === "armeabi-v7a" || Android.ndk.abi === "x86") cpp.defines: "ANDROID_HAS_WSTRING" } diff --git a/share/qbs/modules/Android/sdk/sdk.qbs b/share/qbs/modules/Android/sdk/sdk.qbs index 31f3ed465..563483410 100644 --- a/share/qbs/modules/Android/sdk/sdk.qbs +++ b/share/qbs/modules/Android/sdk/sdk.qbs @@ -67,6 +67,8 @@ Module { property int buildToolsVersionMinor: buildToolsVersionParts[1] property int buildToolsVersionPatch: buildToolsVersionParts[2] property string platform: sdkProbe.platform + property string minimumVersion: "21" + property string targetVersion: platformVersion.toString() property path bundletoolFilePath: bundletoolProbe.filePath @@ -337,6 +339,20 @@ Module { } } + var usedSdkElem = rootElem.firstChild("uses-sdk"); + if (!usedSdkElem || !usedSdkElem.isElement()) { + usedSdkElem = manifestData.createElement("uses-sdk"); + rootElem.appendChild(usedSdkElem); + } else { + if (!usedSdkElem.isElement()) + throw "Tag uses-sdk is not an element in '" + input.filePath + "'."; + } + usedSdkElem.setAttribute("android:minSdkVersion", + product.Android.sdk.minimumVersion); + usedSdkElem.setAttribute("android:targetSdkVersion", + product.Android.sdk.targetVersion); + + rootElem.appendChild(usedSdkElem); manifestData.save(output.filePath, 4); } return cmd; diff --git a/src/lib/corelib/jsextensions/process.cpp b/src/lib/corelib/jsextensions/process.cpp index 064297a32..a91084b4a 100644 --- a/src/lib/corelib/jsextensions/process.cpp +++ b/src/lib/corelib/jsextensions/process.cpp @@ -213,8 +213,8 @@ int Process::exec(const QString &program, const QStringList &arguments, bool thr } else if (m_qProcess->exitStatus() == QProcess::CrashExit || m_qProcess->exitCode() != 0) { QString errorMessage = m_qProcess->error() == QProcess::Crashed ? Tr::tr("Error running '%1': %2").arg(program, m_qProcess->errorString()) - : Tr::tr("Process '%1' finished with exit code %2.").arg(program).arg( - m_qProcess->exitCode()); + : Tr::tr("Process '%1 %2' finished with exit code %3.").arg(program). + arg(arguments.join(QStringLiteral(" "))).arg(m_qProcess->exitCode()); const QString stdOut = readStdOut(); if (!stdOut.isEmpty()) errorMessage.append(Tr::tr(" The standard output was:\n")).append(stdOut); diff --git a/tests/auto/blackbox/tst_blackboxandroid.cpp b/tests/auto/blackbox/tst_blackboxandroid.cpp index 95e9997bc..11fdf787e 100644 --- a/tests/auto/blackbox/tst_blackboxandroid.cpp +++ b/tests/auto/blackbox/tst_blackboxandroid.cpp @@ -214,17 +214,15 @@ void TestBlackboxAndroid::android_data() const QByteArray path = "lib/${ARCH}/"; return path + (usesClang ? "libc++_shared.so" : oldcxxLib); }; - bool usingOldQt = true; + qbs::Version version(5, 13); QStringList qmakeFilePaths = pQt.value(QStringLiteral("moduleProviders.Qt.qmakeFilePaths")). toStringList(); - if (qmakeFilePaths.size() == 1) { - qbs::Version version = TestBlackboxBase::qmakeVersion(qmakeFilePaths[0]); - if (version.isValid() && version >= qbs::Version(5, 14)) - usingOldQt = false; - } + if (qmakeFilePaths.size() == 1) + version = TestBlackboxBase::qmakeVersion(qmakeFilePaths[0]); + bool singleArchQt = (version < qbs::Version(5, 14)); QByteArrayList archsForQt; - if (usingOldQt) { + if (singleArchQt) { archsForQt = { pQt.value("qbs.architecture").toString().toUtf8() }; if (archsStringList.empty()) archsStringList << QStringLiteral("armv7a"); // must match default in common.qbs @@ -294,7 +292,7 @@ void TestBlackboxAndroid::android_data() auto qtAppExpectedFiles = [&](bool generateAab) { QByteArrayList expectedFile; - if (usingOldQt) { + if (singleArchQt) { expectedFile << commonFiles(generateAab) + expandArchs(ndkArchsForQt, { cxxLibPath("libgnustl_shared.so", true), "assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list", @@ -418,7 +416,7 @@ void TestBlackboxAndroid::android_data() << enableAapt2 << generateAab << isIncrementalBuild; auto qmlAppExpectedFiles = [&](bool generateAab) { QByteArrayList expectedFile; - if (usingOldQt) { + if (singleArchQt) { expectedFile << commonFiles(generateAab) + expandArchs(ndkArchsForQt, { "assets/--Added-by-androiddeployqt--/qml/QtQuick.2/plugins.qmltypes", "assets/--Added-by-androiddeployqt--/qml/QtQuick.2/qmldir", @@ -487,11 +485,18 @@ void TestBlackboxAndroid::android_data() "lib/${ARCH}/libQt5Gui_${ARCH}.so", "lib/${ARCH}/libQt5Network_${ARCH}.so", "lib/${ARCH}/libQt5Qml_${ARCH}.so", - "lib/${ARCH}/libQt5QuickParticles_${ARCH}.so", "lib/${ARCH}/libQt5Quick_${ARCH}.so", "lib/${ARCH}/libQt5QmlModels_${ARCH}.so", "lib/${ARCH}/libQt5QmlWorkerScript_${ARCH}.so", "lib/${ARCH}/libqmlapp_${ARCH}.so"}, generateAab); + if (version >= qbs::Version(5, 15)) + expectedFile << expandArchs(ndkArchsForQt, { + "lib/${ARCH}/libQt5RemoteObjects_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_RemoteObjects_qtqmlremoteobjects_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_StateMachine_qtqmlstatemachine_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_WorkerScript.2_workerscriptplugin_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_Models.2_modelsplugin_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_qmlplugin_${ARCH}.so"}, generateAab); } if (generateAab) expectedFile << "base/resources.pb" << "base/assets.pb" << "base/native.pb"; @@ -502,7 +507,7 @@ void TestBlackboxAndroid::android_data() auto qmlAppMinistroExpectedFiles = [&](bool generateAab) { QByteArrayList expectedFile; - if (usingOldQt) { + if (singleArchQt) { expectedFile << commonFiles(generateAab) + expandArchs(ndkArchsForQt, { "assets/--Added-by-androiddeployqt--/qt_cache_pregenerated_file_list", cxxLibPath("libgnustl_shared.so", true), @@ -521,7 +526,7 @@ void TestBlackboxAndroid::android_data() }; auto qmlAppCustomMetaDataExpectedFiles = [&](bool generateAab) { QByteArrayList expectedFile; - if (usingOldQt) { + if (singleArchQt) { expectedFile << commonFiles(generateAab) + expandArchs(ndkArchsForQt, { "assets/--Added-by-androiddeployqt--/qml/QtQuick.2/plugins.qmltypes", "assets/--Added-by-androiddeployqt--/qml/QtQuick.2/qmldir", @@ -592,11 +597,18 @@ void TestBlackboxAndroid::android_data() "lib/${ARCH}/libQt5Gui_${ARCH}.so", "lib/${ARCH}/libQt5Network_${ARCH}.so", "lib/${ARCH}/libQt5Qml_${ARCH}.so", - "lib/${ARCH}/libQt5QuickParticles_${ARCH}.so", "lib/${ARCH}/libQt5Quick_${ARCH}.so", "lib/${ARCH}/libQt5QmlModels_${ARCH}.so", "lib/${ARCH}/libQt5QmlWorkerScript_${ARCH}.so", "lib/${ARCH}/libqmlapp_${ARCH}.so"}, generateAab); + if (version >= qbs::Version(5, 15)) + expectedFile << expandArchs(ndkArchsForQt, { + "lib/${ARCH}/libQt5RemoteObjects_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_RemoteObjects_qtqmlremoteobjects_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_StateMachine_qtqmlstatemachine_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_WorkerScript.2_workerscriptplugin_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_Models.2_modelsplugin_${ARCH}.so", + "lib/${ARCH}/libqml_QtQml_qmlplugin_${ARCH}.so"}, generateAab); } if (generateAab) expectedFile << "base/resources.pb" << "base/assets.pb" << "base/native.pb"; @@ -605,7 +617,7 @@ void TestBlackboxAndroid::android_data() return expectedFile; }; QStringList qmlAppCustomProperties; - if (usingOldQt) { + if (singleArchQt) { qmlAppCustomProperties = QStringList{"modules.Android.sdk.automaticSources:false", "modules.qbs.architecture:" + archsForQt.first()}; } else { @@ -701,30 +713,6 @@ void TestBlackboxAndroid::android_data() isIncrementalBuild = false; enableAapt2 = false; generateAab = false; - QTest::newRow("no native") - << "no-native" - << QStringList("com.example.android.basicmediadecoder") - << (QList<QByteArrayList>() << commonFiles(generateAab) + expandArchs(archs, { - "resources.arsc", - "res/drawable-hdpi-v4/ic_action_play_disabled.png", - "res/drawable-hdpi-v4/ic_action_play.png", - "res/drawable-hdpi-v4/ic_launcher.png", - "res/drawable-hdpi-v4/tile.9.png", - "res/drawable-mdpi-v4/ic_action_play_disabled.png", - "res/drawable-mdpi-v4/ic_action_play.png", - "res/drawable-mdpi-v4/ic_launcher.png", - "res/drawable/selector_play.xml", - "res/drawable-xhdpi-v4/ic_action_play_disabled.png", - "res/drawable-xhdpi-v4/ic_action_play.png", - "res/drawable-xhdpi-v4/ic_launcher.png", - "res/drawable-xxhdpi-v4/ic_launcher.png", - "res/layout/sample_main.xml", - "res/menu/action_menu.xml", - "res/menu-v11/action_menu.xml", - "res/raw/vid_bigbuckbunny.mp4"}, generateAab)) - << QStringList{aaptVersion(enableAapt2), packageType(generateAab)} - << enableAapt2 << generateAab << isIncrementalBuild; - enableAapt2 = true; auto noNativeExpectedFiles = [&](bool generateAab) { QByteArrayList expectedFile; expectedFile << commonFiles(generateAab) + expandArchs(archs, { @@ -742,8 +730,6 @@ void TestBlackboxAndroid::android_data() "res/drawable-xxhdpi-v4/ic_launcher.png", "res/layout/sample_main.xml", "res/menu/action_menu.xml", - // I have no idea why this file is generated with aapt and not with aapt2 - //"res/menu-v11/action_menu.xml", "res/raw/vid_bigbuckbunny.mp4"}, generateAab); if (generateAab) expectedFile << "base/resources.pb"; @@ -751,6 +737,13 @@ void TestBlackboxAndroid::android_data() expectedFile << "resources.arsc"; return expectedFile; }; + QTest::newRow("no native") + << "no-native" + << QStringList("com.example.android.basicmediadecoder") + << (QList<QByteArrayList>() << noNativeExpectedFiles(generateAab)) + << QStringList{aaptVersion(enableAapt2), packageType(generateAab)} + << enableAapt2 << generateAab << isIncrementalBuild; + enableAapt2 = true; QTest::newRow("no native aapt2") << "no-native" << QStringList("com.example.android.basicmediadecoder") |