avatar it-technology

it-technology



подробнее...

Следить за персональным блогом

Автоматизированная система Промышленная безопасность и охрана труда

Обновления главной ленты блогов
Вконтакте Facebook Twitter RSS Почта Livejournal
Внимание

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

14 ноября 2017, 03:04

Программирование под Android: 50 лучших инструментов


Знание Java и IDE – далеко не все, чтобы сделать программирование под Android комфортным. Рассмотрим полезные дополнения и рекомендации.

Предыдущая статья Разработка под Андроид: советы, инструменты и трюки.

Лучшее для кодинга

Используйте альтернативный HTTP-клиент OkHttp.

HttpUrlConnect страдает от некоторых багов. Okhttp решает эти проблемы. Анонс.

На локальные файлы aar можно ссылаться, как показано ниже:

Java dependencies { compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar') } repositories{ flatDir{ dirs 'libs' } }

12345678dependencies { compile ( name : 'nameOfYourAARFileWithoutExtension' , ext : 'aar' ) } repositories { flatDir { dirs 'libs' } }

Подробнее.

Для удобной работы с логами можно использовать Pidcat

Делайте коммиты с помощью систем контроля версий (VCS) вроде Git

Программа ClassyShark

Это возможность проверить Android APK и получить необходимую информацию о методах, полях, зависимостях etc. Анализирует файлы aar, class, jar, so, apk.

Программирование под Android

Библиотека Stetho

Использование библиотеки позволяет дебажить программы с помощью Chrome Dev Tools. Включает такие инструменты, как Network Monitor, SharedPreference и т. д.

Приложение Battery Historian

Анализирует состояние батареи.

Используйте константы при работе с зависимостями (например, «1.2.0»)

Избегайте знака + при указании версий зависимостей.

  • Так можно избежать ошибок, несмотря на изменение API.
  • Устраняется необходимость всякий раз во время сборки осуществлять онлайн-проверку последних версий для каждой зависимости.

Отложите TimerTask и используйте Handler

Для публикации приложений (например, на GitHub) не стоит использовать основную электронную почту

Векторы вместо PNG

Если же это PNG, постарайтесь сжать файлы, используя TinyPNG.

Качественное программирование под Android подразумевает использование proguard

Java android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }

123456789android { . . . buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile ( 'proguard-android.txt' ) , 'proguard-rules.pro' } } }

Используйте shrinkResources

Java android { ... buildTypes { release { shrinkResources true minifyEnabled true ... } } }

12345678910android { . . . buildTypes { release { shrinkResources true minifyEnabled true . . . } } }

Следуйте приведенному ниже правилу для ускорения сборки gradle:

Gradle memory >= Dex memory + 1Gb

1Gradle memory >= Dex memory + 1Gb

Разделите свой apk, используя gradle и нативный код

Не объединяйте все вместе, потому что потом придется долго разбираться в исходниках.

Java 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 } }

12345678910111213141516171819202122232425262728293031defaultConfig { . . . 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

1. / gradlew -- refresh - dependencies

Исключение выполнения определенной задачи из gradle

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

./gradlew clean build -x javaDoc

1. / gradlew clean build - x javaDoc

Чтобы каждое имя подпроекта совпадало с именем проекта

Добавьте эту строку в settings.gradle:

Java rootProject.children.each{ it.buildFileName = it.name + '.gradle' }

123rootProject . children . each { it . buildFileName = it . name + '.gradle' }

Больше трюков с gradle вы найдете здесь.

Следуйте принципу Do not Repeat Yourself (DRY)

Пакеты по функциям, а не по слоям

Изучите механизм Dependency Resolution

Со скоростью обновления Android-зависимостей рано или поздно вы столкнетесь с конфликтом зависимостей в приложении. Для этого используется Dependency Resolution. Официальный ресурс.

Используйте разные имена пакетов в случае дебаг-сборок:

Java android { buildTypes { debug { applicationIdSuffix '.debug' versionNameSuffix '-DEBUG' }

release { // ... } } }

123456789101112android { 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

1. / gradlew wrapper -- gradle - version 3.4.1 -- distribution - type all
  • Установите необходимые свойства в глобальном файле gradle.properties:

android.enableBuildCache=true

1android . enableBuildCache = true

Остановите сборку посредством gradle:

./gradlew -stop

1. / gradlew - stop

Настройте gradle для загрузки отсутствующих элементов android sdk в автоматическом режиме

  • Установите необходимые свойства в глобальном файле gradle.properties:

android.builder.sdkDownload=true

1android . 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 следующий код:

Java android { ... lintOptions { abortOnError true fatal 'StopShip' } }

1234567android { . . . 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

1alfi name_of_library
  • Копирование нужной библиотеки.
  • Вставка в build.gradle.

Вывод результатов юнит-тестов в консоль

Java android { ... testOptions.unitTests.all { testLogging { events 'passed', 'skipped', 'failed', 'standardOut', 'standardError' outputs.upToDateWhen { false } showStandardStreams = true } } }

12345678910android { . . . testOptions . unitTests . all { testLogging { events 'passed' , 'skipped' , 'failed' , 'standardOut' , 'standardError' outputs . upToDateWhen { false } showStandardStreams = true } } }

Сделайте сборку быстрее, используя офлайн режим

Программирование под Android нуждается в:

  • Быстрой сборке:

./gradlew assembleDevelopDebug --offline

1. / gradlew assembleDevelopDebug -- offline
  • Быстрых юнит-тестах:

./gradlew test --offline

1. / gradlew test -- offline

Использовать абсрактный класс Logger

Если нужно инициализировать свою библиотеку автоматически, обратите внимание на Content Provider

Уменьшите размера установленного приложения с помощью android:extractNativeLibs:false в

Подробнее.

Селективная сборка для конкретного метода в Android Studio

Android Studio

Используйте возможности Java 8, добавив sourceCompatibility & targetCompatibility в файл build.gradle:

Java android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

1234567android { . . . compileOptions { sourceCompatibility JavaVersion . VERSION_1_8 targetCompatibility JavaVersion . VERSION_1 _ 8 } }

Задайте gradle-задачу для архивирования файлов apk и proguard при сборке с целью резервного копирования:

Java 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") }

1234567891011121314151617181920task 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 затененный край внизу
  • мягкая тень вокруг всех краев поднятых элементов
  • мягкий оттенок для

Источник: https://proglib.io/p/android-tools/