Ведроид

written on Tuesday, June 4, 2013

Телефонное приложение успешно уехало в яббловый аппстор.

Там его никто особо не ставит, кроме тридцатитрех китайцев, потомучто описание в аппсторе практически пустое, а по скриншотам ничего непонятно. Сейчас же я делаю следующий кусок работы - порт на андроид.

Структура

Приложение у меня разбито на две части - юзерский интерфейс и евентлуп на libre, который занимается асинхронным вводом-выводом, реализует протокол и всю логику и дергает вкомпиленные кодеки.

Фактически, это отдельный демон, который, для удобства использования, изображает из себя библиотеку. В настоящем линуксе он может работать в виде демона, слушающего локальный сокет, на яббловой платформе - это статическая библиотека, которая работает в отдельном потоке, а вместо локального сокета использует пайпы. На андроиде библиотека получилась динамическая, данные будут ходить по локальному сокету, но вобщемто принцип остается тот же самый - отдельный кусок кода, в который можно пинать текстовыми командами и который не шарит никаких данных с интерфейсом.

Сишечка

Поскольку вся логика вынесена в отдельный кусок, написанный на сишечке, она должна легко портироваться. В теории.

На практике обнаруживается куча противных нюансов, начиная с кривых путей внутри сендбокса и вплоть до отсутствия в андроидовой libc нужных функций и хедеров.

Например в андроиде нету ifaddrs.h, но скрипты сборки libre этого в упор не видят и приходится ставить кривые хаки, которые придется окультуривать.

При это андроидовый тулчей вполне себе детектится как __linux__ и нужно ставить дополнительные ифдефы, чтобы отличить правильный линукс от неправильного.

С путями вообще смешная история получается. Для четырех платформ (OSX, iOS, большой линукс и android) нужно использовать разные пути для сохранения базы данных и сертификата и подгрузки ресурсов. В iOS надо искать ресурсы внутри $HOME (который песочница), на большой макоси - искать путь по которому засунуто приложение. В андроиде тоже есть песочница, но путь к ней не зпрописан в $HOME, а достается каким-то очень дурным кодом из жавы, а на большом линуксе ресурсы могут валяться вообще где угодно.

Звук

Очевидная проблема - звук. Для iOS и OSX у меня есть очень почти универсальный код, для большого линукса есть ALSA, но на андроиде происходит "ой" и вместо альсы надо юзать OpenAL.

NDK

Если на яббловых платформах все достаточно просто и достаточно кросскомпилировать сишный код, подключить статическую либу (окей, мешок либ), то на андроиде нужно плясать танец с NDK/JNI. Поскольку мне нужно очень мало - дернуть одну единственную функцию, все прошло достаточно гладко, если такое слово вообще применимо к кросскомпиляции кривой херни под наркоманский таржет. Всего-то один день убил, да и то не весь. Можно сказать, что легко отделался.

Получилось в итоге две динамических либы: сам драйвер, который собирается отдельно и JNI прослойка, которая с ним линкуется и доступна для дрыганья из жявы.

Статус

Сейчас это все на стадии пруф-оф-концепта. Есть андроидовое приложение, которое ничего вообще не делает, есть драйвер, который в него втыкнут через JNI и успешно крутит свой евентлуп, грузит сертификат и регистрируется на сервере.

Теперь надо настроить IPC между жява-частью и сишным модулем, причесать хвосты, типа захардкодженых путей к песочнице и "лишних" функций, которые андроид не умеет, сделать сам UI и сделать звук. Ну всего-ничего, да.

Параллельно я собираюсь всунуть в сишную часть больше ада - например генерацию приватного ключа и вообщце цикл сигнап-логин-релогин, которая сейчас работает только на яббловой платформе и торчит в "интерфейсной" части.

Адскую систему хранения логов и контактов тоже нужно засунуть внутрь и дергать через ipc, но это уже после того, как в UI будет рабоать логинилка и кнопка "звонить".

This entry was tagged android, code and voip