Pull to refresh

Apportable SDK — Objective-C/Cocoa Touch для Android

Reading time 4 min
Views 16K
Apportable SDK — это продукт, который позволяет без изменений скомпилировать игру (или приложение), разработанное на Objective-C/Cocoa Touch для iOS под Android. Это полный toolchain (компилятор, дебаггер, линковщик — все-все-все), работающие Foundation, CoreFoundation, UIKit, множество других фреймворков из состава iOS, перенесенные на Android (даже такая «мелочь» как GameKit и StoreKit, с бэкендами для GooglePlus и Amazon GameCircle/Appstore).

Цель Apportable — дать iOS разработчику перенести свое приложение на Android за час, без изменения кода, и поддерживать после этого одну кодовую базу. Как портировать простую игрушку на cocos2d — под катом

Заходим на сайт Apportable.

После регистрации нам дают выкачать SDK, ссылка специфичная для пользователя.

Выкачиваться оно будет очень долго — Apportable использует патченные android-sdk, ndk и прочую тяжелую артиллерию.

После установки оно скажет:

Toolchain downloaded into /Users/darvin/.apportable/toolchain.
Apportable CLI is successfully installed at /Users/darvin/.apportable/SDK/bin/apportable
If you're using the default shell, add the Apportable CLI to your PATH using:
(echo; echo 'PATH="/Users/darvin/.apportable/SDK/bin:$PATH"') >> ~/.bash_profile; source ~/.bash_profile


Так и делаем:

$ echo; echo 'PATH="/Users/darvin/.apportable/SDK/bin:$PATH"') >> ~/.bash_profile; source ~/.bash_profile


Теперь выкачаем нашего подопытного кролика, какую-нибудь рандомную опенсорсную игру с гитхаба, запиленную на Objective-C/Cocos-2d (поддержка cocos2d у apportable особо хороша, они даже являются оффициальным спонсором cocos2d). Дисклеймер: автор не имеет никаго отношения к подопытной игре, она совершенно не адаптированна для Apportable SDK, просто игра на cocos2d

$ git clone https://github.com/haqu/climbers.git
$ cd climbers


Проверяем, чтобы компилировалось из XCode:

$ open climbers.xcodeproj


Подключаем любимый Нексус (или галакси, или нонейм-китайца без google-apps — нет почти никакой разницы), запускаем утилиту, которая создаст climbers.approj (это набор настроек для Apportable, которые накладываются поверх .xcodeproj), скомпилирует проект и загрузит его на девайс:

$ apportable load


Утилита вначале спросит:

If the app is using OpenGL ES, does it use ES1 or ES2? (Cocos2D 1.X uses ES1, 2.X uses ES2)
[1/2] 1
Should the app initially launch in landscape or portrait orientation? (default: landscape)
[L/p] p


Игрушка использует Cocos2D 1.X, так что отвечаем «1», второй вопрос — «p».

После первой попытки компиляция отваливается с сообщениями об ошибках:

/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDAudioManager.m:322: error: undefined reference to 'AudioSessionGetProperty'
/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDAudioManager.m:382: error: undefined reference to 'AVAudioSessionCategoryPlayAndRecord'
...вырезано...
/Users/darvin/GAMES/climbers/Support/CocosDenshion/CDOpenALSupport.m:227: error: undefined reference to 'ExtAudioFileDispose'
Updating Jar...
scons: *** [Build/android-armeabi-debug/climbers/apk/lib/armeabi/libverde.so] Error 1
scons: building terminated because of errors.


Оно жалуется на отсутствующие AudioFile* функции… Гугль подсказывает, что они находятся в фреймворке AudioToolbox. Ну что ж…

$ vim climbers.approj/configuration.json


В разделе "add_params" находим строки:

    // A list of dependencies.  Typically these correspond to
    // frameworks in the xcode project.
    "deps": [""],


Исправляем на:

    "deps": ["AudioToolbox"],


$ apportable load


Игра загружена на подключенный Android мобильник, даже есть звук. Графика немного сьехала — разработчик не расчитывал на разные разрешения андроидофонов, впрочем, это легко (и нужно) исправить, если же адаптировать графику лень, Apportable представляет workaround, который будет масштабировать графику, как если бы игра была запущена на iOS девайсе. Давайте попробуем второй путь:

В начале -[AppDelegate applicationDidFinishLaunching:] добавим:

#ifdef APPORTABLE
    [UIScreen mainScreen].currentMode =
    [UIScreenMode emulatedMode:UIScreenBestEmulationMode];
#endif


Здесь мы выставляем лучший режим эмуляции для девайса — если его разрешение/пропорции похожи на iPad — он будет эмулировать iPad, если на iPhone — iPhone.

Также стоит удалить ненужный код выбора ориентации:

#if GAME_AUTOROTATION == kGameAutorotationUIViewController
    [director setDeviceOrientation:kCCDeviceOrientationPortrait];
#else
    [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];
#endi


Сохраняем, запускаем коммандой apportable load. Видим Objective-C/Cocos 2d игрушку на Нексусе:

image

Форк игрушки после портирования на Андроид. Всего один конфиругационный файл добавлен, пять строчек изменено в AppDelegate

Полный листинг сессии портирования

Доступна документация и список рассылки. Также наши специально обученные инженеры мониторят тэг на StackOverflow. Видео сессии портирования tweejump.

Starter редакция SDK бесплатна, подерживается Android 4+. Лучше всего Apportable подходит для портирования игр — у приложений все равно разные гайдлайны UI, a игры уже обкатаны на множестве лидеров аппстора. Буду рад ответить на любые вопросы, в следующей статье собираюсь рассказать как быстро и безболезненно выдрать возникающие при портировании баги и прозрачно, без изменения кодовой базы интегрировать социальные фреймворки, StoreKit и GameKit.
Tags:
Hubs:
+31
Comments 36
Comments Comments 36

Articles