Hi everyone,
I am getting crazy when trying to generate a multi-ABI apk based on a Qt 5.15.2 application, and perhaps this thread may reach someone who faced the same nightmare :-)
TL;DR: I can successfully generate apk for armeabi-v7a and apk for arm64-v8a. Can launch these apks in devices supporting the corresponding architectures with no problem. But I would prefer my ci/cd pipeline to output a single "universal" .apk containing the necessary files of both architectures so that a app can run in a device supporting only armeabi-v7a or in a device supporting only arm64-v8a.
When calling,
qmake app.pro -spec android-clang CONFIG+=qtquickcompiler ANDROID_ABIS="arm64-v8a armeabi-v7a"
the generated android-app-deployment-settings.json has the following content
{
"description": "This file is generated by qmake to be read by androiddeployqt and should not be modified by hand.",
"qt": "/home/lin-deploy/Qt/5.15.2/android",
"sdk": "/home/lin-deploy/Android/Sdk",
"sdkBuildToolsRevision": "35.0.0",
"ndk": "/home/lin-deploy/Android/Sdk/ndk/21.3.6528147",
"toolchain-prefix": "llvm",
"tool-prefix": "llvm",
"ndk-host": "linux-x86_64",
"architectures": {"arm64-v8a":"aarch64-linux-android", "armeabi-v7a":"arm-linux-androideabi"},
"android-extra-plugins": "/home/lin-deploy/Desktop/deploy/1368/android/plugins/5.15.2/arm64-v8a/plugins",
"android-package-source-directory": "/home/lin-deploy/Desktop/deploy/1368/android/app",
"android-min-sdk-version": "21",
"android-target-sdk-version": "28",
"android-extra-libs": "/home/lin-deploy/Desktop/deploy/1368/lib/cryptopp/crypto/bin/android/arm64-v8a/libcrypto.so,/home/lin-deploy/Desktop/deploy/1368/lib/cryptopp/crypto/bin/android/arm64-v8a/libcryptopp_arm64-v8a.so,/home/lin-deploy/Desktop/deploy/1368/lib/cryptopp/crypto/bin/android/arm64-v8a/libssl.so,/home/lin-deploy/Desktop/deploy/1368/lib/Qt5Psql/5.15.2/arm64-v8a/libpq.so,/home/lin-deploy/Desktop/deploy/1368/lib/libssh/bin/android/arm64-v8a/libssh.so",
"qml-root-path": "/home/lin-deploy/Desktop/deploy/1368",
"stdcpp-path": "/home/lin-deploy/Android/Sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/",
"qrcFiles": "/home/lin-deploy/Desktop/deploy/1368/res/resources2.qrc,/home/lin-deploy/Desktop/deploy/1368/res/resources.qrc,/home/lin-deploy/Desktop/deploy/buildApp/app_ui_libs_libs_qmlcache.qrc,/home/lin-deploy/Desktop/deploy/1368/app/ui/fonts/fonts.qrc,/home/lin-deploy/Desktop/deploy/1368/app/ui/images/images.qrc,/home/lin-deploy/Desktop/deploy/buildPocket/app_ui_qml_app_qmlcache.qrc,/home/lin-deploy/Desktop/deploy/1368/app/ui/libs/libs.qrc,/home/lin-deploy/Desktop/deploy/1368/pocket/ui/qml/app.qrc",
"application-binary": "App"
}
after calling make to build, the two targets (armeabi-v7a and arm64-v8a) get built successfully. But due to the lack of armeabi-v7a versions of android-extra-libs in the above mentioned .json file, when executing androiddeployqt, the resulting .apk seems to work only on devices supporting arm64-v8a.
I forced already the inclusion of abiFilters in defaultConfig block of my build.gradle file with no effect
defaultConfig {
resConfig "en"
minSdkVersion = qtMinSdkVersion
targetSdkVersion = qtTargetSdkVersion
ndk{
abiFilters "arm64-v8a", "armeabi-v7a"
}
}
I am defining explicitly the additional libraries that must be deployed per architecture i.e.
equals(QT_ARCH, "armeabi-v7a") {
ANDROID_EXTRA_LIBS = blabla_armeabi-v7a.so
ANDROID_EXTRA_PLUGINS += $$_PRO_FILE_PWD_/android/plugins/$$QT_VERSION/armeabi-v7a/plugins
}
equals(QT_ARCH, "arm64-v8a") {
ANDROID_EXTRA_LIBS = blabla_arm64-v8a.so
ANDROID_EXTRA_PLUGINS += $$_PRO_FILE_PWD_/android/plugins/$$QT_VERSION/arm64-v8a/plugins
}
This approach is working perfectly when deploying separate apks for each architecture, but no matter what I do it looks like arm64-v8a overrides everything in the process of generating the android-app-deployment-settings.json. I even swapped the order of the ABIS in the qmake call (arm64-v8a followed by armeabi-v7a) in order to test this possibility, but the resulting .json file would list arm64-v8a extra libs and plugins only.
Did anyone successfully build AND DEPLOY a multi-abi apk using Qt 5.15.2? Any recomendation on how to tweak the .json so that androiddeployqt can make sense of it and generate the expected multi-abi apk with appropriate libs hierarchy and AndroidManifest?
Thank you so much!