company_banner

Оптимизация Android приложений под х86. Опыт 2GIS

    Наверное, читателям Хабры не имеет смысла представлять 2ГИС – российский геосервис, ставший важнейшим источником информации для жителей многих городов нашей (и не только) страны. Разработчики сервиса уделяют большое внимание мобильным приложениям — продукт доступен для различных мобильных ОС и входит в число лучших бесплатных приложений в категориях «карты», «навигация» на Google Play и App Store.
    Мобильные устройства с ОС Android на базе x86 возможно, пока известны чуть менее, чем 2ГИС, но с постоянным увеличением ассортимента, их известность растет.
    Мы пригласили 2ГИС в гости в блог Intel, чтобы задать им несколько вопросов об оптимизации мобильной версии программы под архитектуру х86. Ответы подготовил Сергей Галин — Руководитель команды разработки мобильного 2ГИС.

    Как устроено ваше приложение с точки зрения использования нативного кода? Т.е. насколько велик его процент, что именно делается нативно и почему?
    Наше приложение для Андроида работает в нативном коде на 99% — т.е. абсолютно всё, кроме процесса старта приложения и работы с API Android. Включая рендеринг всего пользовательского интерфейса «собственными силами», не используя для отрисовки функций операционной системы. Это кроссплатформенное приложение на базе Qt 4.8 (порт на Android — наш собственный). Так получилось исторически, поскольку разработка начиналась для Symbian и Windows Mobile, потом захотелось добавить Android (на тот момент Android 2.2). Впрочем, с учётом «тяжести» нашего приложения, которое в реальном времени рисует 3D-карту и работает с огромной оффлайновой базой данных подход Андроида «по умолчанию» с разработкой на Java просто бы не «вывез» — ни по быстродействию, ни по объёму требуемой оперативной памяти. В нативном же коде мы можем делать практически такое же функциональное приложение, как и на обычном настольном компьютере, и запускать это даже на бюджетом телефоне образца 2011 года.

    Устраивает ли вас и ваших пользователей производительность существующих ARM версий приложений? Остается ли запас производительности для расширения функциональности?
    Да, устраивает, для современных устройств и топов 2012 года :) Бюджетные телефоны прошлых лет и даже более старые флагманы, к сожалению, работают на грани возможностей, и производительность в некоторых местах, действительно, оставляет желать лучшего. При этом, возможностей для оптимизации при данном функционале приложения для многих устаревших устройств практически нет.
    Для нас будет очень хорошо, если Intel реально усилит конкуренцию и ускорит расширение пользовательской аудитории в сторону более мощных устройств!

    Почему было принято решение о выпуске x86 версии?
    Потому, что это было сделать действительно легко! И было не клёво, что на отличных устройствах с процессорами Intel приложение работает плохо.
    Мы сейчас заняты, в числе прочего, планомерным расширением поддержки устройств и платформ, так что это хорошо вписалось в наши планы.
    И спасибо Intel за предоставленные устройства, без них бы было сложнее сдвинуть тему с мёртвой точки :)

    В чем именно состояло добавление поддержки х86 – сколько файлов \ строк кода потребовалось изменить?
    Кода в приложении — практически нисколько. Была доработана конфигурация сборки Qt, чтобы она умела поддерживать x86. Пришлось ещё пропатчить макросы в паре третьесторонних библиотек, которые до этого были уверены, что «Андроид — значит, ARM». Потом были модифицированы наши сборочные скрипты для сборки x86 — это и заняло большую часть времени. Proof-of-concept был сделан за 1 день, а в целом на встраивание x86 в процесс затрачена примерно 1 человеко-неделя, не считая тестирования. Для такого огромного проекта это — очень быстро!
    Дело ещё в том, что наша кодовая база используется и на десктопах, и на серверах, да и разработка самой мобильной версии в основном производится под обычными десктопными Linux и Windows (не в эмуляторе, а именно в обычной сборке для этих ОС — благодаря Qt, мы это можем делать очень легко), поэтому весь код изначально отлажен для x86.

    Как технически реализована поддержка x86 и ARM версий = т.е. у вас отдельные apk или одна общая, как происходит компиляция (автоматически собираются обе версии или есть возможность выбора?) Тот же вопрос про тестирование.
    Отдельные APK. Кстати, раз уж мы перешли на такую схему, то заодно мы внедрили пакеты, оптимизированные для ARMv7, итого, у нас стало 3 пакета: ARMv5, ARMv7 и x86.
    Система автосборки собирает либо одну версию на выбор (для быстрого получения свежей сборки), либо все три сразу (для приёмочного тестирования и публикации).
    Приёмочное тестирование обязательно проводится как минимум на двух платформах, а третья тогда может проверяться ускоренно («смок-тестирование»). Фактически, мы ещё ни разу не столкнулись с тем, чтобы какие-то баги были специфичны для какого-то CPU ABI :) Андроид на x86 ведёт себя так же, как на ARM, никаких несовместимостей пока не обнаружено.

    Что показывает сравнение производительности и энергопотребления x86 с ARM-версией, работающей на том же устройстве через бинарный транслятор?
    Мы не делали численного сравнения, поскольку разница слишком велика. Поскольку наше приложение даже рисует UI само из нативного кода, то в режиме трансляции всё работало еле-еле, а энергопотребление просто зашкаливало — телефон разогревался, как печка. После компиляции 2ГИС «залетал», как следует — программа «упирается» уже в чтение данных из памяти и кадры экрана (vsync), а по мощности процессора теперь даже есть запас. Выигрыш и по быстродействию, и по расходу энергии по сравнению с транслятором — где-то на порядок.

    Intel

    144,00

    Компания

    Поделиться публикацией

    Похожие публикации

    Комментарии 24
      +12
      Сделайте открытие последней точки на карте (хотя бы при открытии через виджет).
      Сейчас старт приложения иногда занимает больше 5 секунд, потом лишнее нажатие на кнопку карта, потом еще более 5 секунд на загрузку карты.
      Что стоит сохранить скриншот карты, быстро загрузить и отрисовать его, а уже потом грузить приложение, данные и рендерить карту?
        0
        это действительно логично и очень часто требуется. поддерживаю!
        +1
        Тема интересная.
        А вот грустный момент: в последних версиях размер и цвет меток на карте стал неудобным для поиска. Да и сам поиск поломался: часто по категории не находится часть магазинов, например, одной сети. А кликни по нему — и обнаружишь, что магазинов несколько на карте. Если несколько магазинов одной тематики находятся в одном здании — скорее всего покажется на карте только один из них, но не все. Грустно.
          0
          Сравнивал год назад работу 2gis на Huawei Ascend D1 Quad и Iphone 4s (кажется), на iphone скролл карты был гораздо более отзывчивым и без рывков, в IOS нативность другая, или тогда все было по другому сделано?
            0
            Оффтопик, но на Iphone 4 (не S) 2ГИС работает очень медленно, даже на ios5. Понятно, что аппарат очень старый, но старые версии, кажется, работали быстрее. Причем не особо зависит от карты, Москва (120 мб) тормозит так же, как и Омск (15 МБ, кажется).
              0
              Увы, это неизбежно по мере прироста баз новыми видами данных.
                0
                Замечу, что это ни в коем случае не было претензией. Просто констатация грустного факта.
              +1
              В Huawei хуже oncreen-производительность. Разрешение выше, чем в iPhone, а GPU хуже.
                +1
                Если вы сравнивали именно год назад, скоре всего, в ту пору на Android еще не было аппаратного ускорения отрисовки.
                  +1
                  Год назад 2ГИС вообще не поддерживал аппаратное ускорение (OpenGL) на Андроиде. Сейчас (с лета 2013) примерно на 70% устройств на Андроиде всё в OpenGL, поэтому надо сравнивать заново.
                  Но в общем случае производительность очень разных по разных вычислительной мощности и разрешению экрана устройств сравнивать не стоит. У iPhone соотношение вычислительной мощности на пиксель где-то как у топовых аппаратов на Андроиде того же времени выпуска.
                  0
                  Прошу прощения, если не в тему, но призываю разработчиков обратить внимания на мой коммент в предыдущей теме.

                  Кто-то писал промотать вниз и там будут расширенные варианты проезда на автобусах, но внизу ничего нет(хотя от Дыбенко на Большевиков ходит автобусов 10): скриншот.
                    +2
                    О, вы прям с языка сорвали. Я вчера точно с такой же проблемой столкнулся. Точно знаю, что между двумя заданными точками есть наземный транспорт с пересадкой, но 2ГИС упорно предлагает только в метро. Сделайте по возможности галочку «Не использовать метро», иногда ведь хочется и в окно посмотреть, да и не торопишься.
                      +1
                      Отправил ваш комментарий по адресу.
                      +3
                      А мне одному показалось, или краткое резюме статьи — «Мы добавили поддержку x86, для этого особо делать ничего не пришлось. А еще Qt — отличная штука, кроссплатформ и все дела».

                      Название точно не соответствует содержимому.
                        +1
                        Вроде смысл в том, что нативный код производительней результата дефолтного кодинга на жабе…
                          +1
                          Android/x86 поддерживает все приложения, но если они используют нативные библиотеки для ARM-процессоров, то включается транслятор, который на лету конвертирует бинарный код из ARM в x86.

                          Поэтому пересборка приложения под x86 — это всё-таки не совсем «поддержка», а скорее «оптимизация».
                          0
                          Не знаю что вы там оптимизировали у меня HTC One и я не в восторге :(
                          Особенно прокрутка по рубрикам.

                          «Табу» так и не сделали, я писал об этом вроде больше года назад.
                            0
                            непонятно, как соотносится топик оптимизации под х86 и HTC One.
                            0
                            Я так долго этого ждал. Большое спасибо.
                              0
                              Сергей, процессорами интел оснащены буквально несколько моделей мобильных телефонов на рынке. Имеет ли смысл портировать свое приложение под такую экзотическую процессорную архитектуру?
                                0
                                Дело в ресурсах — почему бы не поддерживать, если на «запилить весь код» ушла человеко-неделя, а для того чтобы построить надо добавить несколько слов в скрипты компиляции, а всё остальное кроссплатформенное?
                                0
                                мне интересно, если у меня раньше на телефоне (Mint) была армовская версия, гугл плей поймет, что нужно взять х86 apk-файл или надо переустановить 2гис?
                                  0
                                  Еще один баг поправьте, пожалуйста. Довольно часто 2gis (практически через 3-5 переключений) теряет спутники после переключения на другое приложение и обратно. Исправляется только выходом из приложения и повторным запуском.
                                    0
                                    Удивительно, что при всем при этом, при такой легкости портирования 2GIS бросила владельцев последних поколений Symbian смартфонов, «мощности» которых более чем хватает для такой программы…

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

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