Skip to content

Commit

Permalink
Support for Q_OS_ANDROID_EMBEDDED and android-embedded build flags
Browse files Browse the repository at this point in the history
The Embedded Android build (Boot to Qt Android injection) is defined by
having both Q_OS_ANDROID and Q_OS_ANDROID_EMBEDDED flags defined,
as well as having Qt config android-embedded.
This commit enables the possibility to build embedded Android builds.
(i.e. Qt build for Android baselayer only, without JNI)

Change-Id: I8406e959fdf1c8d9efebbbe53f1a391fa25f336a
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
  • Loading branch information
ottoryynanen committed Jan 20, 2018
1 parent e211ab7 commit 6d50f74
Show file tree
Hide file tree
Showing 56 changed files with 92 additions and 88 deletions.
2 changes: 1 addition & 1 deletion mkspecs/features/android/android_deployment_settings.prf
@@ -1,4 +1,4 @@
contains(TEMPLATE, ".*app"):!build_pass: {
contains(TEMPLATE, ".*app"):!build_pass:!android-embedded {

defineReplace(emitString) {
return("\"$$replace(1, \\\\, \\\\)\"")
Expand Down
12 changes: 6 additions & 6 deletions src/corelib/global/qglobal.cpp
Expand Up @@ -81,7 +81,7 @@
# include <envLib.h>
#endif

#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
#include <private/qjni_p.h>
#endif

Expand Down Expand Up @@ -2312,7 +2312,7 @@ static bool findUnixOsVersion(QUnixOSVersion &v)
# endif // USE_ETC_OS_RELEASE
#endif // Q_OS_UNIX

#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
static const char *osVer_helper(QOperatingSystemVersion)
{
/* Data:
Expand Down Expand Up @@ -2793,7 +2793,7 @@ QString QSysInfo::productVersion()
*/
QString QSysInfo::prettyProductName()
{
#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
#if (defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)) || defined(Q_OS_DARWIN) || defined(Q_OS_WIN)
const auto version = QOperatingSystemVersion::current();
const char *name = osVer_helper(version);
if (name)
Expand Down Expand Up @@ -3349,7 +3349,7 @@ bool qunsetenv(const char *varName)
#endif
}

#if defined(Q_OS_ANDROID) && (__ANDROID_API__ < 21)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) && (__ANDROID_API__ < 21)
typedef QThreadStorage<QJNIObjectPrivate> AndroidRandomStorage;
Q_GLOBAL_STATIC(AndroidRandomStorage, randomTLS)

Expand Down Expand Up @@ -3383,7 +3383,7 @@ Q_GLOBAL_STATIC(SeedStorage, randTLS) // Thread Local Storage for seed value
*/
void qsrand(uint seed)
{
#if defined(Q_OS_ANDROID) && (__ANDROID_API__ < 21)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) && (__ANDROID_API__ < 21)
if (randomTLS->hasLocalData()) {
randomTLS->localData().callMethod<void>("setSeed", "(J)V", jlong(seed));
return;
Expand Down Expand Up @@ -3437,7 +3437,7 @@ void qsrand(uint seed)
*/
int qrand()
{
#if defined(Q_OS_ANDROID) && (__ANDROID_API__ < 21)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED) && (__ANDROID_API__ < 21)
AndroidRandomStorage *randomStorage = randomTLS();
if (!randomStorage)
return rand();
Expand Down
4 changes: 2 additions & 2 deletions src/corelib/global/qlogging.cpp
Expand Up @@ -1546,7 +1546,7 @@ static void syslog_default_message_handler(QtMsgType type, const char *message)
}
#endif

#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
static void android_default_message_handler(QtMsgType type,
const QMessageLogContext &context,
const QString &message)
Expand Down Expand Up @@ -1594,7 +1594,7 @@ static void qDefaultMessageHandler(QtMsgType type, const QMessageLogContext &con
#elif QT_CONFIG(syslog)
syslog_default_message_handler(type, logMessage.toUtf8().constData());
return;
#elif defined(Q_OS_ANDROID)
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
android_default_message_handler(type, context, logMessage);
return;
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/corelib/global/qoperatingsystemversion.cpp
Expand Up @@ -44,7 +44,7 @@

#include <qversionnumber.h>

#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
#include <private/qjni_p.h>
#endif

Expand Down Expand Up @@ -160,7 +160,7 @@ QOperatingSystemVersion QOperatingSystemVersion::current()
{
QOperatingSystemVersion version;
version.m_os = currentType();
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
#ifndef QT_BOOTSTRAPPED
const QVersionNumber v = QVersionNumber::fromString(QJNIObjectPrivate::getStaticObjectField(
"android/os/Build$VERSION", "RELEASE", "Ljava/lang/String;").toString());
Expand Down
2 changes: 1 addition & 1 deletion src/corelib/io/io.pri
Expand Up @@ -167,7 +167,7 @@ win32 {
} else {
LIBS += -framework MobileCoreServices
}
} else:android {
} else:android:!android-embedded {
SOURCES += \
io/qstandardpaths_android.cpp \
io/qstorageinfo_unix.cpp
Expand Down
2 changes: 1 addition & 1 deletion src/corelib/kernel/kernel.pri
Expand Up @@ -199,7 +199,7 @@ qnx:qtConfig(qqnx_pps) {
kernel/qppsobjectprivate_p.h
}

android {
android:!android-embedded {
SOURCES += \
kernel/qjnionload.cpp \
kernel/qjnihelpers.cpp \
Expand Down
6 changes: 3 additions & 3 deletions src/corelib/kernel/qcoreapplication.cpp
Expand Up @@ -95,7 +95,7 @@
#endif
#endif // QT_NO_QOBJECT

#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
# include <private/qjni_p.h>
# include <private/qjnihelpers_p.h>
#endif
Expand Down Expand Up @@ -180,7 +180,7 @@ QString QCoreApplicationPrivate::appVersion() const
#ifndef QT_BOOTSTRAPPED
# ifdef Q_OS_DARWIN
applicationVersion = infoDictionaryStringProperty(QStringLiteral("CFBundleVersion"));
# elif defined(Q_OS_ANDROID)
# elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
QJNIObjectPrivate context(QtAndroidPrivate::context());
if (context.isValid()) {
QJNIObjectPrivate pm = context.callObjectMethod(
Expand Down Expand Up @@ -2189,7 +2189,7 @@ QString QCoreApplication::applicationFilePath()
}
#endif
#if defined( Q_OS_UNIX )
# if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
# if defined(Q_OS_LINUX) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED))
// Try looking for a /proc/<pid>/exe symlink first which points to
// the absolute path of the executable
QFileInfo pfi(QString::fromLatin1("/proc/%1/exe").arg(getpid()));
Expand Down
2 changes: 1 addition & 1 deletion src/corelib/tools/qsimd_p.h
Expand Up @@ -198,7 +198,7 @@

// SSE intrinsics
#if defined(__SSE2__) || (defined(QT_COMPILER_SUPPORTS_SSE2) && defined(QT_COMPILER_SUPPORTS_SIMD_ALWAYS))
#if defined(QT_LINUXBASE)
#if defined(QT_LINUXBASE) || defined(Q_OS_ANDROID_EMBEDDED)
/// this is an evil hack - the posix_memalign declaration in LSB
/// is wrong - see http://bugs.linuxbase.org/show_bug.cgi?id=2431
# define posix_memalign _lsb_hack_posix_memalign
Expand Down
8 changes: 4 additions & 4 deletions src/corelib/tools/qtimezone.cpp
Expand Up @@ -62,9 +62,9 @@ static QTimeZonePrivate *newBackendTimeZone()
#else
#if defined Q_OS_MAC
return new QMacTimeZonePrivate();
#elif defined Q_OS_ANDROID
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
return new QAndroidTimeZonePrivate();
#elif defined Q_OS_UNIX
#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
return new QTzTimeZonePrivate();
// Registry based timezone backend not available on WinRT
#elif defined Q_OS_WIN
Expand All @@ -89,9 +89,9 @@ static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId)
#else
#if defined Q_OS_MAC
return new QMacTimeZonePrivate(ianaId);
#elif defined Q_OS_ANDROID
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
return new QAndroidTimeZonePrivate(ianaId);
#elif defined Q_OS_UNIX
#elif defined(Q_OS_UNIX) || defined(Q_OS_ANDROID_EMBEDDED)
return new QTzTimeZonePrivate(ianaId);
// Registry based timezone backend not available on WinRT
#elif defined Q_OS_WIN
Expand Down
6 changes: 3 additions & 3 deletions src/corelib/tools/qtimezoneprivate_p.h
Expand Up @@ -68,7 +68,7 @@ Q_FORWARD_DECLARE_OBJC_CLASS(NSTimeZone);
#include <qt_windows.h>
#endif // Q_OS_WIN

#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
#include <QtCore/private/qjni_p.h>
#endif

Expand Down Expand Up @@ -266,7 +266,7 @@ class Q_AUTOTEST_EXPORT QIcuTimeZonePrivate Q_DECL_FINAL : public QTimeZonePriva
};
#endif

#if defined Q_OS_UNIX && !defined Q_OS_MAC && !defined Q_OS_ANDROID
#if defined(Q_OS_UNIX) && !defined(Q_OS_DARWIN) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED))
struct QTzTransitionTime
{
qint64 atMSecsSinceEpoch;
Expand Down Expand Up @@ -443,7 +443,7 @@ class Q_AUTOTEST_EXPORT QWinTimeZonePrivate Q_DECL_FINAL : public QTimeZonePriva
};
#endif // Q_OS_WIN

#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
class QAndroidTimeZonePrivate Q_DECL_FINAL : public QTimeZonePrivate
{
public:
Expand Down
2 changes: 1 addition & 1 deletion src/corelib/tools/tools.pri
Expand Up @@ -158,7 +158,7 @@ qtConfig(timezone) {
tools/qtimezoneprivate.cpp
!nacl:darwin: \
SOURCES += tools/qtimezoneprivate_mac.mm
else: android: \
else: android:!android-embedded: \
SOURCES += tools/qtimezoneprivate_android.cpp
else: unix: \
SOURCES += tools/qtimezoneprivate_tz.cpp
Expand Down
4 changes: 2 additions & 2 deletions src/gui/kernel/qguiapplication.cpp
Expand Up @@ -2040,7 +2040,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE
QWindow *window = e->window.data();
modifier_buttons = e->modifiers;
if (e->nullWindow()
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
|| e->key == Qt::Key_Back || e->key == Qt::Key_Menu
#endif
) {
Expand Down Expand Up @@ -2076,7 +2076,7 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE

if (window && !window->d_func()->blockedByModalWindow)
QGuiApplication::sendSpontaneousEvent(window, &ev);
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
else
ev.setAccepted(false);

Expand Down
2 changes: 2 additions & 0 deletions src/network/ssl/qsslsocket_openssl.cpp
Expand Up @@ -727,12 +727,14 @@ QList<QSslCertificate> QSslSocketPrivate::systemCaCertificates()
directories << ministroPath;
nameFilters << QLatin1String("*.der");
platformEncodingFormat = QSsl::Der;
# ifndef Q_OS_ANDROID_EMBEDDED
if (ministroPath.isEmpty()) {
QList<QByteArray> certificateData = fetchSslCertificateData();
for (int i = 0; i < certificateData.size(); ++i) {
systemCerts.append(QSslCertificate::fromData(certificateData.at(i), QSsl::Der));
}
} else
# endif //Q_OS_ANDROID_EMBEDDED
# endif //Q_OS_ANDROID
{
currentDir.setNameFilters(nameFilters);
Expand Down
2 changes: 1 addition & 1 deletion src/network/ssl/qsslsocket_p.h
Expand Up @@ -209,7 +209,7 @@ class QSslSocketPrivate : public QTcpSocketPrivate
private:
static bool ensureLibraryLoaded();
static void ensureCiphersAndCertsLoaded();
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
static QList<QByteArray> fetchSslCertificateData();
#endif

Expand Down
2 changes: 1 addition & 1 deletion src/network/ssl/ssl.pri
Expand Up @@ -70,7 +70,7 @@ qtConfig(ssl) {

darwin:SOURCES += ssl/qsslsocket_mac_shared.cpp

android: SOURCES += ssl/qsslsocket_openssl_android.cpp
android:!android-embedded: SOURCES += ssl/qsslsocket_openssl_android.cpp

# Add optional SSL libs
# Static linking of OpenSSL with msvc:
Expand Down
4 changes: 2 additions & 2 deletions src/platformsupport/eglconvenience/qeglplatformcontext.cpp
Expand Up @@ -45,7 +45,7 @@
#include <QtPlatformHeaders/QEGLNativeContext>
#include <QDebug>

#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
#include <QtCore/private/qjnihelpers_p.h>
#endif
#ifndef Q_OS_WIN
Expand Down Expand Up @@ -332,7 +332,7 @@ void QEGLPlatformContext::updateFormatFromGL()
QByteArray version = QByteArray(reinterpret_cast<const char *>(s));
int major, minor;
if (QPlatformOpenGLContext::parseOpenGLVersion(version, major, minor)) {
#ifdef Q_OS_ANDROID
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
// Some Android 4.2.2 devices report OpenGL ES 3.0 without the functions being available.
static int apiLevel = QtAndroidPrivate::androidSdkVersion();
if (apiLevel <= 17 && major >= 3) {
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/bearer/bearer.pro
Expand Up @@ -6,6 +6,6 @@ QT_FOR_CONFIG += network-private
SUBDIRS += connman networkmanager
}

android:SUBDIRS += android
android:!android-embedded: SUBDIRS += android

isEmpty(SUBDIRS):SUBDIRS = generic
2 changes: 1 addition & 1 deletion src/plugins/platforms/eglfs/api/qeglfswindow.cpp
Expand Up @@ -117,7 +117,7 @@ void QEglFSWindow::create()
QOpenGLCompositor *compositor = QOpenGLCompositor::instance();
if (screen->primarySurface() != EGL_NO_SURFACE) {
if (Q_UNLIKELY(!isRaster() || !compositor->targetWindow())) {
#if !defined(Q_OS_ANDROID)
#if !defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_EMBEDDED)
// We can have either a single OpenGL window or multiple raster windows.
// Other combinations cannot work.
qFatal("EGLFS: OpenGL windows cannot be mixed with others.");
Expand Down
6 changes: 3 additions & 3 deletions src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp
Expand Up @@ -59,13 +59,13 @@
#include <QtInputSupport/private/qlibinputhandler_p.h>
#endif

#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
#if QT_CONFIG(evdev)
#include <QtInputSupport/private/qevdevmousemanager_p.h>
#include <QtInputSupport/private/qevdevkeyboardmanager_p.h>
#include <QtInputSupport/private/qevdevtouchmanager_p.h>
#endif

#if QT_CONFIG(tslib) && !defined(Q_OS_ANDROID)
#if QT_CONFIG(tslib)
#include <QtInputSupport/private/qtslib_p.h>
#endif

Expand Down Expand Up @@ -162,7 +162,7 @@ void QLinuxFbIntegration::createInputHandlers()
new QTsLibMouseHandler(QLatin1String("TsLib"), QString());
#endif

#if QT_CONFIG(evdev) && !defined(Q_OS_ANDROID)
#if QT_CONFIG(evdev)
new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this);
new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this);
#if QT_CONFIG(tslib)
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/platforms/platforms.pro
@@ -1,7 +1,7 @@
TEMPLATE = subdirs
QT_FOR_CONFIG += gui-private

android: SUBDIRS += android
android:!android-embedded: SUBDIRS += android

!android: SUBDIRS += minimal

Expand Down
8 changes: 5 additions & 3 deletions src/src.pro
Expand Up @@ -193,9 +193,11 @@ qtConfig(gui) {
src_plugins.depends += src_gui src_platformsupport src_platformheaders
src_testlib.depends += src_gui # if QtGui is enabled, QtTest requires QtGui's headers
qtConfig(widgets) {
SUBDIRS += src_tools_uic src_widgets src_printsupport
SUBDIRS += src_tools_uic src_widgets
!android-embedded: SUBDIRS += src_printsupport
TOOLS += src_tools_uic
src_plugins.depends += src_widgets src_printsupport
src_plugins.depends += src_widgets
!android-embedded: src_plugins.depends += src_printsupport
src_testlib.depends += src_widgets # if QtWidgets is enabled, QtTest requires QtWidgets's headers
qtConfig(opengl) {
SUBDIRS += src_opengl
Expand All @@ -207,7 +209,7 @@ SUBDIRS += src_plugins

nacl: SUBDIRS -= src_network src_testlib

android: SUBDIRS += src_android src_3rdparty_gradle
android:!android-embedded: SUBDIRS += src_android src_3rdparty_gradle

TR_EXCLUDE = \
src_tools_bootstrap src_tools_moc src_tools_rcc src_tools_uic src_tools_qlalr \
Expand Down
2 changes: 1 addition & 1 deletion tests/auto/corelib/io/qdatastream/qdatastream.pro
Expand Up @@ -5,7 +5,7 @@ SOURCES = tst_qdatastream.cpp

TESTDATA += datastream.q42

android {
android:!android-embedded {
RESOURCES += \
testdata.qrc
}
2 changes: 1 addition & 1 deletion tests/auto/corelib/io/qdir/qdir.pro
Expand Up @@ -8,6 +8,6 @@ TESTDATA += testdir testData searchdir resources entrylist types tst_qdir.cpp

contains(CONFIG, builtin_testdata): DEFINES += BUILTIN_TESTDATA

android {
android:!android-embedded {
RESOURCES += android_testdata.qrc
}
6 changes: 3 additions & 3 deletions tests/auto/corelib/io/qdir/tst_qdir.cpp
Expand Up @@ -228,13 +228,13 @@ private slots:
Q_DECLARE_METATYPE(tst_QDir::UncHandling)

tst_QDir::tst_QDir()
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
: m_dataPath(QStandardPaths::writableLocation(QStandardPaths::CacheLocation))
#elif !defined(BUILTIN_TESTDATA)
: m_dataPath(QFileInfo(QFINDTESTDATA("testData")).absolutePath())
#endif
{
#if defined(Q_OS_ANDROID)
#if defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
QString resourceSourcePath = QStringLiteral(":/android_testdata/");
QDirIterator it(resourceSourcePath, QDirIterator::Subdirectories);
while (it.hasNext()) {
Expand Down Expand Up @@ -2186,7 +2186,7 @@ void tst_QDir::equalityOperator_data()
QString pathinroot(QDir::rootPath() + QLatin1String("assets/.."));
#elif defined (Q_OS_WIN)
QString pathinroot("c:/windows/..");
#elif defined(Q_OS_ANDROID)
#elif defined(Q_OS_ANDROID) && !defined(Q_OS_ANDROID_EMBEDDED)
QString pathinroot("/system/..");
#elif defined(Q_OS_HAIKU)
QString pathinroot("/boot/..");
Expand Down

0 comments on commit 6d50f74

Please sign in to comment.