LINUX.ORG.RU

Решил запилить Qt5 для андроида нормально.

 ,


1

2

Дано: Qt5 рулит, но есть проблемы с ним на андроеде: херово он собирается, глючит и занимает 35 метров. Challenge: уменьшить Qt, убрав оттуда лишнее, поправив глюки, запилить фичи вроде gl4 в quick2

Я нашел такие подводные камни

1)требуется -DQT_OPENGL_FORCE_SHADER_DEFINES иначе матерятся компиляторы шейдеров на андроиде(fly 256, еще планшет какой-то), эмуляторе(intel, fglrx, были жалобы на нвидию).

2)qtmultimedia jar.pri: API_VERSION = $$ANDROID_NDK_PLATFORM

3)в NDK надо подкостыливать ссылками каталог platforms: ln -s android-9 10 && ln -s android-14 15

4)в SDK/build-tools ln -s android-4.2.2 17.0.0 (иначе не работает make clean)

5)Патчи

вкусный патч для тех, кто хочет GL 3 или 4 в окне QtQuick2. Заодно помогает от fglrx

qtbase/src/gui/kernel/qtsurfaceformat.*: в класс QSurfaceFormat добавить

/*qsurfaceformat.h*/
public:  static const QSurfaceFormat& getDefault(){return m_default;}
void setDefault(){m_default=*this;}
private: static QSurfaceFormat m_default;
/*qsurfaceformat.cpp*/
QSurfaceFormat QSurfaceFormat::m_default;
qtdeclarative/src/quick/scenegraph/qsgcontext.cpp, в функцию QSGContext::defaultSurfaceFormat()
-QSurfaceFormat format;
+QSurfaceFormat format = QSurfaceFormat::getDefault();
Для fglrx сразу перед созданием первого qtquick2 окна:
#ifndef Q_OS_ANDROID
QSurfaceFormat format;
format.setProfile(QSurfaceFormat::CompatibilityProfile);
format.setOption(QSurfaceFormat::DeprecatedFunctions);
//format.setVersion(4,2);
format.setDefault();
#endif
иначе белый экран и громкие маты в консоли. Еще можно создать окно1, в него вложить окно qtquick и тоже все заводится без хаков. почему так - не знаю, наверно происки гомосексуалистов.

5.1)пытаюсь присобачить флаг -flto, пока не безрезультатно.

6)В андроиде есть libicu, openssl, и libjpeg. Используем их чтоб уменьшить размер библиотек qt. иначе куте с ssl обломится, а jpeg потянет за собой паровозом. Я взял библиотеки из /system/lib, скопировал их на sdcard, и оттуда утащил в NDK. версии библиотек: jpeg6b(пакет libjpeg62-dev), icu44(ахтунг! надо пересобирать для arm), заголовки openssl можно взять любые не сильно воняющие тухлятиной.

Если кому-то будет нужно, выложу переколбашенный qt5.1 и андроидофайлы на сервер.

принимаются идеи и предложения

☆☆☆

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

Как раз начал недавно курить Qt для ведра, и вот 2 фатальных недостатка:

1. Дохренажрётрамы 2. Тормозит рендеринг шрифтов(?)

На счёт тормозов, подозрения пали на рендеринг шрифтов. Т.к. без текста скроллист скролится плавно, только добавляешь многабукаф - начинает тупить. Хотел пилить прожку на кутях, но обломался из-за тормозов. Так-же ещё патчил openURL, через который QDesktopServices открывает файлы по асоциации с mime. Можно связаться через жабер, если тебе интересно.

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

Да, текст надо дебажить и дебажить. Причина в том, что текст на быстром скролле не надо рендерить

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

Прикол в том, что если к примеру юзануть QQuickPaintedItem, и перегрузить paint, то видно, что оно не вызывается постоянно, а только тогда, когда что-нибудь изменится, к примеру какой-нибудь проперти. То-есть, оно либо юзает gl-листы, либо юзает отрендеренный буффер, ну или ещё как.

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

Лол, они поменяли логику поведения ListView. Раньше он один раз создавал делегат, при его отображении и кешировал, сейчас же оно создаёт постоянно новый делегат на итем появившемся в видимости, а тот который пропадает из видимости - удаляется. Есенно, оно на каждый итем рендерит текст заново.

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

Возможно из-за соображения экономии памяти, но они этим ничего не выигрывают, т.к. фрагментацию памяти никто не отменял. Только лишь паразитная нагрузка на процессор.

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

cacheBuffer решает. Но выглядит как костыль, вообще странно, что по дефолту не кешируется.

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

Я попробую реализовать что-то под названием QWeakPointer, и добавить в qpa поддержку чистки всего, что ими адресуется по случаю облома с памятью. Это поможет решить проблему разумным путём.

ckotinko ☆☆☆
() автор топика
Ответ на: комментарий от vova7890

чуть не забыл, qt не умеет make confclean, сволочь. Вот костылескрипт, который я вчера ночью нарисовал:

if [ ! -d "$2" ]; then 
	mkdir "$2" || exit
fi
TIMESTAMP="$2/timestamp"

touch "$TIMESTAMP"

PWD=$(pwd);


function process_directory {
	echo process "$1"

   if [ ! -e "$1/$3" -a -e "$2/$3" ]; then
		rm -rf "$2/$3";
	elif [ -e "$1/$3" -a ! -e "$2/$3" ]; then
		if [ -d "$1/$3" ]; then
			case "$3" in
			src|include|doc|examples|qtwebkit|dist|3rdparty|tests|util|gnuwin32)
				ln -s "$PWD/$1/$3" "$2/$3" || exit
				;;
			*) 
				mkdir "$2/$3" || exit
				for item in `ls $1/$3`; do
					 process_directory "$1/$3" "$2/$3" "$item";
				done;
				;;
			esac
		else
			case "${3##*\.}" in
			cpp|c|h|hpp|xml|qml|bat)
				ln -s "$PWD/$1/$3" "$2/$3" || exit
				;;
			*)
				cp "$1/$3" "$2/$3" || exit
				;;
			esac
		fi
	elif [ "$1/$3" -ef "$2/$3" ]; then
		return
	elif [ ! -e "$2/$3" -o "$2/$3" -nt "$TIMESTAMP" ]; then
		cp "$1/$3" "$2/$3" || exit
	fi
}

for item in `ls $1`; do
	 process_directory $1 $2 $item;
done;
распаковать qt5 в каталог foo, сделать его полностью read-only, и дальше

script foo working_copy

ckotinko ☆☆☆
() автор топика

-DQT_OPENGL_FORCE_SHADER_DEFINES

У меня наоборот матерится с этим О_о

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

Таблетки мешают, к сожалению.

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