Enable bundling Qt in Android package in build system
For bundling Qt, we need two things: 1. We need to build a regular .jar file out of the Java files, so that they can be built into the app package. Dexing the classes first (i.e. compiling the JVM bytecode to Dalvik bytecode) is required for loading the .jar file at run-time, but cannot be used for building it into the app, so we need two different paths. 2. We need to specify which extra files have to be bundled for each module (this is primarily for plugins and imports). This is because there is no static dependency on these files, so it cannot be detected during deployment. Task-number: QTBUG-30751 Change-Id: I733603ee5d1c64bd7c5b9357eb5d993b9d0298f7 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com> Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>bb10
parent
94bed3ad14
commit
522c7ba1ac
|
|
@ -17,7 +17,10 @@ android {
|
|||
CONFIG += android_app
|
||||
}
|
||||
|
||||
isEmpty(CLASS_DIR): CLASS_DIR = .classes
|
||||
isEmpty(CLASS_DIR) {
|
||||
bundled_jar_file: CLASS_DIR = .classes.bundled
|
||||
else: CLASS_DIR = .classes
|
||||
}
|
||||
|
||||
CONFIG -= qt
|
||||
|
||||
|
|
@ -47,17 +50,16 @@ QMAKE_LIBS_OPENGL_ES2 =
|
|||
QMAKE_LIBDIR =
|
||||
QMAKE_EXTENSION_SHLIB = jar
|
||||
|
||||
# Override linker with dex (for Android) or jar (for other java builds)
|
||||
android {
|
||||
QMAKE_LINK_O_FLAG = --output=
|
||||
# Override linker with dex (for distributable Android archives) or jar (for other java builds)
|
||||
android:!bundled_jar_file {
|
||||
contains(QMAKE_HOST.os, Windows) {
|
||||
QMAKE_LINK = $$PWD/data/android/dx $$SDK_ROOT --dex
|
||||
DEX_CMD = $$PWD/data/android/dx $$SDK_ROOT
|
||||
} else {
|
||||
QMAKE_LINK = $$SDK_ROOT/platform-tools/dx --dex
|
||||
DEX_CMD = $$SDK_ROOT/platform-tools/dx
|
||||
}
|
||||
QMAKE_LINK_SHLIB_CMD = $$DEX_CMD --dex --output $(TARGET) $$CLASS_DIR
|
||||
} else {
|
||||
QMAKE_LINK_O_FLAG = "cf "
|
||||
QMAKE_LINK = jar
|
||||
QMAKE_LINK_SHLIB_CMD = jar cf $(TARGET) -C $$CLASS_DIR .
|
||||
}
|
||||
|
||||
# Force link step to always happen, since we are always updating the
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@ ANDROID_DEPENDS_DIR = $$MODULE_QMAKE_OUTDIR/lib/
|
|||
DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
||||
|
||||
!build_pass {
|
||||
!isEmpty(MODULE_PLUGIN_TYPES) {
|
||||
for(PLUGIN_TYPE, MODULE_PLUGIN_TYPES) {
|
||||
ANDROID_BUNDLED_FILES += "plugins/$$PLUGIN_TYPE"
|
||||
}
|
||||
}
|
||||
|
||||
!isEmpty(ANDROID_JAR_DEPENDENCIES) {
|
||||
for(JAR_FILE, ANDROID_JAR_DEPENDENCIES) {
|
||||
INIT_CLASS = $$section(JAR_FILE, ":", 1, 1)
|
||||
|
|
@ -26,6 +32,15 @@ DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
|||
}
|
||||
}
|
||||
|
||||
!isEmpty(ANDROID_BUNDLED_JAR_DEPENDENCIES) {
|
||||
for(JAR_FILE, ANDROID_BUNDLED_JAR_DEPENDENCIES) {
|
||||
INIT_CLASS = $$section(JAR_FILE, ":", 1, 1)
|
||||
!isEmpty(INIT_CLASS): INIT_CLASS = "initClass=\"$$INIT_CLASS\""
|
||||
JAR_FILE = $$section(JAR_FILE, ":", 0, 0)
|
||||
FILE_CONTENT += "<jar bundling=\"1\" file=\"$$JAR_FILE\" $$INIT_CLASS />"
|
||||
}
|
||||
}
|
||||
|
||||
!isEmpty(ANDROID_LIB_DEPENDENCIES) {
|
||||
for(LIB_FILE, ANDROID_LIB_DEPENDENCIES) {
|
||||
FILE_CONTENT += "<lib file=\"$$LIB_FILE\" />"
|
||||
|
|
@ -40,13 +55,19 @@ DEPENDENCY_FILE = $$ANDROID_DEPENDS_DIR$$TARGET-android-dependencies.xml
|
|||
}
|
||||
}
|
||||
|
||||
!isEmpty(ANDROID_BUNDLED_FILES) {
|
||||
for (BUNDLED_FILE, ANDROID_BUNDLED_FILES) {
|
||||
FILE_CONTENT += "<bundled file=\"$$BUNDLED_FILE\" />"
|
||||
}
|
||||
}
|
||||
|
||||
!isEmpty(FILE_CONTENT) {
|
||||
FILE_CONTENT = "<rules><dependencies><lib name=\"$$TARGET\"><depends>" $$FILE_CONTENT "</depends></lib></dependencies></rules>"
|
||||
write_file($$DEPENDENCY_FILE, FILE_CONTENT) | error("Aborting.")
|
||||
}
|
||||
}
|
||||
|
||||
!isEmpty(ANDROID_JAR_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS) {
|
||||
!isEmpty(ANDROID_JAR_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCIES)|!isEmpty(ANDROID_LIB_DEPENDENCY_REPLACEMENTS)|!isEmpty(ANDROID_BUNDLED_JAR_DEPENDENCIES)|!isEmpty(ANDROID_BUNDLED_FILES) {
|
||||
install_dependencies_file.files = $$DEPENDENCY_FILE
|
||||
install_dependencies_file.path = $$[QT_INSTALL_LIBS]
|
||||
INSTALLS += install_dependencies_file
|
||||
|
|
|
|||
|
|
@ -0,0 +1,3 @@
|
|||
TARGET = QtAndroid-bundled
|
||||
CONFIG += bundled_jar_file
|
||||
include(jar.pri)
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
TARGET = QtAndroid
|
||||
include(jar.pri)
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
CONFIG += java
|
||||
DESTDIR = $$[QT_INSTALL_PREFIX/get]/jar
|
||||
|
||||
PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/
|
||||
|
||||
JAVACLASSPATH += $$PWD/src/
|
||||
JAVASOURCES += \
|
||||
$$PATHPREFIX/QtActivityDelegate.java \
|
||||
$$PATHPREFIX/QtEditText.java \
|
||||
$$PATHPREFIX/QtInputConnection.java \
|
||||
$$PATHPREFIX/QtLayout.java \
|
||||
$$PATHPREFIX/QtNative.java \
|
||||
$$PATHPREFIX/QtNativeLibrariesDir.java \
|
||||
$$PATHPREFIX/QtSurface.java
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_PREFIX]/jar
|
||||
INSTALLS += target
|
||||
|
|
@ -1,19 +1,2 @@
|
|||
CONFIG += java
|
||||
TARGET = QtAndroid
|
||||
DESTDIR = $$[QT_INSTALL_PREFIX/get]/jar
|
||||
|
||||
PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/
|
||||
|
||||
JAVACLASSPATH += $$PWD/src/
|
||||
JAVASOURCES += \
|
||||
$$PATHPREFIX/QtActivityDelegate.java \
|
||||
$$PATHPREFIX/QtEditText.java \
|
||||
$$PATHPREFIX/QtInputConnection.java \
|
||||
$$PATHPREFIX/QtLayout.java \
|
||||
$$PATHPREFIX/QtNative.java \
|
||||
$$PATHPREFIX/QtNativeLibrariesDir.java \
|
||||
$$PATHPREFIX/QtSurface.java
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_PREFIX]/jar
|
||||
INSTALLS += target
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS += bundledjar.pro distributedjar.pro
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ ANDROID_JAR_DEPENDENCIES = \
|
|||
ANDROID_LIB_DEPENDENCIES = \
|
||||
plugins/platforms/android/libqtforandroid.so \
|
||||
libs/libgnustl_shared.so
|
||||
ANDROID_BUNDLED_JAR_DEPENDENCIES = \
|
||||
jar/QtAndroid-bundled.jar
|
||||
|
||||
load(qt_module)
|
||||
|
||||
|
|
|
|||
|
|
@ -8,6 +8,10 @@ DEFINES += QT_NO_USING_NAMESPACE
|
|||
|
||||
QMAKE_DOCS = $$PWD/doc/qtgui.qdocconf
|
||||
|
||||
MODULE_PLUGIN_TYPES = \
|
||||
platforms \
|
||||
imageformats
|
||||
|
||||
load(qt_module)
|
||||
|
||||
# Code coverage with TestCocoon
|
||||
|
|
|
|||
|
|
@ -11,6 +11,9 @@ DEFINES += QT_NO_USING_NAMESPACE
|
|||
#DEFINES += QUDPSOCKET_DEBUG QUDPSERVER_DEBUG
|
||||
win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x64000000
|
||||
|
||||
MODULE_PLUGIN_TYPES = \
|
||||
bearer
|
||||
|
||||
QMAKE_DOCS = $$PWD/doc/qtnetwork.qdocconf
|
||||
|
||||
load(qt_module)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@ QT = core-private
|
|||
DEFINES += QT_NO_USING_NAMESPACE
|
||||
win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x62000000
|
||||
|
||||
MODULE_PLUGIN_TYPES = \
|
||||
sqldrivers
|
||||
|
||||
QMAKE_DOCS = $$PWD/doc/qtsql.qdocconf
|
||||
|
||||
load(qt_module)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ DEFINES += QT_NO_USING_NAMESPACE
|
|||
win32-msvc*|win32-icc:QMAKE_LFLAGS += /BASE:0x65000000
|
||||
irix-cc*:QMAKE_CXXFLAGS += -no_prelink -ptused
|
||||
|
||||
MODULE_PLUGIN_TYPES = \
|
||||
accessible
|
||||
|
||||
QMAKE_DOCS = $$PWD/doc/qtwidgets.qdocconf
|
||||
|
||||
load(qt_module)
|
||||
|
|
|
|||
Loading…
Reference in New Issue