Skip to content

Commit

Permalink
Android: Don't rely on QDir::homePath() to get the application directory
Browse files Browse the repository at this point in the history
If the QLoggingRegistry gets called as part of the static initialization
phase, it would call into Android's QStandarPaths implementation, which
assumed that the HOME env. variable was already set. Since the variable
isn't set before main is called, QDir::homePath() returns the root path,
which would be cached and always returned.

With this fix we now call Android's getFilesDir() directly, which will
always return the right path. Since the font locations are also relying
on an environment variable being set, we no longer cache that either.

Task-number: QTBUG-65820
Change-Id: If45f3d5f0e87b808a62118ae95c31b492885646a
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
(cherry picked from commit eadf9e542fcc42597bfe02df065fc4cefa94cd56)
  • Loading branch information
cstatic committed Feb 12, 2018
1 parent a0da6df commit 72918d1
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions src/corelib/io/qstandardpaths_android.cpp
Expand Up @@ -217,7 +217,16 @@ static QString getFilesDir()
if (!path.isEmpty())
return path;

return (path = QDir::homePath());
QJNIObjectPrivate appCtx = applicationContext();
if (!appCtx.isValid())
return QString();

QJNIObjectPrivate file = appCtx.callObjectMethod("getFilesDir",
"()Ljava/io/File;");
if (!file.isValid())
return QString();

return (path = getAbsolutePath(file));
}

QString QStandardPaths::writableLocation(StandardLocation type)
Expand Down Expand Up @@ -319,7 +328,9 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
if (!ba.isEmpty())
return QStringList((fontLocation = QDir::cleanPath(QString::fromLocal8Bit(ba))));

return QStringList((fontLocation = QLatin1String("/system/fonts")));
// Don't cache the fallback, as we might just have been called before
// QT_ANDROID_FONT_LOCATION has been set.
return QStringList(QLatin1String("/system/fonts"));
}

return QStringList(writableLocation(type));
Expand Down

0 comments on commit 72918d1

Please sign in to comment.