Add the support of the qt_import_plugins functionality to androiddeployqt

qt_import_plugins allows to control application deployment on
non-Android platforms. This adds support for the pre-defined plugin list
that is computed using the qt_import_plugins input.

Pick-to: 6.5
Task-number: QTBUG-118829
Change-Id: Iaa9c3f600533a4b5a3079ab228fabf212d9ce5a5
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 438837ce274fdc1457b66179b25df40f33b23a15)
(cherry picked from commit 4dfaabce579c42443a8f9b4425b62c20fe275052)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Alexey Edelev 2024-01-03 13:16:41 +01:00 committed by Qt Cherry-pick Bot
parent 82fff69aaa
commit 6763644c3f
3 changed files with 55 additions and 24 deletions

View File

@ -253,7 +253,8 @@ function(qt_internal_android_dependencies target)
# Module plugins
if(module_plugin_types)
foreach(plugin IN LISTS module_plugin_types)
string(APPEND file_contents "<bundled file=\"${INSTALL_PLUGINSDIR}/${plugin}\" />\n")
string(APPEND file_contents
"<bundled file=\"${INSTALL_PLUGINSDIR}/${plugin}\" type=\"plugin_dir\"/>\n")
endforeach()
endif()

View File

@ -236,6 +236,10 @@ function(qt6_android_generate_deployment_settings target)
_qt_internal_add_android_deployment_property(file_contents "android-no-deploy-qt-libs"
${target} "QT_ANDROID_NO_DEPLOY_QT_LIBS")
__qt_internal_collect_plugin_targets_from_dependencies("${target}" plugin_targets)
__qt_internal_collect_plugin_library_files("${target}" "${plugin_targets}" plugin_targets)
string(APPEND file_contents " \"android-deploy-plugins\":\"${plugin_targets}\",\n")
# App binary
string(APPEND file_contents
" \"application-binary\": \"${target_output_name}\",\n")
@ -303,7 +307,7 @@ function(qt6_android_generate_deployment_settings target)
# content end
string(APPEND file_contents "}\n")
file(GENERATE OUTPUT ${deploy_file} CONTENT ${file_contents})
file(GENERATE OUTPUT ${deploy_file} CONTENT "${file_contents}")
set_target_properties(${target}
PROPERTIES

View File

@ -144,6 +144,7 @@ struct Options
QString qtQmlDirectory;
QString qtHostDirectory;
std::vector<QString> extraPrefixDirs;
QStringList androidDeployPlugins;
// Unlike 'extraPrefixDirs', the 'extraLibraryDirs' key doesn't expect the 'lib' subfolder
// when looking for dependencies.
std::vector<QString> extraLibraryDirs;
@ -1010,6 +1011,11 @@ bool readInputFile(Options *options)
}
}
{
const auto androidDeployPlugins = jsonObject.value("android-deploy-plugins"_L1).toString();
options->androidDeployPlugins = androidDeployPlugins.split(";"_L1, Qt::SkipEmptyParts);
}
{
const auto extraLibraryDirs = jsonObject.value("extraLibraryDirs"_L1).toArray();
options->extraLibraryDirs.reserve(extraLibraryDirs.size());
@ -1881,6 +1887,32 @@ QList<QtDependency> findFilesRecursively(const Options &options, const QString &
return deps;
}
void readDependenciesFromFiles(Options *options, const QList<QtDependency> &files,
QSet<QString> &usedDependencies,
QSet<QString> &remainingDependencies)
{
for (const QtDependency &fileName : files) {
if (usedDependencies.contains(fileName.absolutePath))
continue;
if (fileName.absolutePath.endsWith(".so"_L1)) {
if (!readDependenciesFromElf(options, fileName.absolutePath, &usedDependencies,
&remainingDependencies)) {
fprintf(stdout, "Skipping file dependency: %s\n",
qPrintable(fileName.relativePath));
continue;
}
}
usedDependencies.insert(fileName.absolutePath);
if (options->verbose) {
fprintf(stdout, "Appending file dependency: %s\n", qPrintable(fileName.relativePath));
}
options->qtDependencies[options->currentArchitecture].append(fileName);
}
}
bool readAndroidDependencyXml(Options *options,
const QString &moduleName,
QSet<QString> *usedDependencies,
@ -1911,29 +1943,15 @@ bool readAndroidDependencyXml(Options *options,
QString file = reader.attributes().value("file"_L1).toString();
const QList<QtDependency> fileNames = findFilesRecursively(*options, file);
for (const QtDependency &fileName : fileNames) {
if (usedDependencies->contains(fileName.absolutePath))
continue;
if (fileName.absolutePath.endsWith(".so"_L1)) {
QSet<QString> remainingDependencies;
if (!readDependenciesFromElf(options, fileName.absolutePath,
usedDependencies,
&remainingDependencies)) {
fprintf(stdout, "Skipping dependencies from xml: %s\n",
qPrintable(fileName.relativePath));
continue;
}
}
usedDependencies->insert(fileName.absolutePath);
if (options->verbose)
fprintf(stdout, "Appending dependency from xml: %s\n", qPrintable(fileName.relativePath));
options->qtDependencies[options->currentArchitecture].append(fileName);
if (reader.attributes().hasAttribute("type"_L1)
&& reader.attributes().value("type"_L1) == "plugin_dir"_L1
&& !options->androidDeployPlugins.isEmpty()) {
continue;
}
const QList<QtDependency> fileNames = findFilesRecursively(*options, file);
readDependenciesFromFiles(options, fileNames, *usedDependencies,
*remainingDependencies);
} else if (reader.name() == "jar"_L1) {
int bundling = reader.attributes().value("bundling"_L1).toInt();
QString fileName = QDir::cleanPath(reader.attributes().value("file"_L1).toString());
@ -2410,6 +2428,14 @@ bool readDependencies(Options *options)
if (!readDependenciesFromElf(options, "%1/libs/%2/lib%3_%2.so"_L1.arg(options->outputDirectory, options->currentArchitecture, options->applicationBinary), &usedDependencies, &remainingDependencies))
return false;
QList<QtDependency> pluginDeps;
for (const auto &pluginPath : options->androidDeployPlugins) {
pluginDeps.append(findFilesRecursively(*options, QFileInfo(pluginPath),
options->qtInstallDirectory + "/"_L1));
}
readDependenciesFromFiles(options, pluginDeps, usedDependencies, remainingDependencies);
while (!remainingDependencies.isEmpty()) {
QSet<QString>::iterator start = remainingDependencies.begin();
QString fileName = absoluteFilePath(options, *start);