Android: Fix use_local_libs when running from launcher

The old way of passing the use_local_libs settings to the
app (which is still supported for compatibility with Necessitas)
was to pass it as command line arguments when the app is
launched from Qt Creator. This will make the app depend on
Ministro if it's later launched from the Android launcher.
To avoid this, we pass the info as part of AndroidManifest.xml
instead.

Task-number: QTCREATORBUG-8643
Change-Id: Ib044ce8bf7e285cf46075a8713bd7fc6736052d5
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
Eskil Abrahamsen Blomfeldt
2013-03-07 13:22:21 +01:00
parent 94dc38364c
commit a20dd013a7
4 changed files with 79 additions and 0 deletions

View File

@@ -348,6 +348,62 @@ QString AndroidManager::targetApplication(ProjectExplorer::Target *target)
return QString();
}
bool AndroidManager::setUseLocalLibs(ProjectExplorer::Target *target, bool useLocalLibs, int deviceAPILevel)
{
// For Qt 4, the "use local libs" options is handled by passing command line arguments to the
// app, so no need to alter the AndroidManifest.xml
QtSupport::BaseQtVersion *baseQtVersion = QtSupport::QtKitInformation::qtVersion(target->kit());
if (baseQtVersion == 0 || baseQtVersion->qtVersion() < QtSupport::QtVersionNumber(5,0,0))
return true;
QDomDocument doc;
if (!openManifest(target, doc))
return false;
QDomElement metadataElem = doc.documentElement().firstChildElement(QLatin1String("application")).firstChildElement(QLatin1String("activity")).firstChildElement(QLatin1String("meta-data"));
QString localLibs;
QString localJars;
QString staticInitClasses;
if (useLocalLibs) {
localLibs = loadLocalLibs(target, deviceAPILevel);
localJars = loadLocalJars(target, deviceAPILevel);
staticInitClasses = loadLocalJarsInitClasses(target, deviceAPILevel);
}
bool changedManifest = false;
while (!metadataElem.isNull()) {
if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.use_local_qt_libs")) {
if (metadataElem.attribute(QLatin1String("android:value")).toInt() != useLocalLibs) {
metadataElem.setAttribute(QLatin1String("android:value"), int(useLocalLibs));
changedManifest = true;
}
} else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.load_local_libs")) {
if (metadataElem.attribute(QLatin1String("android:value")) != localLibs) {
metadataElem.setAttribute(QLatin1String("android:value"), localLibs);
changedManifest = true;
}
} else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.load_local_jars")) {
if (metadataElem.attribute(QLatin1String("android:value")) != localJars) {
metadataElem.setAttribute(QLatin1String("android:value"), localJars);
changedManifest = true;
}
} else if (metadataElem.attribute(QLatin1String("android:name")) == QLatin1String("android.app.static_init_classes")) {
if (metadataElem.attribute(QLatin1String("android:value")) != staticInitClasses) {
metadataElem.setAttribute(QLatin1String("android:value"), staticInitClasses);
changedManifest = true;
}
}
metadataElem = metadataElem.nextSiblingElement(QLatin1String("meta-data"));
}
if (changedManifest)
return saveManifest(target, doc);
else
return true;
}
bool AndroidManager::setTargetApplication(ProjectExplorer::Target *target, const QString &name)
{
QDomDocument doc;