Update 2017-03-24: Added info about problems with Popups and Android BACK key
Update 2017-03-13: updated my openssl – repo to fix crash with QNAM
Update 2017-03-09: Added info Adding OpenSSL, added reference to comment from Tobias Hunger on ‘…choose a mkspec…’
Update 2017-03-07: Added a) very first iOS build signing issues and b) iOS Build Issues (patch bitcode.prf)
Update 2017-03-06: Critical QTBUG-59293 fixed – see patch
I’m not using the Maintenance Tool – I’m always installing a new Qt Release at a different location and also start Qt Creator with -settingsPath as blogged here
Then it’s easier to work with old and new release side-by-side and compare.
Update QML Imports
From a technical point you can use the ‘old’ imports. I’m always doing search/replace to update the imports. Then I’m sure all my QML files are accessing the newest Controls and Properties. Updating from 5.7 to 5.8 I replaced
import QtQuick 2.6 import QtQuick.Controls 2.0 import QtQuick.Controls.Material 2.0
with
import QtQuick 2.7 import QtQuick.Controls 2.1 import QtQuick.Controls.Material 2.1
Using a source control system like Git it’s a good idea to do this in an extra Branch – then it’s easier to go back if something went wrong.
First Test with Demo and Conference Apps
While writing this blog series on Qt for Mobile I developed some Demo Apps, where each Demo App has a specific Focus. This makes it easy to do the tests step-by-step.
I’m replacing the Imports, then compile and run the App on Android and iOS devices and take a look at Compile- and Application Output and Issues and go through the apps to see if all works as before.
My Demo Apps:
- Simple One Page App (Labels, Buttons, Icons)
- Stacked Pages APP (StackView)
- Swiped Pages APP (SwipeView)
- Tab Bar APP (Tab Bars)
- Bottom Navigation APP (Tool Buttons)
- Drawer Navigation APP (Drawer, Stacks, Swipe, Tabs, Pages)
- Business Data App (QObject* Data, ListView, Swipe-Delegate, DatePicker)
As next I’m testing my Conference Apps. These Apps are something more complex and I also test building release and upload to Google Play Beta Test and Apple TestFlight to see if Release also is working.
The good thing with the Demo and Qt Conference Apps: I published them Open Source to Github. So it’s easy for others to see what I changed or to verify problems.
When all my Demo and Conference Apps are working well, then the next step will be to do the same with my private customer repos.
Finally I can test and add new Controls / Features from QtQuickControls2 as J-P Nurmi blogged about here.
Let’s see what happened while doing the Update.
Mostly Harmless
I got many Warnings and Errors, but don’t panic, they’re mostly harmless.
Some Errors / Warnings / Issues are new – some exist a longer time. I’m listing them also here for devs new to ‘Qt for Mobile’
Very first build for iOS – signing issue
I moved my projects into a new 580 working dir and running the very first time an iOS Build (Debug or Release – doesn’t matter) the code compiles and then logs an error:
Provisioning profile "iOS Team Provisioning Profile: org.ekkescorner.xyz" doesn't include signing certificate "iPhone Developer: Ekkehard Gentz (4A4....VV3)". Code signing is required for product type 'Application' in SDK 'iOS 10.2' ** BUILD FAILED **
Opening the generated Xcode project and then doing the build again all is working as expected. Even deleting the build dir and building again it works.
This is caused by Xcode automatic provisioning and out of scope from Qt. (see QTBUG-59350)
So don’t panic if the iOS build fails – simply open the Xcode project one time.
QML import could not be resolved
Building Android Apps you’ll see some warnings like
Warning: QML import could not be resolved in any of the import paths: org.ekkescorner.data Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.impl Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Material.impl Warning: QML import could not be resolved in any of the import paths: QtQuick.Controls.Universal.impl
There’s nothing wrong with this. Here’s an old Bug: QTBUG-47389
You can ignore this. Hopefully one day this will be fixed.
QQmlComponent: Component is not ready
While configuring my projects for Android, OSX, iOS I found under General Messages:
QML module does not contain information about components contained in plugins. Module path: /daten/_qt_sdks/sdk_580/5.8/android_armv7/qml/QtGraphicalEffects See "Using QML Modules with Plugins" in the documentation. Automatic type dump of QML module failed. Errors: "/daten/_qt_sdks/sdk_580/5.8/clang_64/bin/qmlplugindump" returned exit code 3. Arguments: -nonrelocatable QtGraphicalEffects 1.0 . Error parsing dependencies file <outputOfQmlimportscanner>:illegal value at 0 failed to proecess output of qmlimportscanner QQmlComponent: Component is not ready file:///daten/_qt_sdks/sdk_580/5.8/android_armv7/qml/typelist.qml:2:1: plugin cannot be loaded for module "QtGraphicalEffects": '/daten/_qt_sdks/sdk_580/5.8/android_armv7/qml/QtGraphicalEffects/libqtgraphicaleffectsplugin.so' is not a valid Mach-O binary (invalid magic 7f454c46)
same happens with “QtQuick.Controls.Styles.Android”. From J-P Nurmi I got confirmation that I can ignore this.
For the first one on “QtGraphicalEffects” I wrote a Bug Report: QTCREATORBUG-17819.
You can ignore these errors.
Qt Quick Controls 2 ‘Binding Loops’
Some of my Apps are reporting Binding Loops.
On Android:
W libtab_pages_x.so: file:///data/data/org.qtproject.example.tab_pages_x/qt-reserved-files/qml/QtQuick/Controls.2/Material/TabBar.qml:52 ((null)): file:///data/data/org.qtproject.example.tab_pages_x/qt-reserved-files/qml/QtQuick/Controls.2/Material/TabBar.qml:52:18: QML ListView: Binding loop detected for property "implicitWidth"
On iOS:
qrc:/qt-project.org/imports/QtQuick/Controls.2/Material/TabBar.qml:52:18: QML ListView: Binding loop detected for property "implicitWidth"
same happens for “preferredHighlightEnd”.
Unfortunately I wasn’t able to create a small test scenario yet, but will try again and open an Issue later.
Most important: You can ignore this Warning.
Please update your kit or choose a mkspec for qmake
Configuring a project for iOS I got
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++" is used by qmake, but "/usr/bin/clang++" is configured in the kit. Please update your kit or choose a mkspec for qmake that matches your target environment better.
I created a bugreport: QTCREATORBUG-17794
From qt-creator List I got confirmation: This message is wrong and you can ignore this.
see here a comment from Tobias Hunger why this happens.
-headerpad_max_install_names is ignored
Building project for iOS I got this Issue:
:-1: warning: -headerpad_max_install_names is ignored when used with -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES)
From qt-creator List I got confirmation that this can be ignored. See also codereview 185929 –
so next Qt releases will have this fixed.
member of multiple groups (“Supporting Files” and “Resources”)
Compiling a project for iOS it may happen that you get some warnings like this:
xcodebuild[5107:303392] warning: The file reference for "/daten/_qt_workspaces/work_580/c2gQtCon_x/images.qrc" is a member of multiple groups ("Supporting Files" and "Resources"); this indicates a malformed project. Only the membership in one of the groups will be preserved (but membership in targets will be unaffected). If you want a reference to the same file in more than one group, please add another reference to the same path.
from QTCREATORBUG-14926: You can ignore this.
iOS Release Build Issues (Patch bitcode.prf)
So far all debug builds worked well. As next tested release builds and upload to GooglePlay BetaTest and Apple Testflight. Android Builds are running without any problems, but iOS Release Build filled my Issues Pane with 192 Issues – logging always:
:-1: warning: argument unused during compilation: '-fembed-bitcode-marker'
I created QTBUG-59352 – got info that similar bug was already reported (QTBUG-58754) and fixed: codereview
Fortunately this Warning again can be ignored. But it’s annoying building releases with hundreds of warnings. Thx to @jakepetroules I got infos HowTo patch bitcode.prf. You’ll find this file here:
...sdk_580/5.8/ios/mkspecs/features/uikit/bitcode.prf
Open this file and replace the content by:
lessThan(QMAKE_XCODE_VERSION, "7.0") { warning("You need to update Xcode to version 7 or newer to support bitcode") } else: !macx-xcode { # Simulator builds and all debug builds SHOULD use -fembed-bitcode-marker, # but unfortunately the -fembed-bitcode and -fembed-bitcode-marker driver # flags do not work in conjunction with -Xarch, so we'll have to let it use # the "wrong" flags for now (note that this issue affects only the Makefile # generator). We also don't want the flags to be passed in Xcode builds, as # the Xcode ENABLE_BITCODE setting will take care of that for us. release { QMAKE_CFLAGS += -fembed-bitcode QMAKE_CXXFLAGS += -fembed-bitcode QMAKE_OBJECTIVE_CFLAGS += -fembed-bitcode QMAKE_LFLAGS += -fembed-bitcode } else { QMAKE_CFLAGS += -fembed-bitcode-marker QMAKE_CXXFLAGS += -fembed-bitcode-marker QMAKE_OBJECTIVE_CFLAGS += -fembed-bitcode-marker QMAKE_LFLAGS += -fembed-bitcode-marker } }
Now all -fembed-bitcode-marker issues are gone 🙂
Now we’re leaving the comfort zone.
Buttons remain some color of ripple effect
Suddenly I noticed a strange behavior in my more complex apps: Using the Drawer or Bottom Navigation Bar some color from pressing the buttons down remains after fingers are released. Fortunately this was fixed soon and the Drawer is working again (see patch)
Only one use-case left, where the Menu ToolButton remains some color:
Seems the ripple effect wasn’t reset completely while the Drawer is opening on top. At the moment I didn’t found a way to create a small test-case, but will try later agein.
Fortunately I found a workaround using a Loader toggling between two different Components of same ToolButton.
// ToolButton... onClicked: { navigationBar.open() favMenuBugfix = !favMenuBugfix } -------- Loader { id: favMenuLoader sourceComponent: favMenuBugfix? favMenuComponent1 : favMenuComponent2 } Component { id: favMenuComponent1 DrawerFavoritesMenuButton { } } Component { id: favMenuComponent2 DrawerFavoritesMenuButton { } }
Adding OpenSSL
As you probably know, Google removed openssl from Android7, so you have to add openssl libraries built by yourself.
My first projects with Qt 5.7 have used http only (they’re running behind firewalls on managed devices so this is secure)
All worked well without the need to add openssl – but it was on my ToDo list.
Qt 5.8 did some things different and now my Qt 5.8 apps are crashing from QNetworkAccessManager. From discussions in Qt Forums I’ve seen I’m not the only one seeing these differences between 5.7 and 5.8
There’s a documentation HowTo add OpenSSL support: http://doc.qt.io/qt-5/opensslsupport.html
unfortunately this fails on MacOS with error
unknown argument: '-mandroid'
long discussion in Qt Forum and on the Lists, but didn’t get it run – tried many hours. So I opened QTBUG-59375
finally from Android List I got a hint from Marco Piccolino and I found two .sh scripts doing the job.
More infos and HowTo use it in your own projects you’ll find at my github repo: https://github.com/ekke/android-openssl-qt
There are also some github projects providing prebuilt .so libraries, but I don’t want to include .so libs not built by myself from origin sources.
Hint: I got crash reports from users where openssl could crash if doing multi requests using QNetworkAccessManager. I had to add -DOPENSSL_THREADS. updated my github repo with the correct script: https://github.com/ekke/android-openssl-qt/commit/39d3d4122a132f1f73f7e7ed079de3f067775dde
Popup && Android Back Key problems
There was much work on Popups and (new with 5.8) Dialogs. Popups now also support ESC keys. But I run into two problems – see also QTBUG-59670
Popup without closePolicy: Android BACK quits the APP
There’s a new default closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
But this doesn’t work on Android. Using Android BACK Key closes the APP without a chance to catch the key.
Workaround: set the policy explicitely – per ex. Popup.CloseOnPressOutside
Don’t use Popup.CloseOnEscape
Now this is working:
Keys.onBackPressed: {
event.accepted = true
// do something
}
Modal Popup doesn’t block Android BACK Key
Using a modal Popup this should block all Shortcuts and Back key.
But this doesn’t work using Android BACK Key. This time the key goes thru to Keys.onBackPressed.
Workaround: manage this blocking behavior by yourself.
Here’s the Popup:
Popup { id: popup modal: true closePolicy: Popup.NoAutoClose // your content onOpened: { appWindow.modalPopupActive = true } onClosed: { appWindow.modalPopupActive = false } }
and in your main.qml:
ApplicationWindow { id: appWindow width: 410 height: 680 visible: true ... property bool modalPopupActive: false ... Keys.onBackPressed: { event.accepted = true if(appWindow.modalPopupActive) { showToast(qsTr("Back key not allowed")) return } ... } }
QTBUG-59670 is classified as critical so I’m sure will be fixed for Qt 5.9
Text Selection Handles
There are some problems with Text Selection Handles – see next Page.
As I promised: updating your APP from 5.7 to 5.8 is mostly harmless 😉
I’ll tweet @ekkescorner if finding more issues while working on my apps and I’ll blog about new features like Dialogs and more.