Pull to refresh
0
e-legion
Делаем приложения, которыми пользуются миллионы

iOs-разработчик берется за Android

Reading time8 min
Views20K
Original author: Nick Farina
Недавно мы выпустили Android-версию для нашей платформы для создания приложений, использующих определение местоположения — Meridian.



Не став использовать один из кросс-платформенных инструментов, подобных Titanium, мы написали ее с нуля на Java.

Мы решили, что важно сохранить родной материал родным и максимально уважать особенности каждой платформы. Некоторым таким особенностям легко следовать, например, добавлению верхних закладок в окно интерфейса. Другие свойственны только для Android, например: обработка Intents, завершение работы старых Activities, реализация Search Providers, а также строгость к ссылкам с целью помощи сборщику мусора.

Теперь наша платформа использует HTML5 для брендинга и отображения контента, отсюда мы получили большую часть интерфейса совершенно бесплатно. Но множество кода, написанного на Objective-C, потребовалось перевести в Java, например: навигацию по карте, направление, и изменение местоположения.

Итак, мы засучили рукава, установили Android SDK и принялись за работу.

Среда разработки




Apple дала возможность легко разрабатывать приложения под iOS. Конечно, шаг первый — это «Купить Mac». Легко! Теперь загрузите бесплатную версию Installer Xcode из Mac App Store App Store и начинайте писать код.

Android работает немного сложней. Вы легко можете скачать SDK, но на деле вам нужно будет сначала установить Eclipse и скачать Google’s ADT Plugin.

Если вы хотите потерять около недели даже не начав работать, то у вас есть отличный шанс изучить возможность написания Java-кода в Eclipse. Вы также можете скачать или Netbeans, или Scala, или же, наконец, начать изучать VIM.

Но давайте предположим, что сроки поджимают и вы хотите сделать это так, как одобряет Google. Первое, что вы должны сделать, это принять Eclipse таким какой он есть.



Скорее всего, вы возненавидите Eclipse с невиданной силой. Он покажется вам медленным, громоздким и далеким от того, что вы привыкли называть IDE.

Eclipse — это мир в себе. Это IDE до последних мелочей, что влечет за собой определенные последствия. Eclipse имеет множество абстрактно звучащих концепций, к которым вам придется привыкнуть так или иначе. Существуют Workspace, Perspectives и Run Configurations. А сам по себе Eclipse представляет лишь оболочку, в которой все основные функциональные возможности обеспечиваются через сложное взаимодействие взаимозависимых плагинов. Этим он напоминает Linux.

Конечно, необычность IDE не чужда Eclipse; Xcode был также чертовски необычен сперва и он становился все более мета с каждым релизом (схемы, кто-нибудь?).

Преимуществом является то, что после акклиматизации к Eclipse вы сможете насладиться некоторыми серьезными чудесами: повышением производительности авто-завершения кода, рефакторингом и автоматическими исправлениями. Проще говоря, он будет писать код за вас...



Отличный способ научиться пользоваться Eclipse, это потратить несколько часов, и я буду смертельно серьезен, настраивая сотни опций, чекбоксов, флажков и всяких других кропотливых вещей в Preferences.



Опять же, если серьезно, то я почувствовал себя более комфортно, знакомо и счастливо с Eclipse, после того, как разобрался с ним описанным способом. Означает ли это, что другие программы должны предоставлять все возможности, которые только можно себе представить? Господи, нет. Вы с ума сошли?

Язык Java



Java — это язык программирования высокого уровня. Бесполезно иметь свое мнение на этот счет. Вместо этого лучше рассмотрим, как Android использует Java.

Это то, как вы что-то делаете в фоновом потоке. А это, как подписываетесь на события (в действительности это похоже на delegate в ObjC). Это объяснение жизненного цикла Activities, которое выглядит как UIViewControllers в Cocoa.

В целом, Android framework очень хорошо спроектирован, не противоречив и гармонично работает с Java. В основе очень похоже, что наши приложения имеют почти одинаковых структуру классов как на Android, так и на iOs.

В конце работы код был поразительно схож с Android. Вот фрагмент из нашего ObjC приложения, которое рисует стрелки.




Бред, правда? Множество наших исходников подобны этому.

Отладка



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



Он называется Simulator, потому что он притворяется (ха!). Это не настоящая OS iPhone. При запуске приложения «в симуляторе» Xcode компилирует приложение в настольное и запускает в исходном формате на вашем Маке. Если вы посмотрите в Activity Monitor, то увидите, что приложение работает наряду с Mail, iCal и iTunes.

Недостаток Simulator в том, что он в точности не может имитировать среду iOs. И ваш код тоже не такой, он должен быть скомпилирован для x86/64 вместо ARM, поэтому нет никакой гарантии, что все будет работать также, как и на iOs устройстве.

Преимущество симулятора в том, что он не эмулятор. А что же такое эмулятор?



Заметьте, Android-эмулятор. Его цель благородна: запуск вашего приложения в полной и неизмененной Android OS, в виртуальной машине, которая выполняет ARM инструкции.

Какое же основное качество Android-эмулятора?



Когда я впервые услышал об iPhone Simulator я подумал, что он просто ужасен, до тех пор, пока не вспомнил, что мы сделали точно такую же программу для Windows Mobile день назад и он был просто чертовски медленным.

Эмулятору Android требуется ~ 2 минуты для загрузки на моем современном устройстве. Но что действительно расстраивает, так это цикл редактирования/отладки. Каждый раз, когда я немного изменял Java-код и хотел вернуться в приложение, мне требовалось около 30 секунд, чтобы заново запустить приложение в эмуляторе. Сравните это с 5 секундами на iOs-симуляторе. Это может и не звучит значительно, но подумайте, что вы будете делать это сотни раз в течение дня.

К счастью, оказывается, что гораздо быстрее установить и загрузить ваше приложение на физическое устройство через USB. Так что поверьте, просто идите и покупайте телефон с Android. А еще лучше купить их несколько, чтобы не иметь проблем с фрагментацией.

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

Инструменты разработки интерфейса



Для размещения виджетов на iOs существует Interface Builder.



Ваш опыт работы с Interface Builder может отличаться от моего, но я научился использовать его очень экономно. Он хорош, когда ты хочешь расположить элементы статически с хорошей точностью. Но для динамического контента, особенно UITableViews, он стремится сделать все сложнее, чем было бы в коде. Особенно, когда вы вернетесь через некоторое время и забудете все небольшие зависимости между Controller и вашим XIB.

На Android можно создавать пользовательский интерфейс и оформление в формате XML.



Он немного напоминает HTML, за исключением того, что это не HTML. Это простая система стилизации, которая вроде как CSS, за исключением того, что она не CSS.

Многие разработчики из лучших побуждений пытались заново изобрести HTML и CSS на протяжении многих лет. Mozilla создала XUL для кроссплатформенного интерфейса в Firefox. Adobe создала MXML для Flash. Microsoft создала XAML для Windows.

Когда у меня было слишком много свободного времени я создал свое собственное XML-оформление системы для Flash под названием Bent. Так что я могу вам сказать, что изобретение этих систем является самым забавным из того, что вы можете сделать будучи разработчиком. Такое чувство, что когда вы создадите Одну Единственную Платформу, как только завершите ее, все будут готовы её использовать, изучать и разрабатывать с ней, не будут отходить от вас ни на шаг и даже будут сочинят эпические поэмы о том, какой вы гений!

Но реальность такова, что это не HTML и CSS, а еще один толстый слой материала, который вы должны узнать и понять, и бороться с тем, что иногда он не работает так как вы этого хотите.

С положительной точки зрения вы можете просмотреть XML во время разработки в визуальном редакторе, похожем на Interface Builder:



Он довольно обширный.

Теперь, технически вы можете написать все в Java, также как в iOs вы можете отказаться от Interface Builder полностью и писать только на Objective-C. Но вы узнаете, что когда вы найдете в Интернете, как сделать что-то на Android, то в конечном счете вам придется понять все эти XML-форматы в любом случае, хотя бы для того, чтобы понять примеры кода на веб-сайте.

Но это не так уж и плохо, потому что у вас также появится ...

Real Box Model



Вот список пунктов в iOs, который отображает результаты поиска.



И вот только фрагмент ObjC, который отрисовывает этот пункт:



Поговорим о наболевшем. Вы конечно же, можете создать первоначальное оформление в Interface Builder, но тогда вам придется попросту попрощаться с удобной и плавной прокруткой. Может быть, в будущем, когда iOs-устройства станут чертовски быстрыми.

Как люди, мы обычно не думаем, что «Название должно быть расположен на 30 — 40 пикселей, с максимальной высотой 35 пикселей». Вместо этого мы думаем «Название должно быть выше субтитров, а также справа от изображения, и иметь не более 2 строк».

У Android есть система контейнеров разметок (похожих на HTML), которая позволяют описать, где должно располагаться содержимое относительно чего-либо. Вот аналогичный фрагмент из того же результата поиска в Android:



Теперь вам придется выучить все эти типы разметок, такие как FrameLayout, LinearLayout, RelativeLayout, и выучить все их индивидуальные особенности, но в конце вы получите очень естественную и гибкую систему разметок UI.

Лучшая часть, что не требуется никаких усилий для того, чтобы автоматически изменять размер для портретной/ландшафтной ориентации устройства и различных размеров экрана. Это большой контраст по сравнению с абсолютно примитивной springs and struts системой в Cocoa/iOS.

Но вот нюанс об упрощенном оформлении системы в iOs, над которым я насмехался, оказался разумным копромисом, когда я рассмотрел...

Анимация



О чем следует подумать в Android, так это о том, что обычно он выглядит именно так:



Он был задуман и разработан в дни Blackberry, Windows Mobile и преддверии iPhone. Влияние этих платформ очень глубоко вошло в Android OS.

Например. Система отображения, то есть способ, посредством которого UI виджеты, такие как меню, кнопки и т.д. нарисованные на экране, в основном реализован программно.

Что это значит? Давайте посмотрим на скриншот выше в качестве примера. Если вы нажмете кнопку Вниз, вы ждете, что запись «Homepage» будет выбрана вместо «Go to». Итак, вы нажимаете Вниз. Это вызывает «invalidate», что означает «пожалуйста, перерисуй экран». Таким образом, экран будет очищен, затем:

  1. ОС обновляет строку состояния наверху;
  2. WebView перерисовывает сайт Google.com;
  3. Меню отрисовывает полупрозрачный черный фон и границы;
  4. Все меню и текст отрисовываются;
  5. Синяя градиентная подсветка отрисовывается над «Homepage».


Все это происходит очень быстро и вы видите только конечный результат, так что может показаться, как будто лишь несколько пикселей было изменено, но на самом деле весь экран должен быть пересмотрен и перерисован.

Если это звучит вам знакомо, так это потому, что это основной метод, используемый в GDI, системе отображения, представленной в Microsoft Windows 1.0. Это звучит убийственно, но на самом деле большинство GUI управлялись подобным образом.

До тех пор, пока не появился iPhone...



Когда вы используете iPhone и играете в ускоренные аппаратно 3D-игры, вы знаете, что в 3D все сделано из сотни маленьких треугольников.

Когда вы резко перемещаетесь по списку друзей в приложении Contacts, вы заставляете треугольники передвигаться. И здесь также существует «камера», как и в 3D-шутере, но это камера зафиксирована над виртуальной поверхностью приложения Contacts и поэтому кажется, что приложение 2D.

Это был долгий способ, чтобы сказать, что все на iOs рисуется с помощью OpenGL. Вот почему анимация на iOs так быстра. Возможно, вы заметили, что -drawRect не вызывается для каждого кадра в анимации. Она вызывается однажды, затем вы рисуете свои линии, окружности и текст на поверхности OpenGL (который вы даже не реализовываете), затем Core Animation передвигает эти поверхности вокруг, подобно натягиванию струн на марионетке. И окончательное наложение изображения для каждого кадра выполняется аппаратно при помощи GPU.

По-видимому, Android принял решение раньше о том, что не надо заставлять своих партнеров-производителей добавлять GPU. Это решение было логичным в предверии выхода iPhone, но теперь оно огорчает, также как новое аппаратное ускорение в Android 3.0, которое ограничено начальной программной сборкой системы.

Таким образом, в прекрасной гибкой системе расположений в Android нужно быть очень осторожным. Анимируя определенные набор свойств, вы можете легко заставить процессор делать эту капризную и дорогую раскладку на каждом кадре анимации. И в этом время процессор очень занят разбором некоторых JSON из веб-API или чем-нибудь другим, хорошо?

Meridian для Android



В общем, у нас ушло около 4-х месяцев для разработки, создания и выпуска Meridian для Android.

Когда мы впервые выпустили Meridian, номером один в отзывах было: «Вы сделаете версию для Android, пожалуйста?». Даже часто без «пожалуйста».

И получается, что Android является третьей платформой для Meridian. Первой был Windows Mobile, можете в это поверить?



Мы начали создавать то, что мы теперь называем «Meridian» еще до появления iPhone. В то время Windows Mobile была единственной мобильной платформой, способной предоставить нам желаемые практические навыки.

Таким образом, можно сказать, что теперь я имею обширное представление обо всем этом. Всегда будут появляться новые платформы и новые парадигмы для изучения. Лучшее, что мы можем сделать, это понять, откуда они появились и воспользоваться всеми преимуществами и недостатками, чтобы как можно быстрее добавить некоторые удивительные функции, прежде чем они поменяются еще раз.
Tags:
Hubs:
+59
Comments36

Articles

Change theme settings

Information

Website
www.e-legion.ru
Registered
Founded
Employees
101–200 employees
Location
Россия