LINUX.ORG.RU

Странная неработоспособность Qt-программ на Android - 2

 ,


0

2

Ранее обсуждение было здесь: Странная неработоспособность Qt-программ. А нужно ли подписывать Qt-программы для Android?

До текущего момента я не мог воспользоваться adb logcat по причине того, что программы (одна - полноценная, вторая - просто пример с парой кнопок) неожиданно снова начали работать без переустановки и каких-либо действий.

Сегодня опять не запускаются. Logcat показывает следующее:

D/dalvikvm( 9929): Rejecting registerization due to div-int/lit8 v0, v3, (#2)
E/Qt      ( 8196): Can't create main activity
E/Qt      ( 8196): java.io.FileNotFoundException:
/data/data/org.qtproject.example.mytetra/lib/libplugins_platforms_libqminimalegl.so:
open failed: ENOENT (No such file or directory)
E/Qt      ( 8196): 	at libcore.io.IoBridge.open(IoBridge.java:416)
E/Qt      ( 8196): 	at java.io.FileInputStream.<init>(FileInputStream.java:78)
E/Qt      ( 8196): 	at java.io.FileInputStream.<init>(FileInputStream.java:105)
E/Qt      ( 8196): 	at org.qtproject.qt5.android.bindings.QtActivity.createBundledBinary(QtActivity.java:396)
E/Qt      ( 8196): 	at org.qtproject.qt5.android.bindings.QtActivity.extractBundledPluginsAndImports(QtActivity.java:416)
E/Qt      ( 8196): 	at org.qtproject.qt5.android.bindings.QtActivity.startApp(QtActivity.java:466)
E/Qt      ( 8196): 	at org.qtproject.qt5.android.bindings.QtActivity.onCreate(QtActivity.java:744)
E/Qt      ( 8196): 	at android.app.Activity.performCreate(Activity.java:5267)
E/Qt      ( 8196): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
E/Qt      ( 8196): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
E/Qt      ( 8196): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2295)
E/Qt      ( 8196): 	at android.app.ActivityThread.access$700(ActivityThread.java:150)
E/Qt      ( 8196): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1280)
E/Qt      ( 8196): 	at android.os.Handler.dispatchMessage(Handler.java:99)
E/Qt      ( 8196): 	at android.os.Looper.loop(Looper.java:176)
E/Qt      ( 8196): 	at android.app.ActivityThread.main(ActivityThread.java:5279)
E/Qt      ( 8196): 	at java.lang.reflect.Method.invokeNative(Native Method)
E/Qt      ( 8196): 	at java.lang.reflect.Method.invoke(Method.java:511)
E/Qt      ( 8196): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
E/Qt      ( 8196): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
E/Qt      ( 8196): 	at dalvik.system.NativeStart.main(Native Method)
E/Qt      ( 8196): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
E/Qt      ( 8196): 	at libcore.io.Posix.open(Native Method)
E/Qt      ( 8196): 	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
E/Qt      ( 8196): 	at libcore.io.IoBridge.open(IoBridge.java:400)
E/Qt      ( 8196): 	... 20 more
V/WindowManager( 9929): Window{21126b70 u0 Keyguard}mOrientationRequetedFromKeyguard=false
...
I/ActivityManager( 9929): Killing 8196:org.qtproject.example.mytetra/u0a10183: remove task

Что можно сказать по поводу этого вывода?

Девайс - Samsung Galaxy Tab 3

Обсуждение на багтрекере: https://bugreports.qt-project.org/browse/QTBUG-37164

Баг закрыли как невоспроизводящийся.

★★★★★

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

/data/data/org.qtproject.example.mytetra/lib/libplugins_platforms_libqminimalegl.so: open failed: ENOENT (No such file or directory)

это норм?

false ★★★★★
()
Последнее исправление: false (всего исправлений: 2)

зачем создавать новый тред если в старом 5 подписантов?

/data/data/org.qtproject.example.mytetra/lib/libplugins_platforms_libqminimalegl.so - он есть? размер вменяемый? читается?

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

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

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

Создал свой баг на багтрекере.

https://bugreports.qt-project.org/browse/QTBUG-43327

Но судя по тому, что такой же критичный баг не решен за полгода, надежды на разрешение нет.

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

В qt отдельных тредов вроде не создается, все в одном потоке. Если конечно не пользовать QThread, а у меня его и в помине нет.

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

Так оно же уехало вниз, люди не увидят.

Добавил там ссылко на это.

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

1. ты неправильно указал тему в багтрекере - не увидел CLONE
2. Jason Hihn все-таки решил свою проблему
3. лучше репортить на 5.4 (соответственно воспроизведя баг у себя на 5.4). Никому не охота копаться в непонятках предыдущих версий
4. попробуй сделать adb shell, и «cd /data/data/org.qtproject.example.mytetra/» - этот каталог должен быть доступен для входа и чтения

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

Попробовал:

$ ./adb shell
shell@android:/ $ cd /data/data/org.qtproject.example.mytetra/
shell@android:/data/data/org.qtproject.example.mytetra $ ls -l
opendir failed, Permission denied
255|shell@android:/data/data/org.qtproject.example.mytetra $
Xintrea ★★★★★
() автор топика
Ответ на: комментарий от dib2

Jason Hihn все-таки решил свою проблему

Я не понял, как он это сделал. Вроде отписался что проблема перестала воспроизводиться в 3.2 Beta QtCreator.

Но это же не решение.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea
255|shell@ja3g:/data/data $ file                                               
/system/bin/sh: file: not found
127|shell@ja3g:/data/data $ stat
/system/bin/sh: stat: not found

гребанный нелинукс

а если cd /data/data/org.qtproject.example.mytetra/lib/libplugins_platforms_libqminimalegl.so ? скажет что не директория если есть файл.

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

Но это же не решение.

в старых версиях софта не может быть ошибок? ставь 5.4 из коробки и пробуй воспроизвести

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

т.е. файла реально нет. апп сейчас запускается? а после ребута?

ну и для пущей уверенности:

cd /data/data/org.qtproject.example.mytetra/lib/
ls -l

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

ТС, оффтоп! Вот скажи, у тебя при работе программы на реальном девайсе - сыпется шлак в консоль? Помнится во времена necessitas можно было принтить в qDebug - то в консоли Qt Creator-а и появлялось, и ничего кроме, ничего лишнего. А все версии Qt5 гадят в консоль какими-то тоннами отладки. Как это отключить? Хочется иногда при работе программы что-то отпринтить для отладки, вывод есть но теряется в сотнях строк отстоя.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от dib2

До ls дело не доходит.

shell@android:/ $ cd /data/data/org.qtproject.example.mytetra/lib/
/system/bin/sh: cd: /data/data/org.qtproject.example.mytetra/lib: No such file or directory

Ща попробую ребутнуться.

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

Ребутнулся, проги запускаться не стали.

Я не пойму, в какой момент они снова начинают работать. Чаще не работают чем работают.

Тогда бы я посмотрел именно фактическое наличие проблемных файлов.

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

ТС, оффтоп! Вот скажи, у тебя при работе программы на реальном девайсе - сыпется шлак в консоль? Помнится во времена necessitas можно было принтить в qDebug - то в консоли Qt Creator-а и появлялось, и ничего кроме, ничего лишнего. А все версии Qt5 гадят в консоль какими-то тоннами отладки. Как это отключить? Хочется иногда при работе программы что-то отпринтить для отладки, вывод есть но теряется в сотнях строк отстоя.

Первое. В Win и в Linux отладка в Qt сыплется по-разному.

Под виндой отладочный вывод полон шлака, какие-то невменяемые сообщения с кусками кириллицы в неизвестной кодировке. Причем эти тонны сообщений видны только при отладке в QtCreator. Любой сборки - хоть отладка под десктоп, хоть отладка на девайсе. Такое впечатление, что это сообщения не программы, а самого QtCreator, когда он делает отладку.

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

Второе. Я подменяю вывод qDebug() следующим образом:

void setDebugMessageHandler()
{
 qDebug() << "Debug message before set message handler for target OS: " << globalParameters.getTargetOs();

 // Для десктопных операционок можно переустановить обработчик qDebug()
 // Для Андроида переустановка qDebug() приводит к невозможности получения отладочных сообщений в удаленном отладчике
 if(globalParameters.getTargetOs()=="any" ||
    globalParameters.getTargetOs()=="meego")
  {
   qDebug() << "Set alternative handler myMessageOutput() for debug message";

   #if QT_VERSION < 0x050000
    qInstallMsgHandler(myMessageOutput);
   #else
    qInstallMessageHandler(myMessageOutput);
   #endif
  }

 qDebug() << "Debug message after set message handler";
}


// Обработчик (хендлер) вызовов qDebug()
// Внутри этого обработчика нельзя использовать вызовы qDebug(), т. к. получится рекурсия
#if QT_VERSION < 0x050000
void myMessageOutput(QtMsgType type, const char *msg)
#else
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msgText)
#endif
{
 #if QT_VERSION >= 0x050000
 Q_UNUSED(context);
 #endif

 // #if DEBUG_PRINT==1

 #if QT_VERSION < 0x050000
  QString msgText( QString::fromUtf8(msg) );
 #endif


 if(!mytetraConfig.is_init())
 {
  smartPrintDebugMessage("[INF] "+msgText+"\n");
  return;
 }

 // Если в конфигурации запрещен вывод отладочных сообщений
 if(!mytetraConfig.get_printdebugmessages())
  return;

 switch (type) {
   case QtDebugMsg:
       smartPrintDebugMessage("[DBG] "+msgText+"\n");
       break;
   case QtWarningMsg:
       smartPrintDebugMessage("[WRN] "+msgText+"\n");
       break;
   case QtCriticalMsg:
       smartPrintDebugMessage("[CRERR] "+msgText+"\n");
       break;
   case QtFatalMsg:
       smartPrintDebugMessage("[FTERR] "+msgText+"\n");
       abort();
 }

 // #endif
}

void smartPrintDebugMessage(QString msg)
{
 if(globalParameters.getTargetOs()=="any" ||
    globalParameters.getTargetOs()=="meego")
  {
   QTime currTime = QTime::currentTime();
   QString timeText=currTime.toString("hh:mm:ss");
   msg=timeText+" "+msg;

   unsigned int messageLen=msg.toLocal8Bit().size();
   // printf("Len of line: %d\n", messageLen);

   fwrite(msg.toLocal8Bit().data(), sizeof(char), messageLen, stderr);
  }
 
 // В Android пока неясно, как смотреть поток ошибок, для андроида qDebug() не переопределяется
}

Тут видно как переопределяется хендлер. Но для Андроид я этого не делаю, так как не знаю, сработает ли fwrite(), нужно экспериментировать, все руки не дойдут. В Андроит тупо работает qDebug().

Но ты можешь переопределить, чтобы хотя бы весь qDebug() вывод сделать с префиксами "[DBG]" или подобному. По нему ты сможешь отгрепать что у тебя выводит сама программа.

Если под Андроид у тебя получится, отпишись.

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

Ясно, вижу костыль, но что ж - придется сделать. Кстати, а зачем fwrite если там же можно воткнуть QFile ;)

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от Xintrea

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

зы. выглядит... ...вырвиглазно слегка :)

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

experimental.

В pro-файле надо в самом начале прописать целевую ось, там в комментариях написано как делать.

Я знаю что вырвиглазно. Я знаю как оно должно выглядеть, но не могу сделать, ибо у меня версточный кретинизм. Уже второй месяц пилю только внешний вид, и это максимум что смог добиться. Проблема с разными разрешениями на Андроид девайсах.

Сейчас уже сделал макрозначения в QSS файле, которые опираются на размер иконки:

META_ICON_SIZE - размер иконки
META_ICON_HALF_SIZE - пол размера иконки
META_ICON_TWO_THIRDS_SIZE - две третьих размера иконки
META_ICON_QUARTER_SIZE - четверть размера иконки
META_ICON_FIFTH_SIZE - пятая часть размера иконки
META_ICON_SIXTH_SIZE - шестая часть размера иконки

И видимо еще добавлю ряд 1,2 1,3 1,5 1,7 1,8, 2. После этого можно будет заняться внешним видом, настроить отступы и размеры элементов. Но так как у меня версточный кретинизм, и QSS это совсем не CSS, а с кучей своих сюрпризов, я скорее всего не смогу этого сделать.

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

ну пару дней живет и работает (qt5.4.0). будем наблюдать

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

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

Я не знаю как это сделать даже под Linux, не то что под Android. Все мои попытки использовать -Wl,-rpath вызывала ошибки компиляции, не знаю что там еще нужно.

Пробовал statifier, через него получались статические бинари, но они не работали на половине тестовых дистрибутивов - не подходит libc или ядро.

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