Пытаюсь сделать APK-приложение для реального телефона, портировав программу на C++, использующую SDL2.
В качестве отправной точки использую:
1) Проект отсюда: https://github.com/pvallet/hello-sdl2-android
2) ОС Linux (Ubuntu), работа с командной строкой. Так как большинство примеров написаны под Linux.
3) Сборка через gradle. Всякие говно-студии избегаю, так как слабый комп 3 ГГц 2 ядра + 4 гига памяти всего.
Добился, чтобы проект успешно строился под целевую архитектуру, но есть проблемы:
1)
На реальном телефоне работает только приложение, построенное в debug, release отказывается даже устанавливаться. Почему? Как пролечить? ОС - клон ведроида "Миу-Миу"
2)
Приложение в первый раз работает неправильно: появляется окно, но текстура отсутствует. Если принудительно убить приложение, то приложение со второго раза работает как надо - текстура отображается.
2.5)
Первый запуск с инсталлятора - работает неправильно. См. проблему в пункте 2).
3)
Приложение висит в памяти, после закрытия окна. Необходимо принудительно килять его.
Пробовал собирать с последней версией SDL2: 2.0.14 и SDL2_image 2.0.5 - результат стал хуже: текстура не грузится даже и на 5-й раз.
Код на всякий случай:
Я ничего в нём не менял - просто тупо собрал и всё. В интернете нашёл упоминание, что перед return 0 надо делать exit(), но для ведроида это грязный метод.
Подскажите, в каком направлении копать?
Нужен надёжный ведроид-мост для портирования C/C++ - программ на SDL2.
Gradius
> Подскажите, в каком направлении копать?
Логировать всё и вся.
gamedevfor
> Логировать всё и вся.
По п. 3) Проверили другие приложения - они ведут себя точно также. А именно - висят после зарытия. И standby и quit оба висят в памяти.
Такова суть "Миу-Миу" наверное.
Gradius
> Такова суть "Миу-Миу" наверное.
Наверное там требуется какой то индивидуальный подход (читай нужен костыль) к разработке.
В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN. Ну и текстура у тебя залазит за границу дисплея, хотя это не должно быть критично, но вдруг глюки именно твоей оси.
Gradius
Вариант, перенести свою прогу на Java, чтобы воспользоваться удобством LibGDX не рассматриваешь? Имхо, гораздо удобнее, чем вечные проблемы со сборкой C++ кода для запуска под Android.
Рациональный подход в программировании - это использовать подходящий язык и фреймвормк под соответствующую задачу.
> Всякие говно-студии избегаю, так как слабый комп 3 ГГц 2 ядра + 4 гига памяти
> всего.
почему "говно-студии"? Это комп устаревший просто. Докупить оперативки до 16 гигов и все - можно более менее нормально в Android Studio работать.
Gradius
> На реальном телефоне работает только приложение, построенное в debug, release
> отказывается даже устанавливаться. Почему?
Возможно, с подписыванием что-то не то.
> Приложение в первый раз работает неправильно: появляется окно, но текстура
> отсутствует. Если принудительно убить приложение, то приложение со второго
> раза работает как надо - текстура отображается.
Там базовой петли как таковой и нет. Возможно, в полноценном приложение это вообще несущественно.
> Приложение висит в памяти, после закрытия окна. Необходимо принудительно
> килять его.
Это норма. И не факт, что оно висит именно в памяти, это может быть просто список ресент.
Короче, тебя это вообще волновать не должно, твое дело обеспечить функционал жизненного цикла приложения, все вот эти OnCreate, OnResume и т.п. Просто почитай мануал, там втыкать 15 минут. И сырцы java обертки у готовых рабочих прикладух посмотри, сэмплы - это сэмплы.
Olaf85
> В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN. Ну и текстура у тебя
> залазит за границу дисплея, хотя это не должно быть критично, но вдруг глюки
> именно твоей оси
OK, попробую. Результат напишу.
SergeyGaS
> Вариант, перенести свою прогу на Java, чтобы воспользоваться удобством LibGDX
> не рассматриваешь?
Боже упаси... Несколько сотен тысяч строк кода (C/C++) уже написано!
В Java я полный нуль вообще. Мне даже её философия и структура проектов непонятны. Дикий оверхед, по сравнению с тем же проектом на C/C++ и makefile.
SergeyGaS
> почему "говно-студии"? Это комп устаревший просто. Докупить оперативки до 16
> гигов и все - можно более менее нормально в Android Studio работать.
Любая компиляция проектов сводится к вызову программ через CLI-интерфейс (comand line interface). Зачем лишний раз изнашивать железо, ради сомнительного удобства свистоперделок?
Пишу проекты в блокноте, а собираю make-файлом и bash-скриптами. :)
Gradius
> 1)
> На реальном телефоне работает только приложение, построенное в debug, release
> отказывается даже устанавливаться. Почему? Как пролечить? ОС - клон ведроида
> "Миу-Миу"
С этим разобрался. Сгенерировал левый сертификат и подписал им релизный билд.
Сейчас приложение устанавливается, НО ведроидный инсталлятор всёравно выдаёт много запросов на подтверждение при установке приложения.
А повторно из проводника блокируется установка приложения. Только если скачать его с Телеграмма или Скайпа, тогда ставится. Что за у ведроида анальные ограждения??? У меня уже кирпичи сыпятся от негодования! На ПК и в голом железе всё просто, почему в ведре всё так фигово?
beejah
> Это норма. И не факт, что оно висит именно в памяти, это может быть просто
> список ресент.
> Короче, тебя это вообще волновать не должно, твое дело обеспечить функционал
> жизненного цикла приложения, все вот эти OnCreate, OnResume и т.п.
Это я уже понял :) Мне в принципе пофиг, просто хотелось как можно красивше сделать.
Olaf85
> В SDL_CreateWindow я бы ещё добавил флаг SDL_WINDOW_SHOWN
Нашёл другой пример, где этот флаг установлен. Код в спойлере:
Взят был отсюда: https://tinyurl.com/ybq7nvq8
Теперь работает с первого раза. Но также остаётся висеть в памяти после "закрытия" - без доработки java-куска.
Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity), как в вышеупомянутой статье.
Ну и на последок - картинка:
Gradius
> НО ведроидный инсталлятор всёравно выдаёт много запросов на подтверждение при
> установке приложения.
>
> А повторно из проводника блокируется установка приложения.
Это обычно в файле манифеста прописана куча запросов, но заглянув внутрь манифеста, вроде ни чего не вижу... Может gradle туда сверху что-то пишет?
SergeyGaS
> почему "говно-студии"? Это комп устаревший просто.
потому что именно "говно-студии". Ни чего хорошего она не даст, кроме увеличения размера файла, всё то же самое можно сделать без неё и часто быстрее и легче на других языках кроме явы.
Gradius
> Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity),
Ты, инфа 73%, что-то не то делаешь. Тебе вообще не надо ничего дорабатывать, просто найди на гитхабах (или что там у вас сейчас) сырцы (предпочтительно собранного и выложеного) приложения.
В этой херне можно копаться до бесконечности. Там, помимо "висит в памяти", херова туча нюансов.
Gradius
> На реальном телефоне работает только приложение, построенное в debug, release
> отказывается даже устанавливаться.
Возможно нет разрешения на установку не лицензионного ПО, галочки в панели разраба чекни
Gradius
> Приложение в первый раз работает неправильно
У app свои жизненные циклы и нужно уметь под них подстраиваться, раз сам все пишешь. При повороте экрана допустим умирает активити и заново создается. Может легко потеряться ссылка на ресурс или что-то типа того.
Gradius
> Приложение висит в памяти, после закрытия окна
Есть способы полностью закрыть app, но разрабы не рекомендуют, андроид сам знает когда и что закрывать, это нормальная работа. Твоя задача позаботиться о восстановлении ресурсов после того, как андроид их закроет.
Mirrel
> Это обычно в файле манифеста прописана куча запросов, но заглянув внутрь
> манифеста, вроде ни чего не вижу... Может gradle туда сверху что-то пишет?
Пока не ковырял это.
Подписывание самодельным ключом приводит к установке приложения на реальный телефон со 2-го раза. На эмуляторе отказывается запускать, выдавая ошибку: INSTALL_FAILED_UPDATE_IN_COMPATIBLE
Ниже даны скрины диалогов при установке приложения (релиз, подписанный самодельным ключом).
1) Скачиваем APK переданный с Телеграмма.
2)
3)
4)
5) Потом такой ОБЛОМ:
6)
7) Повторяем установку снова - а теперь вот так! Сравните с окном в 5 !!!
8) Открываем установленной приложение:
9) Ура !!!
Тот самый момент, когда офигеваешь от количества собственных усилий, затраченных на положительный результат:
beejah
> Ты, инфа 73%, что-то не то делаешь. Тебе вообще не надо ничего дорабатывать,
> просто найди на гитхабах (или что там у вас сейчас) сырцы (предпочтительно
> собранного и выложеного) приложения.
> В этой херне можно копаться до бесконечности. Там, помимо "висит в памяти",
> херова туча нюансов.
На гитхабах не всё собирается у меня. Да, в этой херне можно копаться очень долго, согласен! Поэтому я и уцепился за тот пример, который у меня работает и собирается.
Однако же я писал ранее, что на ведре Миу-Миу ни одно приложение не закрывается его кнопками. Только вручную выкидывать менеджером.
Gmassta
> Возможно нет разрешения на установку не лицензионного ПО, галочки в панели
> разраба чекни
Как залицензировать? Нужно чтобы было как из google play-маркета скачивалось - без лишних вопросов.
Как ?
Gmassta
> У app свои жизненные циклы и нужно уметь под них подстраиваться, раз сам все
> пишешь. При повороте экрана допустим умирает активити и заново создается. Может
> легко потеряться ссылка на ресурс или что-то типа того.
Из минусов, которые я заметил:
1) Очень медленная работа на чтение файлов из assets.
Загрузка данных перед началом очередного уровня игры - занимает несколько секунд.
Возможно, это из-за шифрования данных и их сжатия. На ПК работает моментально.
Есть способ ускорить?
Сами уровни работают сносно на 60 FPS гладко и без рывков , но загрузка данных перед началом уровней медленная.
2) Синяя полоска слева мешает и не даёт захватить 100% площади экрана.
А также она вносит паузу в работу приложения, если её случайно коснуться (если управляющие клавиши близко).
Есть способ убрать полоску? Как ?
3) Сенсорное управление в платформерах-экшенах, где требуется быстрая реакция - не лучшее.
Играть можно, выигрывать - только после того как пальцы заучат раскладку.
4) Не совсем понятно где рулить ключами оптимизации С/C++ - все файлы пересмотрел, не нашёл.
Где и как ?
Разработку веду в Линуксе, там же штатный эмулятор + Android NDK, SDK + Java SDK, RE + ...
Пришлось изрядно покурить моменты, связанные с правами доступа, генерацией ключей и многое другогое.
Mirrel
> потому что именно "говно-студии". Ни чего хорошего она не даст, кроме
> увеличения размера файла, всё то же самое можно сделать без неё и часто быстрее
> и легче на других языках кроме явы.
:)
Только жёсткий хардкор, никаких говностудий, только командная строка!Gmassta
Gmassta
> Есть способы полностью закрыть app, но разрабы не рекомендуют, андроид сам
> знает когда и что закрывать, это нормальная работа. Твоя задача позаботиться о
> восстановлении ресурсов после того, как андроид их закроет.
Я на этот сложный момент забил. Потому что:
Gradius
> Завтра попробую доработать java-кусок чтоб закрывалось (finishActivity), как в
> вышеупомянутой статье.
... ничего не дало.
P.S.
Ну и всё-же очень приятно, что ядро программы выполняется напрямую в инструкциях той архитектуры процессора, который стоИт в телефоне, без всяких там виртуальных Java и прочих нагромождений :)
Gradius
> Есть способ убрать полоску? Как ?
В манифесте no title bar прописать. Для скрытия софотовых кнопок операционки (back, home и т.д) курить immersive mode.