MyTetra Share
Делитесь знаниями!
Как в среде разработки Qt 5.9 включить поддержку Android
Время создания: 19.08.2018 17:42
Автор: Xintrea
Текстовые метки: linux, qt, qtcreator, android, компиляция, сборка
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Инсталляция Qt и сборка проектов
Запись: xintrea/mytetra_syncro/master/base/1511088774pejnco721m/text.html на raw.github.com

Для работы с Android, Qt 5.9.2 требует наличие в системе Android SDK и NDK.



Установка Android SDK


С момента появления среды разработки Android Studio, принцип получения и установки пакета Android SDK поменялся. Устаревшая страница с SDK:


http://developer.android.com/sdk/index.html


... теперь перенаправляется на страницу:


https://developer.android.com/studio/index.html


То есть, теперь просто так получить SDK невозможно. Он идет либо в комплекте со средой разработки Android Studio, либо его можно попробовать установить через специальную программу sdkmanager, который входит в состав набора программ, именуемый Android SDK Tools package. Этот набор программ можно скачать внизу страницы Android Studio. Прямая ссылка:


https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip


После скачивания, можно создать, например, каталог /opt/android, и распаковать в него данный архив. Программа sdkmanager будет лежать по пути:


/opt/android/tools/bin/sdkmanager


Для получения списка пакетов, которые может устанавливать/удалять sdkmanager, можно дать команду:


./sdkmanager --list


Будет выведено три списка:


  • Installed packages - уже установленные пакеты
  • Available Packages - доступные для установки пакеты
  • Available Updates - доступные обновления


Вроде как, чтобы установить то, что раньше входило в Android SDK, надо установить такие пакеты:


  • "build-tools;27.0.1" - кусок SDK, включает в себя adb и fastboot
  • "platforms;android-27" - кусок SDK, инструменты для API версии 27
  • "platform-tools" - кусок SDK, полностью именуемый как SDK Platform-Tools
  • "emulator" - кусок SDK, содержащий Java-эмулятор устройств Android


Установка делается следующей командой:


./sdkmanager "build-tools;27.0.1" "platforms;android-27" "platform-tools" "emulator"


Вот такой синтаксис. Для установки даже не предусмотрена опция --install. Результат инсталляции должен выглядеть вот так:


$ ./sdkmanager --list           

Installed packages:

 Path                 | Version | Description                    | Location              

 -------              | ------- | -------                        | -------               

build-tools;27.0.1 | 27.0.1 | Android SDK Build-Tools 27.0.1 | build-tools/27.0.1/

emulator | 26.1.4 | Android Emulator | emulator/

patcher;v4 | 1 | SDK Patch Applier v4 | patcher/v4/

platform-tools | 26.0.2 | Android SDK Platform-Tools | platform-tools/

platforms;android-27 | 1 | Android SDK Platform 27 | platforms/android-27/

tools | 26.0.1 | Android SDK Tools 26.0.1 | tools/


После инсталляции появятся следующие каталоги:


/opt/android/build-tools

/opt/android/emulator

/opt/android/licenses

/opt/android/platform-tools

/opt/android/platforms


Можно считать, что Android Software Development Kit установлен.



Установка Android NDK


Android NDK можно получить на этой странице:


https://developer.android.com/ndk/downloads/index.html


Содержимое данного архива тоже надо распаковать в каталог /opt/android, получится каталог, например /opt/android/android-ndk-r16.



Конфигурирование Qt Creator 4.4.1


Для конфигурирования необходимо знать пути до трех компонентов:


  • Android SDK
  • Android NDK
  • Java JDK


Примечание:


  1. Установка Java JDK тривиальна, происходит путем распаковки архива с сайта Oracle в каталог /opt;
  2. Для работы сборщика программ под Java, необходимо наличие установленного пакета ant из стандартного репозитария дистрибутива Linux.


Итоговые пути будут такими:


Android SDK: /opt/android/

Android NDK: /opt/android/android-ndk-r16

Java JDK: /opt/jdk1.8.0_152


Окно настройки выглядит так:





После задания этих путей в меню Инструменты - Параметры -Устройства - Вкладка Android, настройку можно считать законченой.



Настройка сделана. А будет ли все это работать?


Тут начинаются какие-то непонятки. Вроде бы говорят, что Qt Creator 4.4.0 и 4.4.1 имеют какой-то встроенный баг, из-за которого не видятся виртуальные AVD-устройства.


https://forum.qt.io/topic/83476/android-build-sdk-not-defined-check-android-settings-qt-5-9-1-qtcreator-4-4-0-with-android-studio/6


И модератор говорит, что исправлено будет только в версии 4.5:


According to the bug report, this issue will be fixed in Qt Creator 4.5, so it will take some serious time.


На практике проблема еще сложнее. Даже если есть физическое Android устройство, то все равно не работает компиляция под Android в режиме Debug. В режиме релиза сборка работает, и даже полученный apk можно залить вручную на устройство, и приложение успешно устанавливается и запускается.


А при компиляции в режиме отладки возникают вот такие ошибки:


16:30:41: Запускается: «/usr/bin/make»

/opt/android/android-ndk-r16/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++ -c -D__ANDROID_API__=16 --sysroot=/opt/android/android-ndk-r16/sysroot -isystem /opt/android/android-ndk-r16/sysroot/usr/include/arm-linux-androideabi -isystem /opt/android/android-ndk-r16/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem /opt/android/android-ndk-r16/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include -fstack-protector-strong -DANDROID -march=armv7-a -mfloat-abi=softfp -mfpu=vfp -fno-builtin-memmove -g -g -marm -O0 -Wall -W -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I. -I/opt/qt_5_9_2/5.9.2/android_armv7/include -I/opt/qt_5_9_2/5.9.2/android_armv7/include/QtQuick -I/opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui -I/opt/qt_5_9_2/5.9.2/android_armv7/include/QtQml -I/opt/qt_5_9_2/5.9.2/android_armv7/include/QtNetwork -I/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore -I. -I/opt/qt_5_9_2/5.9.2/android_armv7/mkspecs/android-g++ -o main.o main.cpp

In file included from /opt/android/android-ndk-r16/sources/cxx-stl/gnu-libstdc++/4.9/include/type_traits:35:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qglobal.h:45,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qtguiglobal.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/android/android-ndk-r16/sources/cxx-stl/gnu-libstdc++/4.9/include/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

#error This file requires compiler and library support for the \

^

In file included from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qglobal.h:98:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qtguiglobal.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qcompilerdetection.h:567:6: error: #error Qt requires a C++11 compiler and yours does not seem to be that.

# error Qt requires a C++11 compiler and yours does not seem to be that.

^

In file included from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qatomic.h:46:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qglobal.h:1158,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qtguiglobal.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qbasicatomic.h:61:4: error: #error "Qt requires C++11 support"

# error "Qt requires C++11 support"

^

In file included from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qstring.h:48:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qcoreapplication.h:44,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:44,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qchar.h:587:1: warning: identifier 'nullptr' is a keyword in C++11 [-Wc++0x-compat]

Q_DECL_CONSTEXPR inline bool operator!=(QChar lhs, std::nullptr_t) Q_DECL_NOTHROW { return !operator==(lhs, nullptr); }

^

In file included from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qobjectdefs.h:50:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qobject.h:46,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qcoreapplication.h:46,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:44,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qobjectdefs_impl.h:339:9: warning: identifier 'decltype' is a keyword in C++11 [-Wc++0x-compat]

template <typename F> static auto test(F f) -> decltype(((f.operator()((dummy<ArgList>())...)), int()));

^

In file included from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qtguiglobal.h:43:0,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/qguiapplication.h:43,

from /opt/qt_5_9_2/5.9.2/android_armv7/include/QtGui/QGuiApplication:1,

from main.cpp:51:

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qglobal.h:927:23: error: expected ',' or '...' before '&&' token

void qAsConst(const T &&) Q_DECL_EQ_DELETE;

^

/opt/qt_5_9_2/5.9.2/android_armv7/include/QtCore/qglobal.h:938:25: error: expected ',' or '...' before '&&' token

QForeachContainer(T &&t) : c(std::move(t)), i(qAsConst(c).begin()), e(qAsConst(c).end()) {}



Чтобы заработала компиляция в режиме отладки, можно прописать в файле проекта *.pro опцию:


QMAKE_CXXFLAGS += -std=c++11


После чего сборка программы работает, и заливка на реальное устройство тоже сработает.


Для того, чтобы заработала отладка на устройстве, на самом устройстве надо сделать две настройки:


1. Включить опцию "Отладка по USB"

2. Выключить опцию "Мониторинг приложений, установленных через ADB". Потому что описание этой опции звучит так: "Запрашивать подтверждение пользователя при установке через ADB". Если появится запрос на подтверждение пользователя, QtCreator не сможет нормально запустить процесс отладки, и застрянет где-то на этапе:


Running command "/opt/android/platform-tools/adb -s X9L021493 install -r /opt/qt_5_9_2/Examples/Qt-5.9.2/quickcontrols/extras/dashboard/android-build//build/outputs/apk/android-build-debug.apk"

...

[ 56%] /data/local/tmp/android-build-debug.apk


После таких настроек появится возможность отлаживаться на реальном устройстве.



В QtCreator 4.4.0 и 4.4.1 есть проблема: он не видит виртуальные Андроид-устройства (AVD). Связано это с тем, что опять поменяли поведение консольных утилит из пакета android-tools, и QtCreator теперь не может разобрать выхлоп списка AVD. И, похоже, эта проблема будет решена только в версии 4.5. Поэтому отладка на AVD пока остается под вопросом.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования