summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaphaël Cotty <raphael.cotty@gmail.com>2020-10-13 15:38:08 +0200
committerRaphaël Cotty <raphael.cotty@gmail.com>2020-10-21 07:40:09 +0000
commit2f5f049ecf777bcfcbfe4a17af72768248f73eab (patch)
tree9e3d27c2a21c37e16de52c89db9b367cb2c76fd4
parenteb7adb8d9787dddef89e46f7bf6e594d0b5faf4b (diff)
downloadqbs-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.qdoc16
-rw-r--r--share/qbs/module-providers/Qt/templates/android_support.qbs4
-rw-r--r--share/qbs/modules/Android/sdk/sdk.qbs16
-rw-r--r--src/lib/corelib/jsextensions/process.cpp4
-rw-r--r--tests/auto/blackbox/tst_blackboxandroid.cpp73
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")