Как портировать приложение андроид
В конце данной статьи мною был озвучен план сделать порт под Android. Тут я попытаюсь описать проблемы, с которыми я столкнулся и методы их решения. Сразу хочу оговорится, что опыта работы с Android на данный момент ровно 2 месяца и возможно некоторые решения опасны или даже не приемлемы на данной платформе.
Движок
Движок (хобби) находится в разработке уже 10 лет.
Движок полностью написан на C/C++, до начала портации на Android поддерживал iOS и Windows.
Логика, рендеринг, звук — все на C/C++.
Файловая система
Важная особенность которая сделала портацию на Android очень простой — это файловая система движка.
Итак: вся работа с файлами в движке основана на интерфейсе IStream, архитектура движка поддерживает фабрику объектов, и её кастомизацию.
Ничего нового и все довольно стандартно.
Так как все ресурсы запрепроцесенны в .pak файл, то для Android системы пришлось написать свою реализацию IStream специально для работы с Java.
Инициализация данного ресурса на Java
Нейтив класс все вызовы open,read,seek транслирует опять в Java
Java реализации чтения данного стрима с возвратом данных назад в нейтив
Взаимодействие с нативным кодом из С/C++
За обработку вызовов платформо зависимых реализаций отвечает очень простая связка классов
Псевдо код:
Для iOS своя реализация на Objective-C а для Android своя реализация на JNI->Java.
Рендеринг
Нейтив часть работает с использованием OpenGL, для Android были сделаны минимальные изменения. Как в последствии оказалось этого было недостаточно. Дело в том что на Windows и на iOS текстуры не теряются когда приложение уходит в бакграунд, а вот для Android это происходит всегда. В движке уже был менеджер текстур (в основном для отладки) и добавить перезагрузку ресурсов оказалось не сложно.
Сборка
В самой первой статье я писал о том, что изначально компилировал iOS с использованием toolchain и у меня были настроенные makefile. Вот тут то мне это и пригодилось. Были дописаны таргеты для сборки с использованием Android NDK, добавлен степ в билдеры Eclipse и все взлетело. Да, можно использовать билд систему из Android NDK samples. Её я использовал только для выяснения параметров которые используются для вызовов gcc.
OpenFenit AdMob
Интеграция обоих библиотек прошла без проблем — четко по инструкции разработчиков
Proguard
Тут все более или менее понятно — нужно только позаботится о том чтобы ваши JNI Native бинды не обускейтились
Средства разработки
Железо: Kindle Fire, и пару планшетов и мобильных телефонов друзей(для тестирования).
Софт: Eclipse с плагинами
Шок номер 1
Android Market это не AppStore. Там все по другому. Там нет категории New.
Для сравнения на AppStore в первый день релиза было 800+ скачек, во второй 2000+, на Andoid Market официальная первая сотня скачек была получена только на третий день. Активность по раскрутке для обоих платформ была одинакова
Шок номер 2
Если ваше приложение бесплатное вы можете свободно распространять apk, любой человек может проинсталировать себе данное приложение с любого источника. Если это сделаете не вы, то за вас это сделают другие.
Шок номер 3
Бестиарий устройств велик. Количество проблем соответственно.
Amazon
Процесс ревью на Amazon AppStore for Android занимает неделю, плюс еще несколько дней пока приложение появится в списке AppStore на Kindle Fire. Количество скачек и динамика соответствует Android Market
Реклама
Лучи ненависти Корпорации Добра — уже неделя как рекламный баннер был отправлен на апрув. До сих пор тишина.
Деньги
На данный момент количество денег (напомню в игре только реклама) которые приносит iOS версия в 40 (сорок) раз больше чем версия для Android. Понятно, что сравнение не корректно и надо подождать как минимум еще пару месяцев пока не стабилизируется количество постоянных игроков в день.
UPDATE: В секции звука я описал причину сборки только для ArmV7 Android устройств.
Доброго времени суток, уважаемый энтузиаст Android. Я очень долгое время изучал различные языки программирования (в основном HTML, CSS и JavaScript), способы, лазил по американским сайтам профессиональных разработчиков, в том числе XDA, Google developers и т.д., и наконец понял что от чего зависит в этом сложном и ещё не изведанном мире моей любимой операционной системы. На всю эту работу у меня ушло больше 1.5 года. Теперь, я решил передать свои знания, чтобы вам не тратить лишнего времени. Конечно, благодаря этому уроку вы не научитесь языкам программирования, вы просто узнаете “шаблон” , по которому просто можно портировать игры и приложения с ARMv7 на ARMv6, изменять максимальную поддерживаемую версию Android OS и взламывать игры.
Ведь эти крякнутые и портированные игры не из воздуха берутся в Интернете.
Первое о чём я расскажу – просмотр исходного кода *.apk
Для начала установите Java Машину , и зайдите в Apk Manager Multi Tool, при помощи файла Script.bat, что находится в папке APK Manager. Программа рабочая. От нас требуется выбрать файл, который мы будем распаковывать. Пишем в открывшейся консоли 25 и жмём Enter, и выбираем .apk файл (изначально кладите их в папку place-apk-here-for-modding, имя файла делайте коротким, и без всяких знаков, нужно чтоб имя файла не было Horn&^%,q
После того, как мы выбрали файл, с которым будем работать в консоли пишем цифру 9 и жмём Enter. Видим как идёт процесс декомпиляции.
После этого идём в папку Projects (в папке с APK менеджером). Видим папку Horn.apk (Имя Horn я использую как пример). В этой папке и лежат заветные исходники. Точно так же мы заходим в менеджер и нажимаем 11 (компиляция/сборка *.apk). Apk запаковывается. Вот и весь способ распаковки и запаковки приложений. Далее мы будем применять этот способ для портирования и изменения поддерживаемой версии Android OS.
Изменение максимально поддерживаемой версии Android OS.
Допустим, игра требует высокую версию Android, например 4.1, но ведь далеко не все ещё обновились на эту версию, и многие вряд ли когда-нибудь смогут обновиться. Для этого и предназначен следующий способ.
Распаковываем .apk и заходим в файл AndroidManifest.xml и ищем строчку:
“Число” здесь играет роль поддерживаемой версии Android, но не саму версию, а код этой версии, точнее сказать – уровень API. Все они указаны в этой таблице ниже:
Версия Android OS
Android 4.0.3, 4.0.4
Android 4.0, 4.0.1, 4.0.2
Подставляем нужное нам число, НО сразу предупреждаю – не ставьте слишком низкое число, например для очень классной игры, иначе приложение не откроется, и вы увидите на экране телефона весёлую надпись “Приложение не отвечает. Подождать ?” . Чтобы такой ошибки не возникло вполне хватит цифры от 8 до 10.
Дополнительно, для тех, кто хоть что-то понимает в HTML.
Далее сохраняем файл, и компилируем .apk. ГОТОВО ! Одно мы научились делать.
Приступим к изменению Видео ускорителя (Nvidia Tegra, Mali, Adreno, PowerVR)
Таким же способом, что и выше декомпилируем .apk, заходим в AndroidManifest.xml и ищём строчку
Я в этот раз не стану нагружать Вас разными цифрами, и рассказывать, что к чему. Просто вместо числа напишите слово integer (Поддержка всех видео ускорителей). То есть в конечном результате получается так :
Специально для Adreno 200-205 и слабых устройств – пишем число 65537 или 65536.
Эту тему изучили.
Ещё хотелось бы рассказать о постоянной проблеме – это когда файлы не перемещаются на sdcard.
Заходим в AndroidManifest.xml и находим строку или двустрочную надпись (обычно в самом верху)
Следует вместо Куда устанавливать ?! прописать одно из следующих значений :
Приложение будет устанавливать только на внутреннюю память, и не даст разрешения на перенос на внешний носитель
По умолчанию установит на внутреннюю память, но есть возможность перемещения на sdcard
Функция переводится как “предпочитать внешнюю память”. То есть приложение будет устанавливать сразу на внешний носитель, но нет гарантии, что оно будет это выполнять на 100%
То есть, если мы хотим, чтобы приложение установилось на внутреннюю память, но была возможность перемещения на sdcard, то пишем auto. В итоге получается :
Запаковываем, и вуаля ! Всё переноситься.
Далее самое интересное – как портировать игры с ARMv7 на ARMv6 !
Каждое приложение содержит библиотеки + реестр (в одном, или нескольких файлах) для использовании его на сильных устройствах. Также бывает графические библиотеки, будем называть их “Либы”(от англ. Libs)
В графических библиотеках содержаться только те текстуры, которые должны воспроизводиться только на ARMv7. В основном это mpg текстуры (libmpg.so или что-то похожее). Ещё есть звуковые файлы высокого качества, работают по такому же принципу как и графические. В основном это .vorbis формат (libvorbisidec.so или что-то похожее)
Приступим к делу,
Декомпилируем .apk и заходим в папку lib / libs ищем папку armeabi-v7a, и просто изменяем её название на armeabi. И просто запаковываем. Это самый ленивый способ и самый малоработоспособный.
Только если ты не опустил руки. Значит ты действительно хочешь узнать как это делается, что даже не поленился пролистать 4 страницы, то вот инструкция
P.S. Я же не корыстный человек, всё только для Вас, чтобы вы продолжили моё дело.
Как написано выше папку armeabi-v7a копируете в текущую папку (lib)
И переименуйте её в armeabi. В итоге у Вас получается две папки – armeabi и armeabi-v7a.
После этого папку lib переименуйте в libs – для тех, кто знает английский – мы поменяли единственное число (библиотека) на множественное (библиотеки).
У Вас должно быть 4 готовых варианта .apk для ARMv6 и все должны быть разные. Сейчас объясню.
Первый .apk – Всё как написано выше и запаковываем. (без доп. действий)
Второй .apk – Если в папке armeabi у Вас есть графический lib, то удалите его и запаковывайте
Если ни один из них не идёт на 800mhz + ARMv6, то либо вы что-то не правильно сделали, либо игра НЕ портируется на ARMv6.
Если вы только осваиваете Android и хотите создать свою собственную прошивку либо просто встроить приложение в Android, то прошу под кат.
Для чего встраивать приложения в Android?
- Создание кастомных прошивок
- Замена внешнего вида (лаунчера)
- Замена стандартных встроенных менее функциональных программ, на любимые программы аналоги (продвинутый калькулятор, будильник)
- Разгрузить память для установки приложений.
Быстрая интеграция пользовательских приложений в системные с помощью Link2SD
Данный способ понравиться многим пользователям Android, потому как не требует от вас каких либо навыков и происходит за пару кликов!
2. Запустите только, что установленное приложение и предоставьте Root права
3. Выберите приложение которые вы хотите встроить в прошивку (сделать системным), после чего, нажать на кнопку и выбрать «Преобразовать в системное«
4. После интеграции приложения перезагрузите Android
5. Проверьте работу приложения, если возникли проблемы, то сбросьте его кеш или данные.
Встраивание приложений в Android «стандартным способом»
Прежде чем начинать встраивать приложения Android необходимо знать из чего же состоит приложение:
1. Приложение Andoroid имеет название и файл расширение.
например: Name.apk где Name имя, а apk расширение.
2. Android приложения легко открываются с помощью архиватора ( WinRar или 7zip )
3. В некоторых приложениях есть папки lib (если открыть приложение архиватором)
В данной папке может находится под-папки с названием
Aremeabi – данная папка для архитектуры Arm в целом если отсутствует Aremeabi-v7a если данная папка присутствует, то только для Arm V6
Aremeabi-v7a – данная папка только для архитектуры Arm V7
Mips — только для архитектуры MIPS
Mips64 — только для архитектуры MIPS64
X86 – только для архитектуры x86
X64 – только для архитектуры x64
(на какой архитектуре ваш Android устройство, автор не знает, к сожалению он не экстрасенс, уточняйте в интернете)
В данных папках есть файлы имеющие расширение *.SO
Инструкция как Встроить приложение в Android
Для версий Android c 1.5 — по 4.4.4
Прежде чем встроить приложение в Android скачайте и установите приложение — файловый менджер Root Browser
Приложения которые встроены в систему Android находятся по пути
Приложения которые установлены пользователем в Android находятся по пути
Если не видете приложение то зайдите в меню -> настройки ->приложения -> приложение-> переместить на телефон
Скопируйте необходимое приложение с /data/app/ и переместите его в /system/app/, но не забывайте что многие приложения содержат файлы *.SO и которые необходимо встроить по пути
Первый вариант чтобы получить необходимый *.SO файл это скопировать приложение на ПК и извлечь необходимое.
Второй вариант это перейти по пути /data/data/папка_название_приложения/lib/файл.so и переместить необходимый файл(ы) в /system/lib/
После этих несложных процедур, перезагрузите Android смартфон или планшет и приложение встроено! В конце статьи будет представлена еще дополнительная информация по более экономичному встраиванию приложений.
Для версий Android c 5.0
С версии Android 5.0 Lolipop компания Google внесла существенные изменения в установку приложений. Если ранее приложения APK размещались в одной папке/XXX/APP , то с версии Android 5.0 каждое отдельно установленное приложение размещается в собственной папке с необходимыми ему либами (*.SO) если эти либы конечно же имеются у приложения.
Android 1.5 — 4.4.4 слева, Android 5.0 справа
Теперь по сравнению с версиями Android 1.5 — 4.4.4 в Android 5.0 нет необходимости встраивать либы (*.SO) по пути /system/lib/ достаточно перенести папку с
(приложения которые встроены в систему Android находятся по пути /system/app).
Переходим в /data/app
Находим папку с необходимым приложением
копируем папку с содержимым в раздел /system/app
Перезагрузить Android чтобы все изменения вступили в силу!
Дополнительно о Встраивание и Экономии места
Так как некоторые приложения имеют либы (*.SO) — содержатся в самом приложение, а также распаковываются при установке, все это сильно отбирает место для установки. Перед встраиванием мы рекомендуем скопировать приложение на компьютер, открыть его с помощью архиватора (не разархивировать) и скопировать необходимые либы (*.SO) и после удалить папку lib с APK приложения. Далее встроить приложение в Android и перезагрузить.
Портирование прошивок интересует многих продвинутых пользователей, которые хотят адаптировать свое устройство для другой среды с сохранением её полезных свойств. Обычно основная цель этого процесса — сделать прошивку на своём гаджете «интереснее» и расширить её функционал. Давайте рассмотрим, как всё это происходит на технике Android с платформой ARM.
Каждый из пользователей хотел бы добавить в свой гаджет что-то оригинальное
Что нужно для портирования прошивок?
Для осуществления этого процесса требуются следующие составляющие:
- Приложение Notepad или другой текстовый редактор (впрочем, эта программа считается наиболее удобной и продуманной среди остальных).
- Архиватор WinRar.
- Компьютер, через который осуществляется весь процесс.
- Два ROM`а с одинаковыми ядрами — один является источником для передачи данных прошивки, на другом мы будем собирать их для программного обеспечения.
Как происходит портирование прошивки?
Прежде всего, мы создаём backup папку на компьютере, копируя с директории system/app на ПК такие файлы с расширением .apk:
- Stk.
- Vpnservices.
- Camera.
- Bluetooth.
Затем, на устройстве, где мы будем собирать прошивку (его другое название — BROM) мы удаляем эти файлы, а вместо них копируем из источника, который ещё называется PROM следующие директории:
- /data.
- /system/app.
- /system/framework.
- /system/fonts.
- /system/media.
Ещё на базовый ROM мы копируем в папку /system/lib библиотеку libandroid_runtime.so. Теперь мы снова перемещаем в BROM прежде удалённые файлы из первого действия.
В последующем мы делаем копию таких библиотек из базового ROM’а в PROM, как:
- system/lib.
- /system/etc/init.d.
- /system/etc/permissions.
Обратите внимание, что копирование производится с заменой существующих на другом оборудовании данных, а не в качестве их дополнения. Теперь мы удаляем три эти директории на BROM и на их место копируем всё из PROM`а.
Переходим к работе с редактором Notepad и выполняем следующие действия:
- Открываем на каждом ROM`е файл build.prop и размещаем оба окна друг напротив друга.
- Сверяем, чтобы запись ro.build.description= совпадала на обеих устройствах, иначе не удастся выполнить прошивку. Если нужно, редактируем строку так, чтобы записи в PROM и BROM были идентичны.
- Переходим по пути /META-INF/com/google/android и теперь открываем для сверки файлы под названием updater-script. Если они не идентичны, то корректировать их необходимо так, чтобы в BROM`е совпадало значение, которое указано в портируемом ROM`е.
Примечание. Вы можете редактировать или добавлять такие параметры, как ядро или permissions, asserts, ui_prints, run_programs, но ни в коем случае не меняйте значение symlinks.
Последнее, что необходимо сделать — проверить в скрипте updater параметр Format values на базовом ROM`е (указанные данные должны подходить для вашего оборудования). Если у двух ядер разные производители, обязательно распакуйте ядро и скопируйте из портируемого ROM`a данные BOOTCLASSPATH на BROM по адресу init.rc.
Читайте также: