diff --git a/AddQtAndroidApk.cmake b/AddQtAndroidApk.cmake index 4f4e05b..14fae30 100644 --- a/AddQtAndroidApk.cmake +++ b/AddQtAndroidApk.cmake @@ -71,6 +71,16 @@ macro(add_qt_android_apk TARGET SOURCE_TARGET) # extract the full path of the source target binary set(QT_ANDROID_APP_PATH "$") # full file path to the app's main shared library + if(${Qt5Core_VERSION} VERSION_GREATER_EQUAL 5.14) + set(QT_ANDROID_SUPPORT_MULTI_ABI ON) + endif() + + if(QT_ANDROID_SUPPORT_MULTI_ABI) + # qtandroideploy will append by itself the ANDROID_ABI to the target name + set(QT_ANDROID_APPLICATION_BINARY "${SOURCE_TARGET}") + else() + set(QT_ANDROID_APPLICATION_BINARY ${QT_ANDROID_APP_PATH}) + endif() # define the application name if(ARG_NAME) @@ -155,22 +165,35 @@ macro(add_qt_android_apk TARGET SOURCE_TARGET) message(WARNING "Failed to determine ANDROID_STL_PREFIX value for ANDROID_STL=${ANDROID_STL}") endif() - # define the STL shared library path - # up until NDK r18, ANDROID_STL_SHARED_LIBRARIES is populated by the NDK's toolchain file - # since NDK r19, the only option for a shared STL library is libc++_shared - if(ANDROID_STL_SHARED_LIBRARIES) - list(GET ANDROID_STL_SHARED_LIBRARIES 0 STL_LIBRARY_NAME) # we can only give one to androiddeployqt - if(ANDROID_STL_PATH) - set(QT_ANDROID_STL_PATH "${ANDROID_STL_PATH}/libs/${ANDROID_ABI}/lib${ANDROID_STL}.so") - else() - set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/lib${ANDROID_STL}.so") - endif() - elseif(ANDROID_STL STREQUAL c++_shared) - set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/libc++_shared.so") + if(QT_ANDROID_SUPPORT_MULTI_ABI) + # from Qt 5.14 qtandroideploy will find the correct stl. + set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs") else() - message(WARNING "ANDROID_STL (${ANDROID_STL}) isn't a known shared stl library." - "You should consider setting ANDROID_STL to c++_shared (like Qt).") - set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/libc++_shared.so") + # define the STL shared library path + # up until NDK r18, ANDROID_STL_SHARED_LIBRARIES is populated by the NDK's toolchain file + # since NDK r19, the only option for a shared STL library is libc++_shared + if(ANDROID_STL_SHARED_LIBRARIES) + list(GET ANDROID_STL_SHARED_LIBRARIES 0 STL_LIBRARY_NAME) # we can only give one to androiddeployqt + if(ANDROID_STL_PATH) + set(QT_ANDROID_STL_PATH "${ANDROID_STL_PATH}/libs/${ANDROID_ABI}/lib${ANDROID_STL}.so") + else() + set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/lib${ANDROID_STL}.so") + endif() + elseif(ANDROID_STL STREQUAL c++_shared) + set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/libc++_shared.so") + else() + message(WARNING "ANDROID_STL (${ANDROID_STL}) isn't a known shared stl library." + "You should consider setting ANDROID_STL to c++_shared (like Qt).") + set(QT_ANDROID_STL_PATH "${QT_ANDROID_NDK_ROOT}/sources/cxx-stl/${ANDROID_STL_PREFIX}/libs/${ANDROID_ABI}/libc++_shared.so") + endif() + endif() + + # From Qt 5.14 qtandroideploy "target-architecture" is no longer valid in input file + # It have been replaced by "architectures": { "${ANDROID_ABI}": "${ANDROID_ABI}" } + # This allow to package multiple ABI in a single apk + # For now we only support single ABI build with this script (to ensure it work with Qt5.14 & Qt5.15) + if(QT_ANDROID_SUPPORT_MULTI_ABI) + set(QT_ANDROID_ARCHITECTURES "\"${ANDROID_ABI}\":\"${ANDROID_ABI}\"") endif() # set the list of dependant libraries diff --git a/AndroidManifest.xml.in b/AndroidManifest.xml.in index 02ba232..3acafbb 100644 --- a/AndroidManifest.xml.in +++ b/AndroidManifest.xml.in @@ -4,6 +4,7 @@ android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="@QT_ANDROID_APP_VERSION_CODE@"> + @@ -18,6 +19,10 @@ + + + + @@ -25,17 +30,21 @@ - - + - + - + + + + + + diff --git a/build.gradle.in b/build.gradle.in index c3c7250..21fc729 100644 --- a/build.gradle.in +++ b/build.gradle.in @@ -54,8 +54,13 @@ android { lintOptions { abortOnError false } + + // Do not compress Qt binary resources file + aaptOptions { + noCompress 'rcc' + } + defaultConfig { - minSdkVersion 16 - targetSdkVersion @QT_ANDROID_NATIVE_API_LEVEL@ + resConfigs "en" } } diff --git a/qtdeploy.json.in b/qtdeploy.json.in index 3a1f9b6..00fbd52 100644 --- a/qtdeploy.json.in +++ b/qtdeploy.json.in @@ -8,8 +8,11 @@ "tool-prefix": "@QT_ANDROID_TOOL_PREFIX@", "toolchain-version": "@QT_ANDROID_TOOLCHAIN_VERSION@", "ndk-host": "@ANDROID_NDK_HOST_SYSTEM_NAME@", + "architectures": { + @QT_ANDROID_ARCHITECTURES@ + }, "target-architecture": "@ANDROID_ABI@", - "application-binary": "@QT_ANDROID_APP_PATH@", + "application-binary": "@QT_ANDROID_APPLICATION_BINARY@", "android-package": "@QT_ANDROID_APP_PACKAGE_NAME@", "android-app-name": "@QT_ANDROID_APP_NAME@", "qml-root-path": "@CMAKE_SOURCE_DIR@",