diff options
Diffstat (limited to 'src/tools/androiddeployqt/main.cpp')
-rw-r--r-- | src/tools/androiddeployqt/main.cpp | 66 |
1 files changed, 57 insertions, 9 deletions
diff --git a/src/tools/androiddeployqt/main.cpp b/src/tools/androiddeployqt/main.cpp index 57714fc687..3b78d2487f 100644 --- a/src/tools/androiddeployqt/main.cpp +++ b/src/tools/androiddeployqt/main.cpp @@ -95,6 +95,7 @@ struct Options , generateAssetsFileList(true) , build(true) , gradle(false) + , auxMode(false) , deploymentMechanism(Bundled) , releasePackage(false) , digestAlg(QLatin1String("SHA1")) @@ -126,6 +127,7 @@ struct Options bool generateAssetsFileList; bool build; bool gradle; + bool auxMode; QTime timer; // External tools @@ -137,6 +139,7 @@ struct Options // Build paths QString qtInstallDirectory; + std::vector<QString> extraPrefixDirs; QString androidSourceDirectory; QString outputDirectory; QString inputFileName; @@ -431,6 +434,8 @@ Options parseOptions() options.jarSigner = true; } else if (argument.compare(QLatin1String("--no-generated-assets-cache"), Qt::CaseInsensitive) == 0) { options.generateAssetsFileList = false; + } else if (argument.compare(QLatin1String("--aux-mode"), Qt::CaseInsensitive) == 0) { + options.auxMode = true; } } @@ -516,6 +521,9 @@ void printHelp() " --verbose: Prints out information during processing.\n" " --no-generated-assets-cache: Do not pregenerate the entry list for\n" " the assets file engine.\n" + " --aux-mode: Operate in auxiliary mode. This will only copy the\n" + " dependencies into the build directory and update the XML templates.\n" + " The project will not be built or installed.\n" " --help: Displays this information.\n\n", qPrintable(QCoreApplication::arguments().at(0)) ); @@ -730,6 +738,14 @@ bool readInputFile(Options *options) } { + const auto extraPrefixDirs = jsonObject.value(QLatin1String("extraPrefixDirs")).toArray(); + options->extraPrefixDirs.reserve(extraPrefixDirs.size()); + for (const auto &prefix : extraPrefixDirs) { + options->extraPrefixDirs.push_back(prefix.toString()); + } + } + + { const QJsonValue androidSourcesDirectory = jsonObject.value(QStringLiteral("android-package-source-directory")); if (!androidSourcesDirectory.isUndefined()) options->androidSourceDirectory = androidSourcesDirectory.toString(); @@ -1287,6 +1303,9 @@ bool updateAndroidManifest(Options &options) } } + options.localJars.removeDuplicates(); + options.initClasses.removeDuplicates(); + QHash<QString, QString> replacements; replacements[QLatin1String("-- %%INSERT_APP_NAME%% --")] = QFileInfo(options.applicationBinary).baseName().mid(sizeof("lib") - 1); replacements[QLatin1String("-- %%INSERT_APP_LIB_NAME%% --")] = QFileInfo(options.applicationBinary).baseName().mid(sizeof("lib") - 1); @@ -1380,6 +1399,16 @@ bool updateAndroidFiles(Options &options) return true; } +static QString absoluteFilePath(const Options *options, const QString &relativeFileName) +{ + for (const auto &prefix : options->extraPrefixDirs) { + const QString path = prefix + QLatin1Char('/') + relativeFileName; + if (QFile::exists(path)) + return path; + } + return options->qtInstallDirectory + QLatin1Char('/') + relativeFileName; +} + QList<QtDependency> findFilesRecursively(const Options &options, const QFileInfo &info, const QString &rootPath) { if (!info.exists()) @@ -1404,6 +1433,11 @@ QList<QtDependency> findFilesRecursively(const Options &options, const QFileInfo QList<QtDependency> findFilesRecursively(const Options &options, const QString &fileName) { + for (const auto &prefix : options.extraPrefixDirs) { + QFileInfo info(prefix + QLatin1Char('/') + fileName); + if (info.exists()) + return findFilesRecursively(options, info, prefix + QLatin1Char('/')); + } QFileInfo info(options.qtInstallDirectory + QLatin1Char('/') + fileName); return findFilesRecursively(options, info, options.qtInstallDirectory + QLatin1Char('/')); } @@ -1413,7 +1447,7 @@ bool readAndroidDependencyXml(Options *options, QSet<QString> *usedDependencies, QSet<QString> *remainingDependencies) { - QString androidDependencyName = options->qtInstallDirectory + QString::fromLatin1("/lib/%1-android-dependencies.xml").arg(moduleName); + QString androidDependencyName = absoluteFilePath(options, QString::fromLatin1("/lib/%1-android-dependencies.xml").arg(moduleName)); QFile androidDependencyFile(androidDependencyName); if (androidDependencyFile.exists()) { @@ -1458,7 +1492,7 @@ bool readAndroidDependencyXml(Options *options, int bundling = reader.attributes().value(QLatin1String("bundling")).toInt(); QString fileName = reader.attributes().value(QLatin1String("file")).toString(); if (bundling == (options->deploymentMechanism == Options::Bundled)) { - QtDependency dependency(fileName, options->qtInstallDirectory + QLatin1Char('/') + fileName); + QtDependency dependency(fileName, absoluteFilePath(options, fileName)); if (!usedDependencies->contains(dependency.absolutePath)) { options->qtDependencies.append(dependency); usedDependencies->insert(dependency.absolutePath); @@ -1545,7 +1579,7 @@ QStringList getQtLibsFromElf(const Options &options, const QString &fileName) if (line.contains("(NEEDED)") && line.contains("Shared library:") ) { const int pos = line.lastIndexOf('[') + 1; QString libraryName = QLatin1String("lib/") + QString::fromLatin1(line.mid(pos, line.length() - pos - 2)); - if (QFile::exists(options.qtInstallDirectory + QLatin1Char('/') + libraryName)) { + if (QFile::exists(absoluteFilePath(&options, libraryName))) { ret += libraryName; } @@ -1576,7 +1610,7 @@ bool readDependenciesFromElf(Options *options, if (usedDependencies->contains(dependency)) continue; - QString absoluteDependencyPath(options->qtInstallDirectory + QLatin1Char('/') + dependency); + QString absoluteDependencyPath = absoluteFilePath(options, dependency); usedDependencies->insert(dependency); if (!readDependenciesFromElf(options, absoluteDependencyPath, @@ -1763,11 +1797,9 @@ bool readDependencies(Options *options) if (!readDependenciesFromElf(options, options->qtInstallDirectory + QLatin1String("/plugins/platforms/android/libqtforandroid.so"), &usedDependencies, &remainingDependencies)) return false; - QString qtDir = options->qtInstallDirectory + QLatin1Char('/'); - while (!remainingDependencies.isEmpty()) { QSet<QString>::iterator start = remainingDependencies.begin(); - QString fileName = qtDir + *start; + QString fileName = absoluteFilePath(options, *start); remainingDependencies.erase(start); QStringList unmetDependencies; @@ -1785,7 +1817,7 @@ bool readDependencies(Options *options) QStringList::iterator it = options->localLibs.begin(); while (it != options->localLibs.end()) { QStringList unmetDependencies; - if (!goodToCopy(options, qtDir + *it, &unmetDependencies)) { + if (!goodToCopy(options, absoluteFilePath(options, *it), &unmetDependencies)) { fprintf(stdout, "Skipping %s due to unmet dependencies: %s\n", qPrintable(*it), qPrintable(unmetDependencies.join(QLatin1Char(',')))); @@ -1922,7 +1954,7 @@ bool goodToCopy(const Options *options, const QString &file, QStringList *unmetD bool ret = true; const auto libs = getQtLibsFromElf(*options, file); for (const QString &lib : libs) { - if (!options->qtDependencies.contains(QtDependency(lib, options->qtInstallDirectory + QLatin1Char('/') + lib))) { + if (!options->qtDependencies.contains(QtDependency(lib, absoluteFilePath(options, lib)))) { ret = false; unmetDependencies->append(lib); } @@ -2801,6 +2833,22 @@ int main(int argc, char *argv[]) : "No" ); + if (options.auxMode) { + if (!readDependencies(&options)) + return CannotReadDependencies; + if (!copyQtFiles(&options)) + return CannotCopyQtFiles; + if (!copyAndroidExtraResources(options)) + return CannotCopyAndroidExtraResources; + if (!stripLibraries(options)) + return CannotStripLibraries; + if (!updateAndroidFiles(options)) + return CannotUpdateAndroidFiles; + if (options.generateAssetsFileList && !generateAssetsFileList(options)) + return CannotGenerateAssetsFileList; + return 0; + } + if (options.build) { if (options.gradle) cleanAndroidFiles(options); |