Пользователь
0,0
рейтинг
19 августа 2013 в 13:18

Разработка → Apportable SDK — Objective-C/Cocoa Touch для Android из песочницы

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.
@sergeyklimov
карма
5,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

Самое читаемое Разработка

Комментарии (36)

  • +5
    клево, а как с производительностью дела обстоят?
    • +1
      И ещё интересно насколько вырастет объём скомпилированного приложения после переноса в Android
      • +1
        Вот этот проект собрал в релизе (это базовый template из Xcode с GLKit + небольшое дополнение)
        apk — ~7mb (из них ресурсы чуть меньше 1mb)

        После распаковки apk, библиотеки занимают 14,7 mb (libBridgeKit.so, libcxx.so, libdispatch.so, libffi.so, libFoundation.so, libobjc.so, libOpenAL.so, libpthread_workqueue.so, libSystem.so, libv.so, libverde.so).

        Самая большая libFoundation.so — 5.2mb
        libverde.so у меня получилась 5.5mb, но размер этого файла зависит от вашего кода и подключенных фреймворков в проекте (на сколько я заметил).

        Программа на устройстве занимает 24.64 mb.
    • 0
      Я не замечал дропа fos на сложных нагружённых OpenGL приложениях, но тут тяжело сравнивать — все таки айфоны и топовые андроиды по мощности разные
  • –5
    Чего только не изобретут, лишь бы не учить указатели и адресную арифметику.
    • +1
      Намекаете на С/C++ и Android NDK?
      • +1
        Да я прямо говорю. Вместо того, что бы писать на языке существующем только на одной платформе и потом с костылями переносить на другие стоило бы сразу писать на кросс платформенных языках.
        • 0
          Дело не в языках, а фреймворках системных. Основная проблема в них. Собрать Hello World на ObjC в принципе под Android не проблема, думаю.

          P.S. не понял шутки про указатели и адресную арифметику. В Obj-C, как надмножестве C, все это есть.
          • –4
            Собрать Hello World на ObjC в принципе под Android не проблема, думаю.
            Да, под андроид собирает GCC, а он умеет компилировать Obj-C. Но, как вы правильно сказали, все проблема в завязанности кода на фреймворке. В итоге пересобрать такой код под андроид очень проблематично. Если бы писалось на С\С++ то большинство связей с этими фреймворками удалось бы избежать.
            Ну и собрать Obj-C под андроид получится. А когда захочешь перенести на Win Phone, что делать тогда? Потому я считаю использование Obj-C\Java признаком низкой квалификации.
            • +1
              Поддерживаем примерно 100к строк кода для iOS/Android, 90% этого хозяйства — C++. Мнение тимлида: «Лучше бы это было Java/ObjC». Почему? «Дешевле, нормальный C++ слишком сложен, а потому дорог.»

              С другой стороны, C++ и выбран по причине возможности портирования на что угодно.

              Но в итоге по подсчётам взять один язык и делать бы порты обошлось в такую же сумму человекочасов, умноженных на квалификацию. Выбор прост. Есть люди и средства — можно делать красиво. Нет людей или средств — приходится делать как получается. Второй вариант к сожалению проявляется чаще.
              • 0
                2 code base — в 2 раза больше кода поддерживать, в 2 раза больше возможностей ошибок и граблей, в 2 раза больше специалистов по разным языкам. Ни разу не звучит, как умное решение.

                Дешевле, нормальный C++ слишком сложен, а потому дорог.
                Точно эту же фразу можно сказать о любом другом языке.

                Но в итоге по подсчётам взять один язык и делать бы порты обошлось в такую же сумму человекочасов, умноженных на квалификацию.
                Это утверждение в корне неправильно. Может, сделать что-то простое и забыть обошлось бы в ту же суму, но поддержка проекта занимает куда больше времени, чем его написание. А поддержка 2-х одинаковых проектов на разных языках — это полный бред
                • 0
                  А речи о двух базах и не шло, речь шла о том, чтобы взять одну и использовать инструмент вроде того, что представлен в статье.
            • +2
              Если нужно хоть сколь работать с особенностями ОС (а без этого полноценное приложение не создашь), то без Obj-C/Java не обойдешься.
              • 0
                У меня в игре 50к+ строк кросс платформенного С\С++ кода. Игра работает под РС и iOS. Obj-C кода 150-200 строк. Что я делаю не так?!
                • +2
                  Для игр Вы все делаете так. Но бывают не только игры.
  • +1
    Штуковина интересная, есть ли где-то описание, что там под капотом, или везде глухо и проприетарно?

    Если я верно понял, в продукте есть библиотека, реализующая Foundation, UIKit и прочие радости для компиляции их под дроида. Если так, то производительность будет чуть хуже совсем нативной (NDK).

    Компилирует это дело тот же clang, который делает это для родной среды? Как с поддержкой ARC? Как реализуется поддержка разных разрешений экранов без эмуляции?
    • 0
      clang, есть ARC.
      UIKit реализован с помощью OpenGL, если я не ошибаюсь, где-то читал.
      Для разных экранов расширен UIScreenMode, который почти сам подбирает размер.
    • 0
      Не глухо, не проприетарно. Почти все — опенсорс патчами, патчи уже отданы в апстрим
  • –9
    Кто нибудь уже пробывал ?? Как кросс платформенный код тяжелло поддерживать ??
  • 0
    А как насчет поддержки Xib/Storyboard из UIKit? У меня есть простенькая игрушка, но Cocos2d там используется в паре с CCViewController только на одном экране. Все остальное — менюшки всякие и т.п. — на Storyboard. Спортирует оно его?
  • 0
    Мда, ценники на платные версии не слишком гуманные. 'Indie' за $1000 выглядит неудачной шуткой.
    • 0
      Поддерживаю. Будь это открытый проект — взял бы не задумываясь. Моральный долг бы вернул как минимум кодом, возможно даже донатом. А так, моё мнение на счёт этого — вытягивание денег из менеджеров, руководящих разработчиками.
    • 0
      Если вы портируете iOS приложение на Android — скорее всего, на iOS оно окупилось, иначе такое портирование было бы сомнительно. Я не считаю ценник в 1000$ гуманным, но и слишком задранным тоже. Если этот SDK будет хорошо выполнять свою функцию, то можно и разориться. Опять же, список клиентов внушает уважение, а на сайте сказано о том, что можно запросить триал для платных пакетов.
      По поводу своего опыта — не поленился, скачал и прогнал через SDK свою еще не доделанную Cocos2d игру. Пришлось повозиться с отключением Flurry и пары других либ, которые в бесплатной версии не поддерживаются, но что важно — она запустилась и хорошо заработала! Музыка, анимации, эффекты — все пашет. Конечно, сразу в глаза бросаются куча шероховатостей, но лучше заплатить и две недели отшлифовывать игру, чем портировать с нуля месяца 2-3.
      PS: исключительно личное мнение, не реклама, не холивар))
      • 0
        Я не считаю ценник в 1000$ гуманным, но и слишком задранным тоже.

        Я говорил про все цены, там еще и Pro есть (хотя, конечно, обычному разработчику она вряд ли понадобится, за такую разницу в цене), а второе предложение было отдельно про название 'Indie', оно обычно не соотносится с раскрученными и прибыльными играм, скорее с начинающими разработчиками, считающими каждую копейку. В любом случае, это их право назначать цены, я просто озвучил мысли вслух.
      • 0
        Такая-же фигня. Тупо попробовал бесплатную версию на своем проекте (пока в разработке), оно скомпилилось и запустилось. Да, есть глюки. Но оно живет! Отладить остальное — дело недели-двух. При чём я не пользовал никаких сторонних фреймворков. Двигло своё. Писал все на obj-c. TouchXML скомпилился без проблем. Если гама попрет на айосе, то спортировать на ведроид будет пустяково, пусть даж и за штуку.
    • 0
      Практически 100% любых надобностей покрывает бесплатная версия. Есть что-то в инди версии, что вам нужно, но вы не можете себе позволить? Пишите в личку, обсудим.
      • 0
        Пока нет, но работаю над iOS версией, не игра, а приложение с MapKit, так что бесплатной, видимо, не хватит, да и смысла для такого (пока) небольшого приложения нет, хотя, конечно, идея получить андроид-версию минимумом усилий интересна.
        • 0
          Велика вероятность того, что к тому времени как вы закончите, вам хватит бесплатной версии — она планируется к расширению в скором будущем
          • –1
            Это хорошо, я в любом случае буду следить за проектом.
      • –1
        А вот если приложение совсем бесплатное, ни рекламы, ни внутренних покупок и на IOS оно только в планах? Если хочется одновременно запустить на андройд и на иос, 1000 у.е. как то уж больно кусается. Сделайте бесплатную версию для бесплатных приложений без коммерческой выгоды, ну а с нашей стороны (думаю желающих найдется не мало), отзывы, поддержка в нужный момент и т.д.
        Как обстоят дела с портированием аппаратных функций (камера и прочие)?
        • 0
          У них есть бесплатная версия, но тянет ведроид от 4.0 и выше. Я чуть выше отписал как я попробовал свой еще не доделанный проект компильнуть. Надо 2.0 — плати денюжку, ну тут уж никуда не деться… Либо пользовать сторонние фреймворки изначально, надеясь на бесплатность и портируемость.
  • 0
    Извините, а как дела с CoreData?
    • +1
      Поддерживается.
  • +2
    Потратил пол-дня на игры с сабжем- штука, безусловно, весьма и весьма достойная, но, для портирования больших бизнес-приложений с глубоким использованием UIKit пока не годится. Лэйауты рвутся на части, всевозможные хаки не отрабатывают или отрабатывают очень криво.

    А так, «автор, пиши еще». С легкостью расстался бы с $1K за возможность сэкономить 1000 ч/ч на портировании (:
    • 0
      Работы над улучшенным UIKit ведутся, ждите новостей.
  • 0
    Вот тут www.kickstarter.com/projects/203272607/gnustep-project пишут что внутри это базируется на опенсорс библиотеке GNUStep. То есть они используют LGPL код, очевидно со своими патчами. Дают ли они сырцы этих патчей всем, кто скачал их продукт?

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