diff options
-rw-r--r-- | cmake/QtPlatformAndroid.cmake | 18 | ||||
-rw-r--r-- | src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java | 73 | ||||
-rw-r--r-- | src/android/templates/doc/src/android-manifest-file-configuration.qdoc | 17 | ||||
-rw-r--r-- | src/android/templates/res/values/libs.xml | 1 | ||||
-rw-r--r-- | src/corelib/Qt6AndroidMacros.cmake | 8 | ||||
-rw-r--r-- | src/corelib/doc/src/cmake/cmake-properties.qdoc | 39 | ||||
-rw-r--r-- | src/corelib/kernel/qcoreapplication.cpp | 3 | ||||
-rw-r--r-- | src/tools/androiddeployqt/doc/src/androiddeployqt.qdoc | 26 | ||||
-rw-r--r-- | src/tools/androiddeployqt/main.cpp | 99 |
9 files changed, 224 insertions, 60 deletions
diff --git a/cmake/QtPlatformAndroid.cmake b/cmake/QtPlatformAndroid.cmake index 6e07477332..a14c5626b3 100644 --- a/cmake/QtPlatformAndroid.cmake +++ b/cmake/QtPlatformAndroid.cmake @@ -163,6 +163,24 @@ define_property(TARGET "This variable points to the path of the deployment settings JSON file, which holds properties required by androiddeployqt to package the Android app." ) +define_property(TARGET + PROPERTY + QT_ANDROID_SYSTEM_LIBS_PREFIX + BRIEF_DOCS + "This variable is used to specify a path to Qt libraries on the target device in Android." + FULL_DOCS + "This variable can be used to provide a custom system library path to use for library loading lookup on Android. This is necessary when using Qt libraries installed outside an app's default native (JNI) library directory." +) + +define_property(TARGET + PROPERTY + QT_ANDROID_NO_DEPLOY_QT_LIBS + BRIEF_DOCS + "This variable is used to control whether Qt libraries should be deployed inside the APK on Android." + FULL_DOCS + "This variable can be used to exclude Qt shared libraries from being packaged inside the APK when deploying on Android. Not supported when deploying as Android Application Bundle." +) + # Returns test execution arguments for Android targets function(qt_internal_android_test_arguments target out_test_runner out_test_arguments) set(${out_test_runner} "${QT_HOST_PATH}/${QT${PROJECT_VERSION_MAJOR}_HOST_INFO_BINDIR}/androidtestrunner" PARENT_SCOPE) diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java index 81304e23f6..66ba029ace 100644 --- a/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java +++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtLoader.java @@ -76,7 +76,6 @@ public abstract class QtLoader { // These parameters matter in case of deploying application as system (embedded into firmware) public static final String SYSTEM_LIB_PATH = "/system/lib/"; - public String[] SYSTEM_APP_PATHS = {"/system/priv-app/", "/system/app/"}; public String APPLICATION_PARAMETERS = null; // use this variable to pass any parameters to your application, // the parameters must not contain any white spaces @@ -255,33 +254,40 @@ public abstract class QtLoader { if (useLocalLibs == 1) { ArrayList<String> libraryList = new ArrayList<>(); - - boolean apkDeployFromSystem = false; - String apkPath = m_context.getApplicationInfo().publicSourceDir; - File apkFile = new File(apkPath); - if (apkFile.exists()) { - for (String systemAppPath : SYSTEM_APP_PATHS) { - apkDeployFromSystem = apkFile.getAbsolutePath().startsWith(systemAppPath); - if (apkDeployFromSystem) - break; - } - } - String libsDir = null; String bundledLibsDir = null; - if (apkDeployFromSystem) { - String systemLibsPrefix = SYSTEM_LIB_PATH; - if (m_contextInfo.metaData.containsKey("android.app.system_libs_prefix")) { - systemLibsPrefix = m_contextInfo.metaData.getString("android.app.system_libs_prefix"); + + id = resources.getIdentifier("bundle_local_qt_libs", "string", packageName); + final int bundleLocalLibs = Integer.parseInt(resources.getString(id)); + if (bundleLocalLibs == 0) { + String systemLibsPrefix; + final String systemLibsKey = "android.app.system_libs_prefix"; + // First check if user has provided system libs prefix in AndroidManifest + if (m_contextInfo.applicationInfo.metaData != null && + m_contextInfo.applicationInfo.metaData.containsKey(systemLibsKey)) { + systemLibsPrefix = m_contextInfo.applicationInfo.metaData.getString(systemLibsKey); } else { - Log.e(QtApplication.QtTAG, "It looks like app deployed as system app. " - + "It may be necessary to specify path to system lib directory using " - + "android.app.system_libs_prefix metadata variable in your AndroidManifest.xml"); + // If not, check if it's provided by androiddeployqt in libs.xml + id = resources.getIdentifier("system_libs_prefix","string", + packageName); + systemLibsPrefix = resources.getString(id); + } + if (systemLibsPrefix.isEmpty()) { + systemLibsPrefix = SYSTEM_LIB_PATH; + Log.e(QtApplication.QtTAG, "It looks like app deployed using Unbundled " + + "deployment. It may be necessary to specify path to directory " + + "where Qt libraries are installed using either " + + "android.app.system_libs_prefix metadata variable in your " + + "AndroidManifest.xml or QT_ANDROID_SYSTEM_LIBS_PATH in your " + + "CMakeLists.txt"); Log.e(QtApplication.QtTAG, "Using " + SYSTEM_LIB_PATH + " as default path"); } + File systemLibraryDir = new File(systemLibsPrefix); - if (systemLibraryDir.exists() && systemLibraryDir.isDirectory() && systemLibraryDir.list().length > 0) { + if (systemLibraryDir.exists() && systemLibraryDir.isDirectory() + && systemLibraryDir.list().length > 0) { libsDir = systemLibsPrefix; + bundledLibsDir = systemLibsPrefix; } else { Log.e(QtApplication.QtTAG, "System library directory " + systemLibsPrefix @@ -300,7 +306,7 @@ public abstract class QtLoader { } } - if (apkDeployFromSystem && libsDir == null) + if (libsDir == null) throw new Exception(""); @@ -310,20 +316,17 @@ public abstract class QtLoader { libraryList.add(libPrefix + lib + ".so"); } - id = resources.getIdentifier("bundle_local_qt_libs", "string", packageName); - final int bundleLocalLibs = Integer.parseInt(resources.getString(id)); - - if (bundleLocalLibs == 1) { - id = resources.getIdentifier("load_local_libs", "array", packageName); - ArrayList<String> localLibs = prefferedAbiLibs(resources.getStringArray(id)); - for (String libs : localLibs) { - for (String lib : libs.split(":")) { - if (!lib.isEmpty()) - libraryList.add(libsDir + lib); - } + id = resources.getIdentifier("load_local_libs", "array", packageName); + ArrayList<String> localLibs = prefferedAbiLibs(resources.getStringArray(id)); + for (String libs : localLibs) { + for (String lib : libs.split(":")) { + if (!lib.isEmpty()) + libraryList.add(libsDir + lib); } - if (bundledLibsDir != null) - ENVIRONMENT_VARIABLES += "\tQT_BUNDLED_LIBS_PATH=" + bundledLibsDir; + } + if (bundledLibsDir != null) { + ENVIRONMENT_VARIABLES += "\tQT_PLUGIN_PATH=" + bundledLibsDir; + ENVIRONMENT_VARIABLES += "\tQML_PLUGIN_PATH=" + bundledLibsDir; } Bundle loaderParams = new Bundle(); diff --git a/src/android/templates/doc/src/android-manifest-file-configuration.qdoc b/src/android/templates/doc/src/android-manifest-file-configuration.qdoc index f1ceee9205..c784040f45 100644 --- a/src/android/templates/doc/src/android-manifest-file-configuration.qdoc +++ b/src/android/templates/doc/src/android-manifest-file-configuration.qdoc @@ -145,7 +145,7 @@ The following is a list of such meta-data defined by Qt: \table \header - \li meta-data name + \li Meta-data Name \li Description \row \target android.app.lib_name @@ -199,11 +199,23 @@ The following is a list of such meta-data defined by Qt: by the app. For more information, see \l {QNativeInterface::}{QAndroidApplication::hideSplashScreen()}. +\endtable + +\section2 Application Specific Meta-data + +Some meta-data attributes are application-wide, and should be placed under +the \c <application> section: + +\table +\header + \li Meta-data Name + \li Description \row \target android.app.system_libs_prefix \li android.app.system_libs_prefix \li Specifies a custom system library path to use for library loading lookup. - This is necessary when running as a system app. + This is necessary when using Qt libraries installed outside an app's + default native (JNI) library directory. The default value is \c {/system/lib/}. \endtable @@ -216,7 +228,6 @@ The main ones are: \li \l {android.app.lib_name} \li \l {android.app.background_running} \li \l {android.app.arguments} - \li \l {android.app.system_libs_prefix} \endlist \section2 Qt Permissions and Features diff --git a/src/android/templates/res/values/libs.xml b/src/android/templates/res/values/libs.xml index beb15ca1d8..fe63866f72 100644 --- a/src/android/templates/res/values/libs.xml +++ b/src/android/templates/res/values/libs.xml @@ -17,4 +17,5 @@ <string name="static_init_classes"><!-- %%INSERT_INIT_CLASSES%% --></string> <string name="use_local_qt_libs"><!-- %%USE_LOCAL_QT_LIBS%% --></string> <string name="bundle_local_qt_libs"><!-- %%BUNDLE_LOCAL_QT_LIBS%% --></string> + <string name="system_libs_prefix"><!-- %%SYSTEM_LIBS_PREFIX%% --></string> </resources> diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake index 6804b942c2..cf996ebb4c 100644 --- a/src/corelib/Qt6AndroidMacros.cmake +++ b/src/corelib/Qt6AndroidMacros.cmake @@ -214,6 +214,10 @@ function(qt6_android_generate_deployment_settings target) _qt_internal_add_android_deployment_multi_value_property(file_contents "android-extra-libs" ${target} "_qt_android_native_extra_libs" ) + # Alternative path to Qt libraries on target device + _qt_internal_add_android_deployment_property(file_contents "android-system-libs-prefix" + ${target} "QT_ANDROID_SYSTEM_LIBS_PREFIX") + # package source dir _qt_internal_add_android_deployment_property(file_contents "android-package-source-directory" ${target} "_qt_android_native_package_source_dir") @@ -234,6 +238,10 @@ function(qt6_android_generate_deployment_settings target) _qt_internal_add_android_deployment_property(file_contents "android-target-sdk-version" ${target} "QT_ANDROID_TARGET_SDK_VERSION") + # should Qt shared libs be excluded from deployment + _qt_internal_add_android_deployment_property(file_contents "android-no-deploy-qt-libs" + ${target} "QT_ANDROID_NO_DEPLOY_QT_LIBS") + # App binary string(APPEND file_contents " \"application-binary\": \"${target_output_name}\",\n") diff --git a/src/corelib/doc/src/cmake/cmake-properties.qdoc b/src/corelib/doc/src/cmake/cmake-properties.qdoc index 9f2e2aed75..bbb948aec2 100644 --- a/src/corelib/doc/src/cmake/cmake-properties.qdoc +++ b/src/corelib/doc/src/cmake/cmake-properties.qdoc @@ -297,6 +297,45 @@ and overwritten by that command. */ /*! +\page cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX.html +\ingroup cmake-properties-qtcore +\ingroup cmake-target-properties-qtcore + +\title QT_ANDROID_SYSTEM_LIBS_PREFIX +\target cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX + +\summary {Specifies the location of Qt libraries on the target device.} + +\preliminarycmakeproperty +\cmakepropertyandroidonly + +This property can be set to provide a path to Qt libraries on the target device, +when those libraries are installed outside app's native (JNI) library directory. +*/ + +/*! +\page cmake-target-property-QT_ANDROID_NO_DEPLOY_QT_LIBS.html +\ingroup cmake-properties-qtcore +\ingroup cmake-target-properties-qtcore + +\title QT_ANDROID_NO_DEPLOY_QT_LIBS +\target cmake-target-property-QT_ANDROID_NO_DEPLOY_QT_LIBS + +\summary {Whether Qt shared libraries are packaged in the APK on Android.} + +\preliminarycmakeproperty +\cmakepropertyandroidonly + +This property can be set to not package Qt shared libraries inside the APK when +deploying the target. Use +\l{cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX}{QT_ANDROID_SYSTEM_LIBS_PREFIX} +to provide a path to where those libraries will be located on the target device +instead. + +\note Only supported when deploying as an APK. +*/ + +/*! \page cmake-target-property-qt_no_entrypoint.html \ingroup cmake-properties-qtcore \ingroup cmake-target-properties-qtcore diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index ca6f55f476..9937e018f6 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -2733,9 +2733,6 @@ QStringList QCoreApplication::libraryPathsLocked() } }; setPathsFromEnv(qEnvironmentVariable("QT_PLUGIN_PATH")); -#ifdef Q_OS_ANDROID - setPathsFromEnv(qEnvironmentVariable("QT_BUNDLED_LIBS_PATH")); -#endif #ifdef Q_OS_DARWIN // Check the main bundle's PlugIns directory as this is a standard location for Apple OSes. // Note that the QLibraryInfo::PluginsPath below will coincidentally be the same as this value diff --git a/src/tools/androiddeployqt/doc/src/androiddeployqt.qdoc b/src/tools/androiddeployqt/doc/src/androiddeployqt.qdoc index 04340257ce..8230d3a398 100644 --- a/src/tools/androiddeployqt/doc/src/androiddeployqt.qdoc +++ b/src/tools/androiddeployqt/doc/src/androiddeployqt.qdoc @@ -72,6 +72,32 @@ \li \c{--deployment <mechanism>} \li Specify this to pick a different deployment mechanism than the default. + \list + \li \c Bundled: includes all the app's dependencies inside + the APK. + \li \c Unbundled: excludes native libraries from the APK. + The libraries are expected to be present on the target + device. The location can be provided either by setting + the property + \l{cmake-target-property-QT_ANDROID_SYSTEM_LIBS_PREFIX}{QT_ANDROID_SYSTEM_LIBS_PREFIX} + in your CMake project file, or by defining the path as + meta-data in + \l {Qt Android Manifest File Configuration}{AndroidManifest.xml}: + \badcode + <application> + <meta-data + android:name="system_libs_prefix" + android:value="path/to/libraries/"/> + </application> + \endcode + If no path is provided, \c /system/lib/ is used as the + default path. + \note \c Unbundled deployment does not support + incremental builds. + \note \c Unbundled deployment not supported when + deploying as AAB. + \endlist + Default is \c Bundled deployment. \row \li \c{--install} \li Specify this to install the finished package on the target device diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 612683c974..dbb4bbd24e 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -101,7 +101,8 @@ struct Options enum DeploymentMechanism { - Bundled + Bundled, + Unbundled }; enum TriState { @@ -167,6 +168,7 @@ struct Options // Package information DeploymentMechanism deploymentMechanism; + QString systemLibsPath; QString packageName; QStringList extraLibs; QHash<QString, QStringList> archExtraLibs; @@ -337,7 +339,6 @@ void deleteMissingFiles(const Options &options, const QDir &srcDir, const QDir & fflush(stdout); } - Options parseOptions() { Options options; @@ -383,6 +384,9 @@ Options parseOptions() QString deploymentMechanism = arguments.at(++i); if (deploymentMechanism.compare("bundled"_L1, Qt::CaseInsensitive) == 0) { options.deploymentMechanism = Options::Bundled; + } else if (deploymentMechanism.compare("unbundled"_L1, + Qt::CaseInsensitive) == 0) { + options.deploymentMechanism = Options::Unbundled; } else { fprintf(stderr, "Unrecognized deployment mechanism: %s\n", qPrintable(deploymentMechanism)); options.helpRequested = true; @@ -540,7 +544,9 @@ void printHelp() " directory will be used if nothing else is specified.\n" "\n" " --deployment <mechanism>: Supported deployment mechanisms:\n" - " bundled (default): Include Qt files in stand-alone package.\n" + " bundled (default): Includes Qt files in stand-alone package.\n" + " unbundled: Assumes native libraries are present on the device\n" + " and does not include them in the APK.\n" "\n" " --aab: Build an Android App Bundle.\n" "\n" @@ -796,6 +802,16 @@ QString packageNameFromAndroidManifest(const QString &androidManifestPath) return {}; } +bool parseCmakeBoolean(const QJsonValue &value) +{ + const QString stringValue = value.toString(); + return (stringValue.compare(QString::fromUtf8("true"), Qt::CaseInsensitive) + || stringValue.compare(QString::fromUtf8("on"), Qt::CaseInsensitive) + || stringValue.compare(QString::fromUtf8("yes"), Qt::CaseInsensitive) + || stringValue.compare(QString::fromUtf8("y"), Qt::CaseInsensitive) + || stringValue.toInt() > 0); +} + bool readInputFile(Options *options) { QFile file(options->inputFileName); @@ -1023,6 +1039,22 @@ bool readInputFile(Options *options) } { + const QJsonValue systemLibsPath = + jsonObject.value("android-system-libs-prefix"_L1); + if (!systemLibsPath.isUndefined()) + options->systemLibsPath = systemLibsPath.toString(); + } + + { + const QJsonValue noDeploy = jsonObject.value("android-no-deploy-qt-libs"_L1); + if (!noDeploy.isUndefined()) { + bool useUnbundled = parseCmakeBoolean(noDeploy); + options->deploymentMechanism = useUnbundled ? Options::Unbundled : + Options::Bundled; + } + } + + { const QJsonValue stdcppPath = jsonObject.value("stdcpp-path"_L1); if (stdcppPath.isUndefined()) { fprintf(stderr, "No stdcpp-path defined in json file.\n"); @@ -1137,6 +1169,11 @@ bool readInputFile(Options *options) return true; } +bool isDeployment(const Options *options, Options::DeploymentMechanism deployment) +{ + return options->deploymentMechanism == deployment; +} + bool copyFiles(const QDir &sourceDirectory, const QDir &destinationDirectory, const Options &options, bool forceOverwrite = false) { const QFileInfoList entries = sourceDirectory.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); @@ -1249,8 +1286,16 @@ bool copyAndroidExtraLibs(Options *options) if (options->extraLibs.isEmpty()) return true; - if (options->verbose) - fprintf(stdout, "Copying %zd external libraries to package.\n", size_t(options->extraLibs.size())); + if (options->verbose) { + switch (options->deploymentMechanism) { + case Options::Bundled: + fprintf(stdout, "Copying %zd external libraries to package.\n", size_t(options->extraLibs.size())); + break; + case Options::Unbundled: + fprintf(stdout, "Skip copying of external libraries.\n"); + break; + }; + } for (const QString &extraLib : options->extraLibs) { QFileInfo extraLibInfo(extraLib); @@ -1274,8 +1319,10 @@ bool copyAndroidExtraLibs(Options *options) + u'/' + extraLibInfo.fileName()); - if (!copyFileIfNewer(extraLib, destinationFile, *options)) + if (isDeployment(options, Options::Bundled) + && !copyFileIfNewer(extraLib, destinationFile, *options)) { return false; + } options->archExtraLibs[options->currentArchitecture] += extraLib; } @@ -1323,8 +1370,10 @@ bool copyAndroidExtraResources(Options *options) if (!resourceFile.endsWith(".so"_L1)) { destinationFile = assetsDir + resourceFile; } else { - if (!checkArchitecture(*options, originFile)) + if (isDeployment(options, Options::Unbundled) + || !checkArchitecture(*options, originFile)) { continue; + } destinationFile = libsDir + resourceFile; options->archExtraPlugins[options->currentArchitecture] += resourceFile; } @@ -1487,11 +1536,12 @@ bool updateLibsXml(Options *options) const QString initClasses = options->initClasses.join(u':'); replacements[QStringLiteral("<!-- %%INSERT_INIT_CLASSES%% -->")] = initClasses; - // Bundle and use libs from the apk because currently we don't have a way avoid - // duplicating them. - replacements[QStringLiteral("<!-- %%BUNDLE_LOCAL_QT_LIBS%% -->")] = "1"_L1; + // Set BUNDLE_LOCAL_QT_LIBS based on the deployment used + replacements[QStringLiteral("<!-- %%BUNDLE_LOCAL_QT_LIBS%% -->")] + = isDeployment(options, Options::Unbundled) ? "0"_L1 : "1"_L1; replacements[QStringLiteral("<!-- %%USE_LOCAL_QT_LIBS%% -->")] = "1"_L1; - + replacements[QStringLiteral("<!-- %%SYSTEM_LIBS_PREFIX%% -->")] = + isDeployment(options, Options::Unbundled) ? options->systemLibsPath : QStringLiteral(""); if (!updateFile(fileName, replacements)) return false; @@ -1735,7 +1785,7 @@ bool readAndroidDependencyXml(Options *options, } else if (reader.name() == "jar"_L1) { int bundling = reader.attributes().value("bundling"_L1).toInt(); QString fileName = QDir::cleanPath(reader.attributes().value("file"_L1).toString()); - if (bundling == (options->deploymentMechanism == Options::Bundled)) { + if (bundling) { QtDependency dependency(fileName, absoluteFilePath(options, fileName)); if (!usedDependencies->contains(dependency.absolutePath)) { options->qtDependencies[options->currentArchitecture].append(dependency); @@ -2322,6 +2372,10 @@ bool copyQtFiles(Options *options) case Options::Bundled: fprintf(stdout, "Copying %zd dependencies from Qt into package.\n", size_t(options->qtDependencies[options->currentArchitecture].size())); break; + case Options::Unbundled: + fprintf(stdout, "Copying dependencies from Qt into the package build folder," + "skipping native libraries.\n"); + break; }; } @@ -2336,8 +2390,8 @@ bool copyQtFiles(Options *options) for (const QtDependency &qtDependency : qAsConst(options->qtDependencies[options->currentArchitecture])) { QString sourceFileName = qtDependency.absolutePath; QString destinationFileName; - - if (qtDependency.relativePath.endsWith(".so"_L1)) { + bool isSharedLibrary = qtDependency.relativePath.endsWith(".so"_L1); + if (isSharedLibrary) { QString garbledFileName; if (QDir::fromNativeSeparators(qtDependency.relativePath).startsWith("lib/"_L1)) { garbledFileName = qtDependency.relativePath.mid(sizeof("lib/") - 1); @@ -2371,13 +2425,12 @@ bool copyQtFiles(Options *options) continue; } - if (options->deploymentMechanism == Options::Bundled + if ((isDeployment(options, Options::Bundled) || !isSharedLibrary) && !copyFileIfNewer(sourceFileName, options->outputDirectory + u'/' + destinationFileName, *options)) { return false; } - options->bundledFiles[options->currentArchitecture] += qMakePair(destinationFileName, qtDependency.relativePath); } @@ -2709,6 +2762,8 @@ bool copyPackage(const Options &options) bool copyStdCpp(Options *options) { + if (isDeployment(options, Options::Unbundled)) + return true; if (options->verbose) fprintf(stdout, "Copying STL library\n"); @@ -3115,9 +3170,16 @@ int main(int argc, char *argv[]) if (Q_UNLIKELY(options.timing)) fprintf(stdout, "[TIMING] %lld ns: Copied GNU STL\n", options.timer.nsecsElapsed()); } - - if (!containsApplicationBinary(&options)) + // If Unbundled deployment is used, remove app lib as we don't want it packaged inside the APK + if (options.deploymentMechanism == Options::Unbundled) { + QString appLibPath = "%1/libs/%2/lib%3_%2.so"_L1. + arg(options.outputDirectory, + options.currentArchitecture, + options.applicationBinary); + QFile::remove(appLibPath); + } else if (!containsApplicationBinary(&options)) { return CannotFindApplicationBinary; + } if (Q_UNLIKELY(options.timing)) fprintf(stdout, "[TIMING] %lld ns: Checked for application binary\n", options.timer.nsecsElapsed()); @@ -3141,7 +3203,6 @@ int main(int argc, char *argv[]) return 0; } - if (options.build) { if (!copyAndroidSources(options)) return CannotCopyAndroidSources; |