Upload
mobicode
View
76
Download
0
Embed Size (px)
Citation preview
Quality. Android Quality
Александр Толстых@a_tolstykh
Sharewire Гаага, Нидерланды
КАК ПОВЫСИТЬ КАЧЕСТВО КОДА И СОХРАНИТЬ ВРЕМЯС ПОМОЩЬЮ ПРАВИЛЬНОЙ НАЧАЛЬНОЙ КОНФИГУРАЦИИ ПРОЕКТА
ПЛАН1. Инструменты качества
(Quality tools)
2. Инструменты для разработчиков(Developer tools)
4. Инструменты-хелперы
3. Анализ метрик приложения
#qualityMatters
1. Инструменты качества(Quality tools)
- Lint
- Findbugs
- PMD
- Checkstyle
- Copy/Paste detector
- Гибок в конфигурации
#qualityMatters
LINT
- Доступен “из коробки”
- 200 готовых правил
- Написание собственных правил(custom rules)
QUALITY TOOLS. LINT
Хорошая статья о написании собственных правил (custom rules): https://www.bignerdranch.com/blog/building-custom-lint-checks-in-android/
- Интеграция с Андроид студией
- Андроид ориентирован
#qualityMatters… или положите набор исключений в lint.xml
НЕ ИГНОРИРУЙТЕ LINT!
QUALITY TOOLS. LINT
ХОРОШОПЛОХО
#qualityMatters
Примеры:
QUALITY TOOLS. LINT
- MissingSuperCall если родительский метод имеет @SuperCall аннотацию
- CommitTransaction когда commit() не вызван на транзиции фрагмента
- DuplicateIds одинаковые идентификаторы в рамках одного экрана (xml layout)
- ResourceType использование ресурса неверного типа (@StringRes, @DrawableRes, @ColorRes...)
- NewApi вызов методов из нового API на неподдерживаемой версии платформы
… и многие другие
Полный список правил: http://tools.android.com/tips/lint-checks
Quality toolsFindbugs
- Анализирует java-байткод
- Требует “адаптацию” под Андроид
- Время- и трудоемкая начальная настройка
#qualityMattershttp://findbugs.sourceforge.net/https://docs.gradle.org/current/dsl/org.gradle.api.plugins.quality.FindBugs.html
#qualityMatters
Примеры:
QUALITY TOOLS. FINDBUGS
- Конкатенация строки с помощью + в цикле
- Сравнение строк с помощью == или !=
- Вызов toString() на объекте типа String
- Floating point equality
- Поток (stream) может быть не закрыт при выходе из метода
- Неиспользуемые переменные/методы
… и многие другие
Полный список: http://findbugs.sourceforge.net/bugDescriptions.html
Quality tools. PMD- Анализирует Java код
- Время- и трудоемкая начальная настройка
- Аналог findbugs (есть пересечения)
- Набор Андроид- ориентированных правил (5!)
- “Обратная конфигурация”
https://docs.gradle.org/current/userguide/pmd_plugin.html #qualityMatters
https://pmd.github.io/
#qualityMatters
ПРИМЕРЫ
QUALITY TOOLS. PMD
- GodClass
- DoNotHardCodeSDCard. Используйте Environment.getExternalStorageDirectory() вместо “/sdcard”
- AvoidInstantiatingObjectsInLoops
- LooseCoupling. Избегайте использование реализаций коллекций (i.e., HashSet); лучше
использовать интерфейсы коллекций (i.e, Set)
- AvoidCatchingThrowable, AvoidCatchingNPE
- UseArrayListInsteadOfVector
- UncommentedEmptyMethodBody, UncommentedEmptyConstructor
… и многие другие
Полный набор правил: https://pmd.github.io/pmd-5.4.1/pmd-java/rules/index.html
QUALITY TOOLS. CHECKSTYLEИнструмент проверки соответствия стиля!
- Sun Code Conventions- Google Java Style- Написание собственных правил
#qualityMattershttp://checkstyle.sourceforge.net/https://docs.gradle.org/current/userguide/checkstyle_plugin.html
ОБНАРУЖИВАЕТ:
проблемы проектирования
класса
проблемы проектирования
метода
проблемы форматирования
#qualityMattershttps://pmd.github.io/pmd-5.4.1/usage/cpd-usage.htmlhttps://github.com/aaschmid/gradle-cpd-plugin
- Игнорирует одинаковые фрагменты в импортах и копирайтах
- Может быть использован как автономный инструментбез интеграции (.bat/.sh)
- Поддерживаемые языки cpp, go, java, matlab, objective-c, php, python, ruby, scala...
Поиск одинаковых фрагментов кода (или как поймать копи-пастера)
QUALITY TOOLS. COPY-PASTE DETECTOR
QUALITY TOOLS
Работать над проектом, со всеми включенными проверками, на максимальном
уровне критичности, напоминает прохождение компьютерной игры на уровне
сложности “NIGHTMARE”
#qualityMatters
Не стоит слепо верить всему, что “советуют” данные инструменты.
Все ошибки/замечания следует внимательно проанализировать, прежде чем
исправлять
- Выше качество кода, читабельность, дисциплина!
- Вся команда должна быть на одной волне- Изначально поддержка требует времени и сил
- Достаточно запускать непосредственно перед коммитом- Quality tools + CI = MAXIMUM PROFIT
Lint, findbugs, checkstyle, pmd, cpd, etc
QUALITY TOOLS
#qualityMatters
2. Инструменты для разработчиков
(Dev tools)
На базе проекта Артема Зиннатуллина qualitymatters https://github.com/artem-zinnatullin/qualitymatters
- Stetho
- LeakCanary
- Lynx
- Timber
Что мы используем на практике:
- Общая информация о сборке. Paperwork- Доступ к логам (logcat + network). Lynx, OkHttp- Crash reporting- Подменяемый URL (integration with Mock-Server)!- Инструменты диагностики
“Debug only, scalable, stand-alone, not embedded into layout, not embedded into a project code!”
DEV TOOLS
#qualityMatters
#qualityMattershttp://facebook.github.io/stetho/
DEV TOOLS. STETHO
Отладочный мост для Android приложений. Открытый исходный код.Разрабатывается командой из Facebook.
- Network Inspection
- View Hierarchy
- Database Inspection
- dumpapp - мощный интерфейс для доступа к приложению “изнутри”
#qualityMattershttps://github.com/square/leakcanary
DEV TOOLS. LEAKCANARY
Библиотека для поиска утечек памяти в Android и Java.
https://github.com/pedrovgs/Lynx
DEV TOOLS. LYNX
Lynx - открытая библиотека открывающая доступ к логам непосредственно из приложения.
- Фильтрация по тексту- Фильтрация по уровню логирования- Logs sharing - Скрытый “запуск встряхиванием”
#qualityMatters
- Поставляется с встроенными LINT-правилами!
#qualityMattershttps://github.com/JakeWharton/timber
“Every time you log in production, a puppy dies.” – Jake Wharton
DEV TOOLS. TIMBER
- БЕЗ TAG КОНСТАНТ!
- Легко модифицируемая интеграция
- Негласный стандарт логирования
DEV TOOLS. CRASH-REPORTING TOOL
Не важно какой именно инструмент, важно добавить его с самого начала разработки
#qualityMatters
- Логируйте не только ошибки, но и UN-expected состояния- Игнорируйте исключения в дебажных версиях- Проверяйте исключения в процессе разработки- Конструктивные сообщения к логируемым исключениям
#qualityMatters
DEV SETTINGS. ВЫВОДЫ
- Добавляйте только те инструменты, которые подходят проекту.
- Извлекайте инструменты в отдельную библиотеку(и), если их много.
- Поддержка этих инструментов не должна занимать времени!
3. Анализ метрик приложения- Tiny Dancer
- Hugo
- AndroidDevMetrics
#perfMatters
APPLICATION METRICS. ОБЩИЕ МЕТРИКИВсегда анализируйте
- Время запуска.- Размер приложения.
Полезно знать:- Test coverage (JaCoCo)
https://docs.gradle.org/current/userguide/jacoco_plugin.html
- Время сборки.
Библиотека расчета fps в режиме реального времени
- fps текущего окна
- количество пропущенных кадров
https://github.com/friendlyrobotnyc/TinyDancer
APPLICATION METRICS. TINY DANCER
#perfMatters
#perfMatters
@DebugLog
public String getName(String first, String last) {
SystemClock.sleep(15); // Don't ever really do this!
return first + " " + last;
}
V/Example: ⇢ getName(first="Jake", last="Wharton")
V/Example: ⇠ getName [16ms] = "Jake Wharton"
- аргументы вызова метода - возвращаемый результат- время выполнения
APPLICATION METRICS. HUGO
Библиотека для логирования параметров и времени выполнения методов на основе аннотаций
https://github.com/JakeWharton/hugo
Логирует:
https://github.com/frogermcs/AndroidDevMetrics
APPLICATION METRICS.ANDROID DEV METRICS
- Измеряет время вызовов методов жизненного цикла активити
- Измеряет время инициализации объектов Dagger 2
- Позволяет запустить method tracing вместе со следующим запуском приложения
- Считает количество пропущенных кадров
БИБЛИОТЕКА МЕТРИК ПРОИЗВОДИТЕЛЬНОСТИ Android ПРИЛОЖЕНИЯ
#perfMatters
4. Инструменты-хелперы- Управление ресурсами
УПРАВЛЕНИЕ РЕСУРСАМИ
Менеджмент строк (переводов) или цветов:
- Храните все ресурсы для нескольких платформ в одном месте
- Оперируйте идентификаторами, не значениями- Не меняйте содержимое только локально- Автоматизируйте импорт в проект, если возможно
Сложности с именованием цветов? -> http://chir.ag/projects/name-that-color#DCD6D5 -> Swiss Coffee#FEE56D -> Kournikova
https://crowdin.com/https://localise.biz/...илиОбщий файл
ВЫВОДЫ
- Все данные инструменты созданы для того, чтобы облегчить жизнь, а не усложнить!
- Добавляйте только необходимые инструменты
- No warnings != no bugs.
- Это требует время. И терпение.
СПАСИБО!
Александр Толстых
@a_tolstykh
+OleksandrTolstykhСсылки: https://goo.gl/jlTV0d