blob: 0f107017f46377c270e1e3e4b4cc03fde9571daa [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:FDL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Free Documentation License Usage
** Alternatively, this file may be used under the terms of the GNU Free
** Documentation License version 1.3 as published by the Free Software
** Foundation and appearing in the file included in the packaging of
** this file. Please review the following information to ensure
** the GNU Free Documentation License version 1.3 requirements
** will be met: https://www.gnu.org/licenses/fdl-1.3.html.
** $QT_END_LICENSE$
**
****************************************************************************/
/*!
\page android.html
\title Qt for Android
\brief Provides information about Android support in Qt.
\ingroup supportedplatform
Qt for Android enables you to run Qt 5 applications Android devices.
All Qt modules (essential and add-on) are supported except Qt \WebEngine,
Qt Serial Port, and the platform-specific ones (Qt Mac Extras,
Qt Windows Extras, and Qt X11 Extras).
The following configurations are supported:
\include supported-platforms.qdocinc android
\br
The following list summarizes what you can do with Qt for Android:
\list
\li Run \l{Qt Widgets}{Widget} and
\l{QML Applications}{QML} applications on the device
or emulator.
\li Support for native \l{Android Style}{Android style} with
Qt Quick Controls.
\li Handle \l{Qt Multimedia}{Multimedia} content in your Qt Quick 2
applications.
\li Get \l{Qt Sensors}{sensor} readings and react to the changes.
\li Retrieve current position data using satellite and network
information.
\li Connect and exchange data with \l{Qt Bluetooth}{Bluetooth}
and \l{Qt NFC}{NFC}-enabled devices.
\li Integrate Java code into your application using
\l{Qt Android Extras}.
\li Develop secure applications using OpenSSL library.
\li Create \l{Android Services}
\li Create and deploy Application Package using Qt Creator.
\endlist
The following topics provide more details about how to use Qt for Android:
\list
\li \l{Getting Started with Qt for Android}{Getting Started}
\li \l{Qt for Android - Building from Source}
\li \l{Porting to Android}{Porting a Qt Application}
\li \l{Qt for Android Examples}{Examples}
\li \l{Adding OpenSSL Support for Android}
\li \l{Android Services}{Creating Android Services}
\li \l{Third-party Android Libraries}{Including third-party Android libraries in an application}
\li \l{Qt Creator: Deploying Applications to Android Devices}{Deploying to the Device}
\li \l{Publishing to Google Play}
\li \l{Platform and Compiler Notes - Android}{Platform Notes}
\li \l{Android GNU C++ run-time licensing}
\endlist
*/
/*!
\page android-3rdparty-libs.html
\title Third-party Android Libraries
\brief Provides instructions to include third-party Android libraries in an application.
This guide describes how to include a Java-based third-party library in your application package.
There are many Java libraries which provide APIs that may be useful to your application.
One example is the \c{Google Play Services} add-on provided in the Android SDK. We will use this library
as an example in this guide, but the same approach may be taken to include other libraries, provided
that they have been made to be included as library projects in an Android application.
\section1 Prerequisites
This guide assumes that the \l{androiddeployqt} tool is used for constructing the deployment package.
When using Qt Creator for building and deploying, androiddeployqt is used behind the scenes, so this also
applies to development with Qt Creator. Explaining how to access the Java APIs after they have been
included in the application is not in the scope of this guide.
\section1 Including the Library in the Source
The very first thing we need to do is to copy the actual library project into the source of our
project. We want the contents of the library project to be copied without modifications into the
packaging directory, so we need to place it into the \c{Android Package Source Directory}. This
can be any directory which is pointed to by the \l{qmake} variable \c{ANDROID_PACKAGE_SOURCE_DIR}.
If you are using Qt Creator, you can quickly set up the directory structure by clicking on the
\gui{Create AndroidManifest.xml} button in the \gui{Deployment} settings of your project. This
will create an \c{Android Package Source Directory} and place the \c{AndroidManifest.xml} file
inside it. Copy the library project directory into this directory.
For example, once it has been installed via the \c{Android SDK Maintenance} application,
the \c{Google Play Services} library project is located under the path
\c{$ANDROID_SDK_ROOT/extras/google/google_play_services/libproject/google-play-services_lib}. If
the \c{Android Package Source Directory} of our project is \c{$PROJECT_ROOT/android}, then we
can copy the \c{google-play-services_lib} directory in there, creating
\c{$PROJECT_ROOT/android/google-play-services_lib}.
\section1 Adding the Library to the Project Dependencies
Once the library code has been copied into the project, we need to tell the Android build system
about it. This is done in the \c{project.properties} file. Create a file called \c{project.properties}
inside the \c{Android Package Source Directory} and add a line to it which assigns the relative
path of the library project to the property \c{android.library.reference.1}. If you want to include
multiple library projects, increment the counter at the end of the property name for each.
In our example, we would create \c{$PROJECT_ROOT/android/project.properties} and add the
following contents:
\badcode
android.library.reference.1=google-play-services_lib/
\endcode
\section1 Deployment
And that's it: Provided that the path referenced in the \c{project.properties} file is located
under the \c{Android Package Source Directory}, the deployment tool will copy it into the
packaging directory and perform the necessary steps to include it in your \c{APK} or \c{AAB}.
You can now add Java code to your application which accesses the APIs provided by the library
project.
*/
/*!
\page android-getting-started.html
\title Getting Started with Qt for Android
\brief Provides instructions to install and configure your development environment.
\section1 Installing the Prerequisites
In order to use \l{Qt for Android}, you need the following:
\list
\li \l{http://developer.android.com/sdk/index.html}{The Android SDK Tools}
\note If your Qt version is earlier than v5.9, use the SDK tools package
v25.2.5 or earlier.
\li \l{http://developer.android.com/tools/sdk/ndk/index.html}{The Android NDK}
\note Using Qt for Android with the GCC toolchain requires Android NDK
version \e r10e. For Qt 5.12 or later, use the latest
available version of NDK with \e android-clang toolchain.
\li \l{http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html}{Java SE Development Kit} (JDK) v6 or later. You can also use \l{http://openjdk.java.net}{OpenJDK} on Linux.
\endlist
After installing these tools, update the Android SDK by installing the API
and build tools packages required for development. You can install these packages
either through Android Studio or using the command line tools package you installed
earlier. For more details, refer to the
\l{https://developer.android.com/studio/intro/update.html}{Android Studio}
documentation.
\note Make sure to unpack the Android SDK and NDK to a writeable location that Qt Creator
can access later. Otherwise, Qt Creator won't be able to use \c sdkmanager or find all
components even if they were installed manually.
\section2 Updating the Android SDK
The command line tools provided by the Android SDK Tools package also enables updating
the SDK, but without a GUI. For example, the following command on Ubuntu updates the SDK
by installing the latest \c build-tools, \c platform-tools, \c emulator, and \c patcher
packages:
\badcode
./bin/sdkmanager --update
\endcode
To install a specific package, use \c sdkmanager from
\c{<ANDROID_SDK_ROOT>/tools/bin}. For example, the following command installs the
\c android-10 platforms package on Ubuntu:
\badcode
./sdkmanager "platforms;android-10"
\endcode
For more details, refer to the
\l{https://developer.android.com/studio/command-line/sdkmanager.html}{sdkmanager}
documentation.
\section1 Configuring Your Development Host
\section2 Windows
The default USB driver on Windows does not allow debugging using
Android Debug Bridge (ADB) tool. You must install the additional USB driver
provided by the \e extras Android SDK package. Use the following command from
the Windows command prompt to install the extras package:
\badcode
sdkmanager.bat "extras;google;usb_driver"
\endcode
After the package installation is complete, install the driver from
\c{<ANDROID_SDK_ROOT>/extras/google/usb_driver}. Try running a few basic
\l{http://developer.android.com/tools/help/adb.html}{adb} commands now
and check whether your Android device responds to it.
\section2 64-bit Linux
If you're developing on a 64-bit Linux machine, you must install the
following dependencies in order to run 32-bit executables like \c adb, which
allows Qt Creator to find devices to deploy to:
\badcode
sudo apt-get install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386
\endcode
To run the emulator, the following dependencies are also necessary:
\code
sudo apt-get install libsdl1.2debian:i386
\endcode
\section2 Qt Creator IDE
The Qt Creator IDE that came with the Qt 5 installation on your development
host, must be configured to enable developing applications for Android. Launch
Qt Creator and select \uicontrol Tools > \uicontrol Options >
\uicontrol Devices > \uicontrol Android to add the Android NDK and SDK paths.
For more details, refer to \l{Qt Creator: Connecting Android Devices}{Qt Creator Manual}.
\section1 Testing Your Setup
Now you can test your development setup by running the examples that came
with the Qt 5 installation. You can browse these examples in
Qt Creator \uicontrol Welcome mode. Use the \c android filter in the search
field to list all the examples tested on Android.
To develop a simple application from scratch, see \l{Creating a Mobile Application}.
*/
/*!
\page porting-to-android.html
\title Porting to Android
\brief Provides instructions to port your existing Qt application to Android.
In this section, we are going to port an existing Qt Application to
\l{Qt for Android}{Android} and deploy it to the device.
Most Qt applications should be portable to Android with ease, unless they
depend on a specific hardware or software feature not supported by Android.
If your application is not using any such feature, deployment is probably the
only step that demands some changes to your application.
\include porting-notes.qdocinc using resources
The other approach is to deploy the resources into the package's \c{assets}
directory. It is the best option if you want to achieve better
interoperability with the Android APIs. You can access all resources in the
directory using the "assets:" prefix. Unlike qrc, this approach is not a
cross-platform solution.
The following step-by-step instructions guide you to port an existing Qt Quick
application to Android using the qrc approach:
\list 1
\li Open the existing project in Qt Creator and configure it
with "Android for ARM" kit. For more information, see
\l{Qt Creator: Configuring Projects}
\li Identify all the resources used by your application and add them to one
or more qrc files.
Qt Creator updates your qmake project file with the "RESOURCES"
variable listing the qrc files you added.
\li To load or refer to the resources in the qrc file from your C++ code,
use the "qrc:" scheme followed by the absolute URL. For example, to
load the \c{main.qml} file from \c{resources.qrc}, you can use the
following C++ code:
\code
QQuickView viewer;
viewer.setSource(QUrl("qrc:/qml/main.qml"));
viewer.show();
\endcode
\note QML documents can refer to the contents in qrc files using the
relative path to the document. Such references do not require the
"\c{qrc:}" or "\c{:/}" prefix.
\li Save the changes to your project and run the application.
\endlist
\note Qt Quick Controls in the application will use native
\l{Android Style}{Android style} if the target device is running
Android 3.0 (API 11) or later. The application should function normally on
devices with Android versions earlier than v3.0, but without native style for
controls.
Qt Creator deploys your application on the Android device, if the
device is detected by the PC. Otherwise, it tries to run the application on an
AVD (Android Virtual Device). You will be prompted to create one if there are no
AVDs found.
*/
/*!
\page android-openssl-support.html
\title Adding OpenSSL Support for Android
\brief Provides instructions to package OpenSSL libraries with your Qt application for Android.
The Qt installation package comes with OpenSSL support but the OpenSSL libraries
are not part of the package due to legal restrictions in some countries. If your
application depends on OpenSSL, consider packaging the SSL libraries with your
Application Package (APK) as the target device may or may not have them. You
can use the \l{QSslSocket::supportsSsl()} static function to check for SSL
support on the target.
The following instructions guide you to build and add the OpenSSL libraries to
the APK:
\list 1
\li Download the latest OpenSSL 1.1.x sources from \l{http://www.openssl.org/source}.
\li Extract the sources to a folder and navigate to that folder using
the CLI.
\note If your development platform is Windows, you need \c msys with
\c perl v5.14 or later to build OpenSSL.
\li Add android llvm toolchain to your path:
\badcode
export PATH="<android_ndk_path>/toolchains/llvm/prebuilt/<host>/bin":$PATH
\endcode
\li Configure the OpenSSL sources to build for Android using
the following command:
\badcode
./Configure shared android-<arch> -D__ANDROID_API__=21
\endcode
\note You must consider enabling/disabling the SSL features based on the
legal restrictions in the region where your application is available.
See the \l{OpenSSL Configure Options}{SSL configure options} for details about
the configurable features.
\li Run \c{make SHLIB_VERSION_NUMBER= SHLIB_EXT=_1_1.so build_libs} to
build \c libcrypto and \c libssl shared libraries that are not versioned,
but with a \e _1_1 suffix. If you want to use a different suffix, then you must
set the \c ANDROID_OPENSSL_SUFFIX environment variable before you access the
Qt Network API. Without a suffix, Android 5 (API 21) will load the system
libraries \e libcrypto.so and \e libssl.so, which are OpenSSL 1.0, rather than
your libraries.
\note Android does not load versioned libraries.
\li Open your Qt project using Qt Creator and update the "Build Android APK"
settings to add \e libcrypto and \e libssl as additional libraries for
your project.
\li Run your application to see it running on the device.
\endlist
\note here \l{https://github.com/KDAB/android_openssl} you can find a script which
can be used to compile openssl for all android abis and also latest prebuilt libs.
Qt Creator builds your application and creates an application package (APK)
with the OpenSSL libraries bundled in it. Once the APK is ready, it uses \c adb
to deploy the APK on the target you chose and launch the application.
*/
/*!
\page android-publishing-to-googleplay.html
\title Publishing to Google Play
\brief Provides instructions to prepare your application for publishing.
\l{Qt for Android} provides a complete solution to develop, build, and package
your applications for Android. Most of these tasks, especially packaging and
deployment are handled by Qt Creator providing rich developer experience.
Every time you run the application using Qt Creator, an Android Application
Package (APK) is created and deployed onto the target (device or emulator) you
choose. With some minor changes to how the \e .apk is created, you can publish
your application on Google Play and monetize. The following
step-by-step instructions guide you to create an \e{.apk} that can go live
on Google Play:
\list 1
\li Open your application project using Qt Creator v3.0 or later and change
its \uicontrol Build settings to build release version.
\li Select \uicontrol {Create Templates} under \uicontrol Build settings to
create the template files such as \e AndroidManifest.xml and other
resources.
\note You can edit the \e AndroidManifest.xml in \uicontrol General or
\uicontrol {XML Source} mode.
\li Check for the following in \e AndroidManifest.xml:
\list
\li \uicontrol{Minimum required SDK} is set to API 9 or later.
\note Qt Quick Controls with native \l{Android Style}{Android style}
require API 11 (Android v3.0) or later.
\li Add \uicontrol{Application name} and \uicontrol{Application icon}.
\li \uicontrol Permissions list has all the required permissions.
\li \uicontrol Features list has the software or hardware features that your
application depends on. For example, NFC.
\endlist
\note Qt adds the default permissions and features based on the module
dependencies of your application. If you do not want these default permissions
and features, remove the \c{<!-- %%INSERT_PERMISSIONS -->} and
\c{<!-- %%INSERT_FEATURES -->} comments from \e AndroidManifest.xml. For
information on the manifest XML format, see \l{Android: App Manifest}.
\li Set up a \uicontrol keystore to sign the \e .apk. You can create a new
keystore if you do not have one. For more details, see
\l{Android APK}{QtCreator: Specifying Settings for Packages}.
\li Select \uicontrol{Open package location after build} and run your
application to build the \e .apk. Qt Creator builds the \e .apk and opens the
folder containing the \e .apk.
\li Log in to the \l{Google Play Developer Console} and upload the \e .apk
file, few screen captures of the application, and a description.
\endlist
Now your application is available to other Android device users via
Google Play. You can also choose to publish the application to a smaller
group, so that you can test and improve the application before publishing it to
a larger audience.
See \l{Deploying an Application on Android} for more information about how the
packaging is done and how you can influence it.
*/
/*!
\page android-services.html
\title Android Services
\brief Provides information about Android Services support in Qt.
Starting with Qt 5.7, you can create Android services using Qt. A service
is a component that runs in background, so, it has no user interface. It is
useful to perform long-term operations such as logging GPS, waiting for social
media notifications, and so on. A service will continue to run even if the
application that started it exits.
To create a service, do the following steps:
\list 1
\li Uncomment the service part of your \c AndroidManifest.xml.
\li Make sure the \c service tag contains an \c android:process=":some_name"
attribute. It is needed to force the \c service to run in a separate
process than the \c activity.
\li If you're using the same application (.so file) for activity and also
for service, you need to use \c android.app.arguments \c meta-data to
pass some arguments to your \c main function in order to know which one
is which.
\li To enable background running, uncomment \c android.app.background_running
\c meta-data and set it to true (\c android:value="true" ).
\endlist
Qt loads the \c .so file defined in \c android.app.lib_name \c meta-data,
and calls the \c main function with all the arguments set in
\c android.app.arguments \c meta-data.
See \l{http://developer.android.com/guide/components/services.html}{Android Services}
documentation for more information.
*/