diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> | 2013-04-26 16:23:16 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-05-01 11:24:15 +0200 |
commit | 522c7ba1acaa02904e810662017b19e55c328d11 (patch) | |
tree | e9055a8988120bb8d05495ba2c2eb9f54a66279d | |
parent | 94bed3ad148a6ecba91c0a32e0ee52deda3aec9f (diff) |
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>
-rw-r--r-- | mkspecs/features/java.prf | 18 | ||||
-rw-r--r-- | mkspecs/features/qt_android_deps.prf | 23 | ||||
-rw-r--r-- | src/android/jar/bundledjar.pro | 3 | ||||
-rw-r--r-- | src/android/jar/distributedjar.pro | 2 | ||||
-rw-r--r-- | src/android/jar/jar.pri | 18 | ||||
-rw-r--r-- | src/android/jar/jar.pro | 21 | ||||
-rw-r--r-- | src/corelib/corelib.pro | 2 | ||||
-rw-r--r-- | src/gui/gui.pro | 4 | ||||
-rw-r--r-- | src/network/network.pro | 3 | ||||
-rw-r--r-- | src/sql/sql.pro | 3 | ||||
-rw-r--r-- | src/widgets/widgets.pro | 3 |
11 files changed, 72 insertions, 28 deletions
diff --git a/mkspecs/features/java.prf b/mkspecs/features/java.prf index 6cbd690c37..25f6e66427 100644 --- a/mkspecs/features/java.prf +++ b/mkspecs/features/java.prf @@ -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 diff --git a/mkspecs/features/qt_android_deps.prf b/mkspecs/features/qt_android_deps.prf index 27814a90a5..ba37649201 100644 --- a/mkspecs/features/qt_android_deps.prf +++ b/mkspecs/features/qt_android_deps.prf @@ -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 diff --git a/src/android/jar/bundledjar.pro b/src/android/jar/bundledjar.pro new file mode 100644 index 0000000000..e82c01c51b --- /dev/null +++ b/src/android/jar/bundledjar.pro @@ -0,0 +1,3 @@ +TARGET = QtAndroid-bundled +CONFIG += bundled_jar_file +include(jar.pri) diff --git a/src/android/jar/distributedjar.pro b/src/android/jar/distributedjar.pro new file mode 100644 index 0000000000..15f362f629 --- /dev/null +++ b/src/android/jar/distributedjar.pro @@ -0,0 +1,2 @@ +TARGET = QtAndroid +include(jar.pri) diff --git a/src/android/jar/jar.pri b/src/android/jar/jar.pri new file mode 100644 index 0000000000..19501d7b29 --- /dev/null +++ b/src/android/jar/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 diff --git a/src/android/jar/jar.pro b/src/android/jar/jar.pro index 1955f16142..8d19c1b7d6 100644 --- a/src/android/jar/jar.pro +++ b/src/android/jar/jar.pro @@ -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 diff --git a/src/corelib/corelib.pro b/src/corelib/corelib.pro index 3b7eb11229..0a5cc04a17 100644 --- a/src/corelib/corelib.pro +++ b/src/corelib/corelib.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) diff --git a/src/gui/gui.pro b/src/gui/gui.pro index 062f00c4c4..b44f563b3e 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -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 diff --git a/src/network/network.pro b/src/network/network.pro index d2b2447611..79e357e0cb 100644 --- a/src/network/network.pro +++ b/src/network/network.pro @@ -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) diff --git a/src/sql/sql.pro b/src/sql/sql.pro index 4f5af51c52..10004cb445 100644 --- a/src/sql/sql.pro +++ b/src/sql/sql.pro @@ -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) diff --git a/src/widgets/widgets.pro b/src/widgets/widgets.pro index 18a4d57900..43f7ae8af3 100644 --- a/src/widgets/widgets.pro +++ b/src/widgets/widgets.pro @@ -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) |