LINUX.ORG.RU

Компиляция и запуск стандартного примера Dashboard под Android

 , , ,


0

1

Решил посмотреть, как обстоят дела сейчас у Qt с возможностью компиляции под Андроид в среде Linux. Везде читаю что взят курс на мобильность, поэтому решил развернуть свежее программное обеспечение. Все делаю на Debian 9 Stable 64bit.

Установил Qt с официального сайта:

Qt 5.9.2 (64 bit)
QtCreator 4.4.1


Установил JDK:

jdk1.8.0_152


Установил Android SDK и NDK:

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/


Процесс установки инструментария под Android я записал в статье: Как в среде разработки Qt 5.9 включить поддержку Android.


Проблема 1

Не работает компиляция под Android в режиме отладки (странно, но в режиме релиза компиляция идет, формируется 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())  {}


Вот. Что с этим можно поделать? Как скомпилировать, как отлаживаться хотя бы на реальном устройстве? Отладка по USB на устройстве включена.


Проблема 2

Не работает создание/добавление AVD устройств. Вроде вот тут ее обсудили:

https://forum.qt.io/topic/83476/android-build-sdk-not-defined-check-android-s...

и модератор сообщил что болт, исправлять будем в Qt Creator 4.5. Но я хотел бы узнать, может у кого-то работает эмуляция в данной конфигурации и такой проблемы нет? А если есть, то какие на данный момент рабочие и самые свежие версии Qt и QtCreator, на которых можно работать с Android?

Кратко, ситуация такая: на реальном Android-устройстве отлаживаться невозможно, а Android-виртуалки невозможно запустить. Какой-то очень странный «курс на мобильность».

★★★★★

Последнее исправление: Xintrea (всего исправлений: 3)

Ответ на: комментарий от Xintrea

А черт его знает. Сейчас NDK сильно перепилили, а толком ни компиляторы не обновлены, ни чего-то интересного.

Ну погугли как его включить. Если там CMake, то прописать CMAKE_CXX_STANDARD 11.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

QMAKE_CXXFLAGS += -std=c++11

в *.pro файле.

Но я искал как самому qmake передать опцию компилятора -std=c++11, так и не нашел.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от a1batross

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

Running command "/opt/android/platform-tools/adb -s X9L0214930005121  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 не идет дальше. И точка остановки в main.cpp не срабатывает. То есть, отлаживаться невозможно.

Xintrea ★★★★★
() автор топика
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

В этот момент на устройстве надо подвердить инсталляцию программы, а после нажать запуск.

Вообще, процесс отладки он такой: запускается жабовый дебаггер, как-то по adb дёргается приложение и на девайсе должно показываться что-то вроде «Ожидается запуск отладчика», на Android процесс запускается под gdbserver, gdb к нему подключается.

Вообще, Android не спрашивает подтверждения инсталляции программы обычно. Если у тебя какой-то нестандартный Android покопайся в настройках разработчика, чтобы он такого не делал. Возможно, Qt Creator просто не ожидает такого поведения.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

А, вон в чем дело.

Нашел опцию «Мониторинг приложений, установленных через ADB» - ее надо снять, как ни странно.

Потому что в описании опции сказано: «Запрашивать подтверждение пользователя при установке через ADB.

Снял, и отладка заработала. Благодарю.

Теперь вопрос стоит по AVD, какого хрена они не подключаются.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Теперь вопрос стоит по AVD, какого хрена они не подключаются.

Я в своё время создавал виртуалки через AndroidStudio. Потом при запуске проекта в QtCreator появляется диалог, в котором можно выбрать эмулятор. Всё работало, только жутко тормозило, выше 4.4 мой комп не тянул.

P.S. И не накосячь с выбором версий API для NDK. Они в какой-то версии (двадцать что-то там) NDK поломали обратную совместимость, и если собрать с более новой, то на старых андрюшах не заведётся. Я собирал qt с 16 версией api.

ox55ff ★★★★★
()

Qt для Android до сих пор настолько сырой и неуклюжий, что быстрее разобраться с родными SDK и NDK, чем героически решать подобные проблемы на ровном месте, которых быть не должно.

Особенно ужасает порт QtWidgets на Android, сделанный «для галочки».

EXL ★★★★★
()
Ответ на: комментарий от EXL

Qt для Android до сих пор настолько сырой и неуклюжий

После длительного перерыва я читаю вот это:

https://habrahabr.ru/post/325198/

и весь такой радостный ставлю среду. И понимаю что как-то это всё _опять_ недоделано.

Сейчас у меня стоит дилема: начинать новый проект на Qt под Андроид, или таки начать учить Яву.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Много ты видел проектов на Qt в том же Google Play? Там куча подводных камней и чтобы хоть что-то собрать рабочее и отличное от «шаг влево, шаг вправо», нужно всё равно уметь в программирование под Android и быть уже знакомым как с самой Java, так и с кучей сопутствующих технологий: JNI, GUI на XML, стандартные API и прочее.

или таки начать учить Яву.

Бери любой тутор, который расказывает, как под Android формочки клепать и вперёд делать свой проект. Это будет гораздо быстрее, чем разбираться с кучей подводных камней порта Qt под Android:

Убираю status bar. Всё перекрашивается в странные цвета.

EXL ★★★★★
()
Ответ на: комментарий от Xintrea

Все зависит от того, что за проект. Если «две кнопки и три анимации» + С++ бэкэнд, то QML отличный вариант, а если много работы с текстом, то лучше писать нативно.

CrossFire ★★★★★
()
Ответ на: комментарий от a1batross

На мобильниках, серьезно? И что там такого уж вкусного и необходимого для тачскрина?

CrossFire ★★★★★
()
Ответ на: комментарий от EXL

Кстати, что касается настольных приложений на QML, VPN клиент над которым я работал таки релизнулся наконец — там на главной есть гифка с демонстрацией свистелок + версия под Линукс, но как я понимаю только платно.

CrossFire ★★★★★
()
Ответ на: комментарий от CrossFire

Я уже приводил в пример популярное десктопное приложение на QtQuick/QML — Genymotion.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Блин, я думал есть какой-то способ узнать об этом на самом GooglePlay. Это же надо каждое приложение установить.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Сейчас у меня стоит дилема: начинать новый проект на Qt под Андроид, или таки начать учить Яву.

нативные средства жабо-разработки для андроида такие же кривые. точно так же после каждого апдейта будешь часами/днями/неделями, в зависимости от уровня смекалки, разгребать, почему все развалилось. математически, ты получишь вдвое меньше проблем, т.к. будешь разгребать только косяки SDK, но не косяки Qt :)

waker ★★★★★
()

Сталкивался с проблемой разработки под андроид. Не смог подцепить OpenSSL, в итоге плюнул и за чрутил дебиан тестинг. Так и живем.

SR_team ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.