Инструменты Android-разработчика: скрытые возможности

IT-копирайтер
Время чтения: 5 минут
Разработка мобильных приложений – длительный и трудоёмкий процесс. При этом бизнес заинтересован, чтобы приложение увидело свет как можно скорее. В распоряжении мобильных разработчиков всегда есть масса полезных инструментов для ускорения работы.
С выходом новых версий мобильных платформ набор инструментов для разработчиков обновляется и пополняется. Тем не менее, уследить за всеми нововведениями трудно. Что уж говорить о дополнительных функциях, которые не анонсируются отдельно, хотя и могут быть полезны при выполнении привычных действий.
В частности, во время создания мобильного приложения каждому Android-разработчику приходится решать ряд проблем. Например:
- Проверять, как визуально будет выглядеть лейаут на этапе разработки, до его запуска на мобильном устройстве;
- Усиливать средства проверки кода, такие, как Lint; находить в коде сложно выявляемые ошибки перед этапом компиляции;
- Подбирать варианты растровой графики под все разрешения экрана, для всех желаемых состояний (enabled, disabled, pressed и других), и экспортировать их в различные цифровые устройства;
- Выявлять утечки памяти на этапе разработки в дебаг–сборках приложения.
Опытный специалист без труда справится с перечисленными задачами. Однако не для всех очевидны способы эффективного и быстрого разрешения острых вопросов. Рассмотрим некоторые из них подробно.
1. Tools Attributes
Решение: Tools Attributes помогают управлять Android Studio, задействуя новое пространство имён так, что среда разработки не переносит рабочие варианты атрибутов в финальную сборку приложения.
Казалось бы, у Android-разработчика есть только один путь проверить, насколько хорошо выполнен лейаут – запустить его на мобильном девайсе. На деле есть замечательная возможность использовать Tools Attributes, которые встроены в среду разработки, в нашем случае в Android Studio.
Условно выделяют две основные категории:
- Lint attributes
- Design attributes
Lint – это инструмент статистического анализа, который применяется во многих языках программирования и программных платформах. Использование Lint attributes позволяет координировать работу инструмента Lint, когда это необходимо.
К атрибутам Lint относятся:
• tools:ignore
Атрибут tools:ignore позволяет настроить инструмент Lint таким образом, чтобы он не обращал внимания на определенный атрибут в XML-файле. Например,
tools:ignore="ContentDescription"
– @SupressWarning для XML.
• tools:targetApi
Атрибут tools:targetApi действует по аналогии с аннотацией @TargetApi и показывает минимальную версию API, к которой будет обращаться приложение. Например, вы используете Android KitKat, а минимальный уровень API в вашем проекте равен 21. Тогда вы просто прописываете в коде атрибут tools:targetAPI с той версией, которая вас устраивает. Это помогает подавить предупреждения от Lint.
• tools:locale
Этот атрибут поможет вам настроить язык и отключить предупреждения о неправильном правописании. Например, ваши строки содержат только испанский текст, тогда вы делаете настройку «испанский по умолчанию»:
<resources xmlns:tools=»http://schemas.android.com/tools» tools:locale=»es»>
– по умолчанию испанский + spell checking
Что касается Design attributes, то они способны существенно помочь вам при создании лейаутов в XML в вашей среде разработки.
Design attributes включают:
• tools:context
Tools:context используется, чтобы показать среде разработки, в каком классе активности будет реализован лейаут. С помощью этого атрибута Android Studio автоматически выбирает нужную тему для отображения в окне предварительного просмотра (preview).
• tools:showIn
Использование этого атрибута помогает указать, какая конкретно разметка предназначена для вывода в окне предварительного просмотра. Например,
tools:showIn="@layout/activity_main"
— для include layout. Так разработчик может посмотреть, как будет выглядеть его представление в конкретном layout.
• tools:listitem, listheader, listfooter
Настроить внешний вид компонентов будет проще, указав соответствующую разметку для отдельных элементов списка, заголовка и футера. Например,
tools:listitem, listheader, listfooter=»@android:layout/simple_list_item_2″
• tools:layout
Атрибут tools:layout позволяет отобразить макет фрагмента на экран активности. Например,
tools:layout=»@android:layout/list_content»
В целом, с Tools Attributes разработчик может не волноваться, что однажды забудет удалить из кода временный текст.
2. Support Annotations
Решение: аннотации из Android Support Library помогают Android Studio улучшить код. Это работает начиная с версии Android studio 1.3.0, иначе необходимо подключать отдельно.
Библиотека Android Support Annotations помогает находить баги в разрабатываемых приложениях. Добавляя аннотации в свой проект, разработчик существенно облегчает себе задачу сохранения чистого кода.
Аннотации делятся на:
• Нулевой тип
@Nullable, @NonNull
Это аннотации, допускающие или, наоборот, не допускающие нулевое значение. Могут применяться для полей кода, для параметров и для методов. Важно понимать главное различие с полным отсутствием аннотаций – аннотации нулевого типа только определяют, равно ли значение параметра нулю или нет.
• Ресурсный тип
@StringRes, @DrawableRes, @ColorRes
При написании кода разработчики часто обращаются к ресурсам строк, изображений и другим. Использование аннотаций ресурсного типа помогает усилить введенный текст. Например, добавляя аннотацию @ColorRes, вы получите предупреждение от среды разработки, если попытаетесь ввести код цвета, а не ссылку на ID из ресурсов. Без аннотации IDE не будет “ругаться”, т.к. и код, и ссылка на ID ресурса являются int.
• Для задания цвета
@ColorInt
@ColorInt является противоположностью аннотации @ColorRes. В данном случае вы определяете, что метод должен обращаться не к ID ресурса, а к конкретному цвету. Установив аннотацию @ColorInt, вы легко обнаружите ошибку, если метод будет обращаться к ID цветового ресурса.
• Для потоков
@UiThread, @MainThread, @WorkerThread, @BinderThread
Специальные аннотации для указания потоков позволяют определить связь потока с методом.
• Для задания промежутка значений
@Size(min = 5), @IntRange(from = 0, to = 12), @FloatRange(…)
Практически невозможно использовать только нормальные значения параметров при написании кода. Чтобы задать промежутки возможных значений, достаточно прописать аннотации @IntRange или @FloatRange. Чтобы установить ограничения в размерах и длине строк в массивах данных, коллекциях или потоках, подойдет аннотация @Size.
• Для получения разрешений
@RequestPremission(Manifest.permission.ACCESS_FINE_LOCATION)
Вы можете определить одно разрешение или целый список разрешений, чтобы при обращении к методу было понятно, что ваше приложение должно иметь этот список разрешений. Если разрешения не будет, то разработчик легко обнаружит ошибку в коде.
• Для вызова суперкласса
@CallSuper
Эта аннотация используется, когда необходимо вызвать метод родительского класса.
• IntDef and StringDef
С таким типом аннотаций мы можем использовать обобщающие понятия для замены отдельных перечисленных постоянных значений. Например, у нас есть IceCreamFlavourManager class, который включает 3 возможных модели для использования: VANILLA, CHOCOLATE и STRAWBERRY. С помощью @IntDef мы можем создать новую аннотацию под названием @Flavour и обозначить ее отдельные значения.
3. Cut&Slice me
Решение: плагин Photoshop Cut&Slice me позволяет в одно нажатие генерировать нарезку растровой графики под все разрешения экрана, для всех интересующих нас состояний (enabled, disabled, pressed…). Ресурсы раскладываются в нужные папки автоматически для Android (drawable-xxhdpi, drawable-xhdpi, ..), для iOS создаются корректные префиксы имён (@2x, @3x).
Мы активно используем плагин Cut&Slice me с 2013 года. При этом он актуален не только для Android, но и для iOS-разработчиков.
4. LeakCanary
Решение: библиотека LeakCanary помогает разработчику обнаружить утечку в памяти в runtime режиме, на этапе разработки в дебаг-сборках.
Обычно разработчики вынуждены искать утечки памяти фактически вручную. Сначала выявляют ошибки OutOfMemoryError. Затем пытаются на различных девайсах воспроизвести проблему, которая привела к ошибке. При этом стараются отследить последовательность действий, приводящих к утечке. Создают дамп памяти и изучают его, чтобы обнаружить объекты, которые должен был утилизировать сборщик мусора. Ищут короткие пути ссылок от объектов до корней сборщика мусора и, наконец, находят ссылку, появление которой спровоцировало утечку памяти.
LeakCanary позволяет автоматизировать все стадии поиска и помогает оперативно найти все утечки. Дополнительным преимуществом являются опции отправки данных об утечках на сервер и исключение рефлекшн-ссылок и определенных действий из метода.
Подводя итоги, можно сказать, что в распоряжении Android-разработчиков есть множество инструментов, которые существенно упрощают процесс разработки приложений. В частности, существует ряд доступных решений, которые многие игнорируют или даже не знают о них: Tools Attributes, Support Annotations, Cut&Slice me, LeakCanary и системы багрепортинга. О последних мы расскажем в следующей статье.
Выбор набора рабочих инструментов, как правило, ограничивается личными предпочтениями разработчиков или особенностями проекта. Если вы хотите рассказать о своих must-have, вы можете делиться ими в комментариях. Мы будем рады узнать ваше мнение и пополнить нашу копилку полезных инструментов.
Чистого кода и успешных проектов!
Комментарии