Программирование под Android: 50 лучших инструментов
Знание Java и IDE – далеко не все, чтобы сделать программирование под Android комфортным. Рассмотрим полезные дополнения и рекомендации.
Предыдущая статья Разработка под Андроид: советы, инструменты и трюки.
Лучшее для кодинга
Используйте альтернативный HTTP-клиент OkHttp.
HttpUrlConnect страдает от некоторых багов. Okhttp решает эти проблемы. Анонс.
На локальные файлы aar можно ссылаться, как показано ниже:
dependencies { compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar') } repositories{ flatDir{ dirs 'libs' } }
Для удобной работы с логами можно использовать Pidcat
Делайте коммиты с помощью систем контроля версий (VCS) вроде Git
Программа ClassyShark
Это возможность проверить Android APK и получить необходимую информацию о методах, полях, зависимостях etc. Анализирует файлы aar, class, jar, so, apk.
Библиотека Stetho
Использование библиотеки позволяет дебажить программы с помощью Chrome Dev Tools. Включает такие инструменты, как Network Monitor, SharedPreference и т. д.
Приложение Battery Historian
Анализирует состояние батареи.
Используйте константы при работе с зависимостями (например, «1.2.0»)
Избегайте знака + при указании версий зависимостей.
- Так можно избежать ошибок, несмотря на изменение API.
- Устраняется необходимость всякий раз во время сборки осуществлять онлайн-проверку последних версий для каждой зависимости.
Отложите TimerTask и используйте Handler
Для публикации приложений (например, на GitHub) не стоит использовать основную электронную почту
Векторы вместо PNG
Если же это PNG, постарайтесь сжать файлы, используя TinyPNG.
Качественное программирование под Android подразумевает использование proguard
android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
Используйте shrinkResources
android { ... buildTypes { release { shrinkResources true minifyEnabled true ... } } }
Следуйте приведенному ниже правилу для ускорения сборки gradle:
Gradle memory >= Dex memory + 1Gb
Разделите свой apk, используя gradle и нативный код
Не объединяйте все вместе, потому что потом придется долго разбираться в исходниках.
defaultConfig { ... ndk { abiFilters "armeabi", "armeabi-v7a", "mips", "x86" } } // Разделение splits { abi { enable true reset() include 'armeabi', 'armeabi-v7a', 'mips', 'x86' //select ABIs to build APKs for universalApk false //generate an additional APK that contains all the ABIs } } // Карта project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'mips': 5, 'x86': 8] // Переименовать android.applicationVariants.all { variant -> // Назначить другой код версии для каждого вывода variant.outputs.each { output -> output.versionCodeOverride = project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode } }
Узнайте больше об архитектурах MVP и Clean
Попытайтесь понять и использовать TDD (Test Driven Development)
Для принудительной повторной загрузки зависимостей:
./gradlew --refresh-dependencies
Исключение выполнения определенной задачи из gradle
Предположим, необходимо убрать задачу javaDoc. Просто используйте в команде -x, а затем имя задачи. В нашем случае это javaDoc:
./gradlew clean build -x javaDoc
Чтобы каждое имя подпроекта совпадало с именем проекта
Добавьте эту строку в settings.gradle:
rootProject.children.each{ it.buildFileName = it.name + '.gradle' }
Больше трюков с gradle вы найдете здесь.
Следуйте принципу Do not Repeat Yourself (DRY)
Пакеты по функциям, а не по слоям
Изучите механизм Dependency Resolution
Со скоростью обновления Android-зависимостей рано или поздно вы столкнетесь с конфликтом зависимостей в приложении. Для этого используется Dependency Resolution. Официальный ресурс.
Используйте разные имена пакетов в случае дебаг-сборок:
android { buildTypes { debug { applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' } release { // ... } } }
Нужно уметь найти и остановить утечку памяти в Android-приложении
Если вы создаете градиент в xml с полностью прозрачной частью, будьте очень осторожны в использовании @android:color/transparent
Следуйте стандартным правилам в отношении имен для ваших ресурсов
Используйте специальные задачи gradle в ваших файлах build.gradle
Android использует Gradle в качестве системы сборки, что на самом деле упрощает реализацию многих вещей, автоматизируя процесс. Этот пост на reddit содержит много полезных gradle-скриптов.
Используйте подходящий .gitignore в проектах Android.
Используйте LeakCanary для обнаружения утечек памяти в приложении
Программирование под Android предусматривает использование таких библиотек, как эта. Именно они упрощают кодинг и делают приложение «шустрее».
Ускорьте сборку gradle в Android Studio 2.3+
- Перейдите к версии 3.4.1.
- Выполните команду в директории проекта, чтобы проапдейтить gradle wrapper:
./gradlew wrapper --gradle-version 3.4.1 --distribution-type all
- Установите необходимые свойства в глобальном файле gradle.properties:
android.enableBuildCache=true
Остановите сборку посредством gradle:
./gradlew -stop
Настройте gradle для загрузки отсутствующих элементов android sdk в автоматическом режиме
- Установите необходимые свойства в глобальном файле gradle.properties:
android.builder.sdkDownload=true
Это экспериментальный вариант, и он загружает только инструменты и платформы для сборки, но фактически не обновляет репозитории Google или Support.
Не подключайте jcenter() и mavenCentral() вместе в файле build.gradle
MavenCentral и так входит в JCenter.
Очистите кэш gradle, если считаете, что библиотеки support и google play services несовместимы в android sdk
- Перейдите в ~/.gradle/caches/ и удалите оттуда все.
- Откройте SDK Manager и выполните повторную синхронизацию всех файлов поддержки и служб Google Play.
- Затем повторная синхронизация вашего проекта (обновление зависимостей).
- Теперь все должно работать правильно.
Настройте удобные алиасы adb для терминала
Добавьте указанные ниже алиасы в файл ~/.bashrc или ~/.zshrc, сохраните и перезапустите терминал. После сохранения используйте их как показано в столбце «Применить»:
Настройте Android Studio на сбой сборки, если код содержит //STOPSHIP.
Чтобы добавить проверку на //STOPSHIP в lint, включите в build.gradle следующий код:
android { ... lintOptions { abortOnError true fatal 'StopShip' } }
Если в коде есть комментарий //STOPSHIP, это вызовет ошибку при создании apk-версии.
Вы можете включить подсветку //STOPSHIP в Android Studio (по умолчанию подсветка выключена). Это делается через Preferences → Editor → Code Style → Inspections. Найдите STOPSHIP, чтобы применить настройку.
Используйте alfi, чтобы найти оператор зависимостей gradle для библиотеки
Это консольная версия web-приложения Gradle, Please.
- Запуск:
alfi name_of_library
- Копирование нужной библиотеки.
- Вставка в build.gradle.
Вывод результатов юнит-тестов в консоль
android { ... testOptions.unitTests.all { testLogging { events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' outputs.upToDateWhen { false } showStandardStreams = true } } }
Сделайте сборку быстрее, используя офлайн режим
Программирование под Android нуждается в:
- Быстрой сборке:
./gradlew assembleDevelopDebug --offline
- Быстрых юнит-тестах:
./gradlew test --offline
Использовать абсрактный класс Logger
Если нужно инициализировать свою библиотеку автоматически, обратите внимание на Content Provider
Уменьшите размера установленного приложения с помощью "android:extractNativeLibs:false" в
Селективная сборка для конкретного метода в Android Studio
Используйте возможности Java 8, добавив sourceCompatibility & targetCompatibility в файл build.gradle:
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Задайте gradle-задачу для архивирования файлов apk и proguard при сборке с целью резервного копирования:
task deployApks(type:Copy) { description = "Copies APKs and Proguard mappings to the deploy directory" def appName = ""; def versionDir = android.defaultConfig.versionName+"_"+android.defaultConfig.versionCode; println("Copies APK and Proguard to " + versionDir) from 'build/outputs/mapping/release/' include '**/mapping.txt' into '../.admin/deploy/' + versionDir rename ('mapping.txt', "${versionDir}-mapping.txt") from ('.') { exclude '**/build', '**/src' } include '*.apk' into '../.admin/deploy/' + versionDir rename ('app-release.apk', "${appName}-${versionDir}.apk") }
Советы относительно UI/UX
Движение
Программирование под Android включает много составляющих. Например, в Material Design в качестве базиса используется физика реального мира. В реальности объекты не двигаются линейно. Это движение по искривленным дорожкам, с ускорением и замедлением в соответствии со свойствами движения.
Таким образом, движение должно также использовать данные свойства и анимировать объекты с сохранением естественности.
Например, автомобиль, покидающий экран, начинает движение медленно, а затем ускоряется, пока полностью не выйдет из кадра. Точно так же представления должны быть интерполированы с использованием классов AccelerateInterpolator, FastOutSlowInInterpolator, etc. Подробнее.
Оформление
Хотя пользовательские шрифты и могут использоваться для брендинга, лучше придерживаться стандартных Noto и Roboto из-за их узнаваемости. Особенно это касается основного текста.
Roboto охватывает латинские, греческие и кириллические символы, а Noto подходит для других языков.
Балансировка – важный аспект оформления, фундаментальная концепция которого заключается в том, что чем больше шрифт, тем менее жирным он должен быть.
Текст должен выравниваться по сетке с ячейками 4dp.
Лучшая длина текста для больших текстовых блоков составляет 40-60 символов в одной строке. Другие варианты вносят дисбаланс.
Иконки
Необходимый размер для иконок – 48dp с краями 1dp:
- 48px x 48px – mdpi
- 72px x 72px – hdpi
- 96px x 96px – xhdpi
- 144px x 144px – xxhdpi
- 192px x 192px – xxxhdpi
Дополнительная иконка 512px x 512px должна быть для Google Play. Значки материалов должны содержать следующие важные элементы:
- 1dp тонированный край наверху
- 1dp затененный край внизу
- мягкая тень вокруг всех краев поднятых элементов
- мягкий оттенок для обеспечения поверхностного свечения
Ripple
Для Ripple эффекта вместо ?android:attr используется ?attr/selectableItemBackground.
Для кнопки реализация должна включать:
android:background="?attr/selectableItemBackground"
Выходящий за края Ripple реализуется с помощью:
?attr/selectableItemBackgroundBorderless
Программирование под Android требует знаний, а это также необходимость читать литературу, слушать подкасты, смотреть краткие интервью с опытными разработчиками и время от времени проверять новые Android-библиотеки.