Содержание статьи
Начиная осваивать разработку для любой платформы, ты обязательно сразу же наткнешься на множество с первого взгляда незаметных подводных камней. Большинство из них будут связаны с самим процессом кодинга: несостыковки в API, скрытые функции, ограничения, особый стиль программирования для платформы. Есть и камни, лежащие немного поодаль: тестирование и автоматическая оптимизация, создание клипарта и иконок, получение автоматических краш-репортов. Неопытные разработчики для Android рискуют отбить о них обе ноги.
В этой статье мы рассмотрим проблемы разработки для Android в контексте утилит и инструментов. Мы избавимся от необходимости подключать смартфон с помощью кабеля во время тестирования и отладки на устройстве, расщепим приложение на версии Lite и Pro, встроим в него механизм автоматической генерации и отсылки на сервер краш-репортов, автоматизируем тестирование, обфусцируем и оптимизируем код, а также за несколько минут создадим для приложения иконку и все необходимые ресурсы. Поехали.
1. Медленный эмулятор
Итак, ты набросал свое первое приложение, и пора его запустить и проверить на работоспособность. Для этого в комплекте Android SDK есть эмулятор. Долгое время его упрекали за медлительность, но с выпуском Android Studio 2.0 ситуация намного улучшилась — x86-версия эмулятора получила хардварное ускорение, так что теперь он работает быстрее реальных устройств. К тому же у него появился удобный графический интерфейс, с помощью которого можно симулировать звонки, СМС, изменять данные GPS и сбои в сети, то есть все, для чего раньше приходилось использовать инструменты командной строки.
Поэтому, если ты еще не обновился, настоятельно рекомендую это сделать, не говоря уже о переходе с Eclipse. И обязательно выбирать x86-версию эмулятора в AVD manager, ARM-версия не поддерживает хардварное ускорение.
Xakep #211. Когда «Окна» смотрят в тебя
2. Смартфон на поводке
Второй этап — тестирование на реальном устройстве. Здесь все просто: подключаешь смартфон по USB, устанавливаешь драйверы, включаешь режим отладки в настройках для разработчиков, после чего девайс появляется в списке доступных для установки приложения (рядом с эмулятором). Проблема только в том, что в данном случае устройство необходимо держать подключенным к ПК с помощью кабеля, а если это твой основной смартфон, на который поступают звонки и сообщения, то об удобстве говорить не приходится.
К счастью, Android Studio (а точнее, утилита ADB, которую он использует для связи с устройством) поддерживает работу по сети. Но данную функцию еще нужно активировать. Если у тебя рутованный смартфон, то тебе повезло: включить отладку по сети можно с помощью приложения WiFi ADB. Последовательность действий:
- Устанавливаем WiFi ADB, запускаем, включаем сетевой режим с помощью переключателя и запоминаем IP-адрес.
- Запускаем Android Studio.
- Открываем консоль, переходим в каталог с установленным SDK, далее в platform-tools и запускаем следующую команду:
$ adb connect IP-адрес
Теперь, если попытаться собрать и запустить приложение, ты увидишь в списке устройств также и свой смартфон. Те, у кого нет root, могут перезапустить ADB в сетевом режиме, предварительно подключив его кабелем. Делается это так:
- Подключаем смартфон и устанавливаем драйверы.
- Включаем режим отладки в настройках для разработчиков.
- Открываем консоль, переходим в каталог SDK/platform-tools и запускаем следующую команду:
$ adb tcpip 5555
- Подключаемся к смартфону по сети:
$ adb connect IP-адрес
IP-адрес можно узнать через настройки: «О телефоне (О планшете) → Общие сведения», пункт «IP-адрес».
3. Библиотеки
Окей, твой накиданный за полчаса огрызок вроде бы работает, и настало время превратить его в настоящее приложение с красивым интерфейсом и виджетами для рабочего стола. На этом этапе тебе наверняка понадобятся внешние библиотеки, реализующие различные концепции интерфейса, паттерны программирования и связь с внешними сервисами. И если с последними все ясно (нужен SDK для Dropbox — открываешь портал для разработчиков и следуешь инструкциям), то с остальными уже сложнее. Где их искать и какие библиотеки лучше?
Наиболее полный каталог библиотек — это Android Arsenal. Там ты найдешь практически все, что тебе нужно. Доступны удобный поиск и сортировка по рейтингу, для каждой библиотеки есть инструкция, как ее подключить к своему проекту, в том числе с помощью стандартной для Android системы сборки Gradle: достаточно добавить репозиторий в файл build.gradle проекта и указать библиотеку в списке зависимостей.
Отличный список must have библиотек ты найдешь на этой странице. От себя добавлю, что на первых этапах стоит сразу изучить Dagger 2, RxJava и Retrofit. Став продвинутым разработчиком, ты так или иначе придешь к использованию этих библиотек.
4. Иконки и клипарт
Наконец, спустя дни или недели у тебя начинает вырисовываться полноценное приложение. Вот только никакого графического материала нет до сих пор: иконка стандартная, в форме зеленого робота, вместо клипарта — заглушки. Очевидно, без графики соваться в маркеты бессмысленно, однако и платить за иконку для своего первого приложения тоже глупо. Что делать?
На самом деле иконку можно сгенерировать. Есть замечательный веб-сервис Android Asset Studio, с помощью которого буквально за пару минут ты получишь красивую иконку во всех возможных разрешениях. В качестве основы можно взять подготовленную тобой картинку, просто написать текст или, что лучше всего, выбрать из предоставленного сервисом клипарта. Также ты сможешь задать стиль иконки (круглая, квадратная, в стиле iOS...), цвет, настроить тени и другие параметры. В результате в твоем распоряжении появится архив ic_launcher.zip
, который необходимо развернуть в каталог AndroidstudioProjects/ИМЯ_ПРИЛОЖЕНИЯ/app/src/main/res
. Обязательно создай веб-иконку, нажав на кнопку «Generate web icon». Она тебе понадобится.
Тот же сервис позволяет создать иконки для ActionBar’а и строки состояния. Принцип примерно тот же, скажу лишь, что в строке состояния лучше всего смотрятся иконки с отступом от краев 15%.
Кроме того, тебе понадобится так называемая Feature Image. Это специальная картинка, которую Play Market и другие магазины приложений используют в качестве плашки в верхней части экрана (когда открываешь страницу приложения на смартфоне). Ее можно сгенерировать с помощью другого сервиса. Для оформления скриншотов можно использовать официальный сервис от Google. Он создает вокруг скриншота рамку смартфона.
5. Краш-репорты
Приложение готово, иконка есть, интерфейс удобный, код качественный. Настало время тестирования, и первое, что ты делаешь, — рассылаешь приложение друзьям и знакомым. Но вот незадача: у некоторых из них приложение падает, а у тебя все работает отлично, и повторить действия, приведшие к падению, ты не можешь. Что делать, просить друзей присылать тебе листинг logcat?
Нет, нам нужна система краш-репортинга. Таких существует огромное множество, и все они реализуют один и тот же принцип работы: к приложению подключается небольшая библиотека, которая в момент падения записывает стектрейс и другие данные о падении и отправляет их на сервер, а затем специальный веб-интерфейс формирует на их основе красивые и наглядные отчеты.
Одна из самых популярных таких систем — Fabric, однако я рекомендую посмотреть в сторону Splunk MINT: он бесплатный, простой и легко интегрируется в приложение (достаточно добавить всего одну строку кода). Чтобы начать им пользоваться, необходимо подключить к проекту SDK, сделать это можно с помощью все того же Gradle. Открываем файл build.gradle
(тот, что относится к приложению, а не ко всему проекту) и добавляем следующие строки:
repositories {
maven { url "https://mint.splunk.com/gradle/" }
}
dependencies {
compile "com.splunk.mint:mint:5.0.0"
}
Далее открываем веб-страницу Splunk MINT, регистрируемся и добавляем новое приложение через панель управления (add app):
После этого Splunk MINT покажет тебе строку кода, которую необходимо вставить в код:
Лучшее место для этой строки — основная активность твоего приложения (по умолчанию носит имя MainActivity.java), самое начало метода onCreate()
. Однако если ты пишешь сервисное приложение, которое может работать без интерфейса и запускаться во время загрузки или по расписанию, то строку следует вставлять в код сервиса, тоже в начало onCreate()
.
После сборки приложения и установки на устройство Splunk MINT начнет работать. Ты получишь доступ к статистике (количество установок, юзеров, падений, версии Android, использование сети и прочее):
Ну и конечно же, статистика падений и стектрейсы:
Этой информации вполне достаточно для решения проблемы.
6. Тестирование
Отлично, приложение прошло через твоих друзей, и оно им понравилось. Что дальше? Выкладывать в маркет? Нет, теперь нужно пропустить его через систему автоматического тестирования и профессиональных человекообразных тестеров.
Наверное, лучший сервис автоматического тестирования — это Xamarin. Он позволяет запустить приложение на двух тысячах виртуальных устройств, выполнять операции взаимодействия с пользователем (тапы, жесты, смахивания, нажатия физических кнопок), изменять положение смартфона, включать камеру и многое другое. В ответ на каждое действие ты получаешь скриншот, а также статистику потребления памяти, процессора и прочего.
Проблема Xamarin только в том, что тесты придется писать самому, используя фреймворк Calabash, то есть, по сути, писать еще одно приложение (на Ruby или C#) для тестирования первого. Сам сервис, конечно же, платный. Триальный период составляет 30 дней, после чего придется платить от 100 долларов в месяц. С другой стороны, сам Calabash — это open source проект, так что все можно настроить и на локальной машине.
С тестированием реальными людьми все несколько проще. Достаточно иметь готовое приложение и описание на обычном человеческом языке, что конкретно ты хочешь от тестировщика. Далее подбираем подходящий сервис, загружаем приложение, требования и ждем. Какой сервис выбрать? Их много, но лучше остановиться на Ubertesters. У них весьма демократичные цены, плюс в нагрузку ты получаешь аналог Splunk MINT абсолютно бесплатно. Один час тестирования стоит от 25 долларов.
7. Обфускация и оптимизация
Окей, приложение протестировано со всех сторон, и пора его выложить в маркет. Но сперва нужно позаботиться о том, чтобы никто не смог украсть твою суперидею, — все-таки байт-код Dalvik весьма прост, и его не только легко читать после дизассемблирования, но и в большинстве случаев реально перегнать во вполне рабочий исходный код Java. Причем сделать это можно с помощью самого Android Studio без всяких сторонних инструментов.
К счастью для нас, большинство реверсеров мобильных приложений — слабаки, неспособные расковырять код после применения простейшего обфускатора. И такой обфускатор есть в составе Android Studio. Он носит имя ProGuard и включается простой директивой minifyEnabled true
в файле build.gradle
приложения:
buildTypes {
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Принцип работы ProGuard довольно прост: он переименовывает имена всех классов, методов и полей (MainActivity.class становится A.class, onCreate()
превращается в b()
и так далее), а также удаляет всю отладочную информацию, неиспользуемый код и неиспользуемые параметры функций, выполняет инлайнинг методов (если метод-1 состоит из нескольких строк, метод-2 вызывает его множество раз, разумнее перенести код метода-1 в метод-2). Приложение становится компактнее, быстрее, а ориентироваться по нему после декомпиляции сложнее.
Для последующей оптимизации кода можно применить ReDex от Facebook. Как и ProGuard, он выполняет инлайнинг, удаляет мертвый код, а кроме того, делает так называемую feedback-directed optimization (FDO), которая позволяет разместить код, используемый при первом старте приложения, ближе к началу бинарника. Из других возможностей: удаление интерфейсов, которые реализуются только одним классом, и метаданных, включенных в байт-код (например, аннотации, необходимые исключительно на этапе сборки, и ссылки на файлы исходных текстов).
По словам разработчиков, ReDex не призван заменить ProGuard, а должен запускаться уже после него. В результате скорость старта и размер комплексного приложения удастся улучшить примерно на 25% (это информация разработчиков). Единственная проблема инструмента в том, что он доступен только для macOS и Linux. Причем в форме готовых пакетов его нет, придется собирать самостоятельно. В Linux этот процесс выглядит так:
$ git clone https://github.com/facebook/redex.git
$ cd redex
$ autoreconf -ivf && ./configure && make
$ sudo make install
Далее следует натравить его на пакет с приложением:
$ export ANDROID_SDK=/путь/до/SDK
$ redex --sign -s /путь/до/хранилища/ключей -a имя_ключа -s пароль app-release.apk -o app-release-optimzied.apk
Хранилище ключей, ключ и пароль ты должен знать, так как эта информация необходима для сборки релизной версии твоего приложения.
При необходимости можно применить тяжелую артиллерию, а именно — платные обфускаторы вроде AppSolid и DexProtector. Они позволяют не просто обфусцировать байт-код приложения, но и зашифровать строки, классы, код нативных библиотек, ресурсы и защитить приложение от модификации и перепаковки. Стоят они дорого, и к тому же их защита тоже может быть нейтрализована, причем совсем нехитрым способом.
INFO
Чтобы удалить неиспользуемые ресурсы, следует добавить в блок buildTypes → release директиву
shrinkResources true
.8. Lite- и Pro-версии
Ну все, пора выкладывать в Play Market. Хотя нет, стоп! Ты же не просто так сидел и писал ночами код, а потом, зевая, шел на учебу. Не зря перерыл кучу документации и терзал людей глупыми вопросами на Stack Overflow. Ты хочешь заработать, а в идеале не просто заработать, а разбогатеть! Поэтому у тебя есть четыре варианта дальнейших действий.
- Ты выкладываешь приложение в Play Market и назначаешь за него цену. Недостаток: людей придется каким-то образом убеждать, почему они должны установить твое приложение. Для начинающего разработчика это не вариант.
- Ты добавляешь в приложение рекламу. Недостаток: на рекламе ты заработаешь максимум на пиво, к тому же она сильно раздражает людей.
- Ты реализуешь систему in-app purchaise, то есть даешь возможность разблокировать дополнительные функции, заплатив прямо из приложения. Недостаток: in-app purchaise полностью завязан на Google Play Services, а значит, либо недоступен в других маркетах, либо реализуется там по-другому. Придется делать разные версии.
- Ты разбиваешь приложение на версии Lite и Pro, сохраняя таким образом возможность без модификаций выкладывать приложение в различные маркеты, в том числе китайские — их пользователи обычно не имеют доступа к сервисам Google. Недостаток: Pro-версию очень легко стащить.
Итого два приемлемых варианта: 3 и 4. Но так как третий вариант выходит далеко за рамки данной статьи (придется добавлять в приложение код и перестраивать его структуру, подробнее в официальной документации), то мы поговорим только о четвертом.
Для реализации этой идеи в системе сборки Gradle есть функция Flavors. Она позволяет собрать несколько вариантов приложения из одного проекта. Все, что требуется сделать, — это добавить в build.gradle приложения следующие строки:
productFlavors {
lite {
packageName = 'com.example.app'
}
pro {
packageName = 'com.example.app.pro'
}
}
После этого ты получишь доступ к переменной BuildConfig.FLAVOR
. Проверяя ее значение, можно изменять поведение приложения в зависимости от его варианта:
if (BuildConfig.FLAVOR.equals("pro") {
// Премиум-код
} else {
// Код для бедных
}
Однако у этого подхода есть изъян — оба варианта приложения будут включать в себя весь код, так что превратить Lite-версию в Pro можно будет правкой одной строки в дизассемблированном коде. Гораздо лучше полностью разделить исходники, отличающиеся в разных вариантах приложения. Для этого достаточно рядом с каталогом main внутри app/src
проекта создать два каталога с именами вариантов (Lite и Pro), а в них подкаталоги java/com/example/app
, где разместить исходники, различающиеся для каждого варианта. К примеру, в случае с классом Premium структура каталога будет выглядеть так:
9. Тонкости Google Play
Разработка завершена, поздравляю! Но на этом твоя эпопея еще не закончена, Google Play не так прост, как кажется. Во-первых, тебе нужны 25 долларов. Без них в маркет не пустят. Во-вторых, сразу после создания нового приложения в Developers Console необходимо сменить язык по умолчанию на английский (Переводы → Сменить язык по умолчанию):
Иначе все, у кого смартфон настроен на использование отличного от русского языка, все равно будут видеть описание на русском. Конечно же, само описание тоже нужно заранее подготовить на обоих языках (если не знаешь английский — попроси друга), так же как и скриншоты. Это просто, достаточно сделать скриншоты, затем переключить язык в настройках смартфона и повторить действия.
Также от тебя потребуют значок в высоком разрешении и значок для раздела «Рекомендуемые». Если ты следовал инструкциям из статьи, они у тебя уже должны быть — это те самые веб-иконка и Feature Image.
Ну а далее все просто: тип приложения, категория, возрастная группа, веб-сайт, email. Когда ты заполнишь все поля и получишь сертификат IARC на публикацию приложений для указанной возрастной группы (он моментально приходит на email), останется только нажать кнопку «Опубликовать приложение» вверху страницы и ждать. Обычно первая публикация занимает в среднем час или два. Обновление — около тридцати минут, причем вне зависимости от того, обновил ли ты само приложение или исправил опечатку в описании.
10. Альтернативные маркеты
Тебя может это удивить, но уже через неделю после публикации в Play Market твое приложение начнет всплывать и во многих альтернативных маркетах, таких как AppsZoom и 1Mobile. Это хороший знак, и вместо того, чтобы беспокоиться, лучше самому предпринять дальнейшие шаги для размещения своего приложения в маркетах.
Чтобы тебе не пришлось долго искать, вот список наиболее перспективных:
- Amazon App Store — известный маркет от Amazon, предустанавливаемый на планшеты Kindle.
- GetJar — один из крупнейших альтернативных маркетов мобильных приложений. Согласно информации на начало 2015 года, содержит 849 036 приложений Java ME, BlackBerry, Symbian, Windows Mobile и Android.
- SlideMe — известный маркет, который китайцы часто предустанавливают на свои устройства вместо Google Play.
- Xiaomi App Store — официальный маркет китайского «производителя всего и вся» — Xiaomi.
- Baidu App Store — один из крупнейших китайских магазинов приложений.
- Samsung Galaxy Apps — официальный магазин приложений Samsung. Отличается очень дотошной проверкой публикуемых приложений.
- XDA Labs — магазин приложений форума XDA Developers. Хорошо подходит для публикации системных приложений и твиков, приложений, требующих root, и модулей Xposed.
Ну и не стоит забывать про форум 4pda.ru. Там всегда можно получить хороший фидбэк от юзеров.
Выводы
Создание приложения для Android с нуля — это не только кодинг. Тебе придется решить и множество других вопросов, из которых часть может потребовать денежных вливаний. Но, как мы выяснили, платить совсем не обязательно и при разработке инди-приложений вполне можно обойтись бесплатными инструментами.