Конец эпохи ARMv7 или же немного о портировании игр

  • Tutorial

Вступление


Пару недель назад я столкнулся с проблемой отсутствия у игры поддержки архитектуры моего процессора в телефоне. Конечно, я знал, что ARMv7 устареет, но не ожидал, что это случится так быстро. В сети особо информации по downgrade приложения не было, поэтому пришлось немного импровизировать, вспоминая времена, когда пропала поддержка ARMv6. Так что, в данной статье речь пойдёт о переносе приложений с архитектуры ARMv8 на ARMv7, на основе моего опыта.
Тема с портированием андроид игр с одной архитектуры на другую весьма неновая. Изначально я столкнулся с этим ещё в 2015 году, только речь шла о портировании под ARMv6. С тех пор принцип переноса не поменялся, и перенести игру с одной архитектуры на другую может любой, если имеет необходимые библиотеки.

Разбор apk


Итак, что такое .apk? APK файл представляет из себя немного модифицированный ZIP архив, который содержит ресурсы игры и игровой движок. Выглядит он примерно так:

image

Папка lib — ключевая точка при переносе между архитектурами. Она содержит библиотеки движка нашей игры.
* armeabi — armv6 библиотеки (не актуально)
* armeabi-v7a — armv7 библиотеки (при отсутствии папки — отсутствует и поддержка архитектуры)
* arm64-v8a — armv8 x64 библиотеки

Перенос


Шаг #1


Первым делом нам нужно узнать, возможно ли портировать игру. Для этого нужно определить движок игры. К примеру, файл lib/libunity.so — принадлежит Unity Engine, а по наличию папки assets/x-renpy можно догадаться, что игра разработана на RenPy Engine. Если у игры движок не является собственным, то переходим к шагу два.

Шаг #2


Итак, мы определили движок игры. Теперь нам нужно найти подходящего донора. Если эта игра раньше поддерживалась вашим аппаратом, а после обновления перестала — то можно попробовать вскрыть ресурсы прошлых версий. Если этот вариант не подошёл, то можно поискать игры, базирующиеся на этом же движке. Иногда разработчики просто не добавляют поддержку armv7, так что есть вероятность найти нужные компоненты.

Шаг #3


Мы нашли подходящего донора, теперь нам нужно добавить папку lib/armeabi-v7a в наш (name).apk. Добавляем и видим следующее:

image

В самом начале, как я уже сказал, APK файл представляет из себя немного модифицированный ZIP архив, а после изменения его содержимого он становится обычным ZIP'ом.

Шаг #4


Для того, чтобы ваше устройство могло установить ваш (name).apk файл, его нужно «подписать». Для этого есть несколько различных утилит, к примеру apk-signer.

Устанавливаем утилиту на свой девайс, открываем, переходим в раздел Signing, нажимаем на карандаш снизу и выбираем наш (name).apk. После чего программа предложит вам выбрать, куда сохранить «подписанный файл». Выбираем и ждём. ??? PROFIT!!!

image

Шаг #5


Будь добрым человеком, выложи свой порт для общего пользования, к примеру, в топик игры на том же 4PDA. ;-)

Некоторые lib'ы


Unity 3.* for ARMv6: yadi.sk/d/XGHn309ORuPgeg

RenPy ARMv7: yadi.sk/d/_U-hnz8D-J7D-Q
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 10

    0

    Критика приветствуется.

      +1

      за инициативу лайк)


      однако на замене файлов ты далеко не уедешь, ресурсы и движок могут быть зашифрованы(тоже юнити из коробки поддерживает, думал все игры этим пользуются темболее на мобилки) или вообще какойто кастомный движок который не портировать...


      судя по всему(я не пользуюсь телефонами уже довольно давно, не слежу) отличия между v7 и v8 непреодолимые


      Armv8 meant the 64-bit version of the instruction set and some system changes to support it

      даже бинарник пропатчить не выйдет, это как попытка запуска 64 битных программ на 32 битной системе...

        0
        однако на замене файлов ты далеко не уедешь, ресурсы и движок могут быть зашифрованы(тоже юнити из коробки поддерживает, думал все игры этим пользуются темболее на мобилки) или вообще какойто кастомный движок который не портировать...

        Ну, про кастомные я уже сказал в первом пункте. Ресурсы да, помню как-то приходилось вытаскивать порядка 1 гб пикч, чтоб ужать до 600 метров (памяти не хватало). Но, соль в том, что папка с бинарниками не шифруется. Это те же самые .dll.

        даже бинарник пропатчить не выйдет, это как попытка запуска 64 битных программ на 32 битной системе...

        Поэтому и нужен донор.
          +1
          Бинарники движка могут компилиться из исходников при сборке приложения, и в процессе модифицироваться так, чтобы работать только с этим приложением.
          А еще само приложение может содержать свой c/c++ код. В этом случае негде будет взять нужные *.so, кроме как просить разработчиков приложения.
            0
            Тот же Unity не даёт доступ к исходному коду, ситуация с Unreal спорная. Мало кто захочет лезть в него ради мобильной игрушки. RenPy… Его, сколько раз встречал, никто не правил. За другие ничего сказать не могу, но это ситуация вполне вероятная.
            А еще само приложение может содержать свой c/c++ код.

            Судя по тому, чем заполнен тот же Play Market, я сомневаюсь, что среднестатистический мобильный разработчик будет этим заниматься. ИМХО
          0
          по большей части, популярные игровые движки сами по себе не шифруются. Шифруется файл ресурсов и файлы/скрипты проекта. А либы движка — нет и чаще всего, ресурсы проекта просто обращаются к API движка.

          Проблемы будут, если есть нативные модификации
        –2

        О чём пост вообще? Допустим, у меня arm64-v8a — что я могу с этим сделать и куда портировать?

          0
          О запуске игр на armv7, которые не имеют поддержки данной архитектуры.
          0
          Тэг программирование не совсем уместен.
            0
            Его тут и нет. Реверс, андроид разработка, гейм-разработка.

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

          Самое читаемое