Русские Блоги
Gradle использует подробное объяснение (три) Конфигурация плагина Android Gradle подробное объяснение
классификация
Плагин Android Gradle разделен на три категории в зависимости от свойств нашего проекта Android:
Название плагина
описание
Разработка приложений, которая может генерировать работающее приложение apk
Library
Библиотечный проект библиотеки, который может генерировать пакеты AAR
Test
Тестовый тестовый проект, используемый для модульного тестирования проекта приложения или проекта библиотеки
Следует понимать, что в случае проектов, о которых мы упоминали ранее, в случае с подпроектами app и mylibrary, помимо build.gradle корневого проекта, можно увидеть первую строку build.gradle других дочерних проектов. Код для применения плагина Android:
\app\build.gradle
mylibrary\build.gradle
Конфигурационные зависимости
Как упоминалось ранее, вы должны настроить сторонние плагины перед их применением, поскольку плагин Android Gradle размещен на jcenter библиотека Итак, в build.gradle корневого проекта есть этот код:
структура build.gradle
Изучив предыдущие знания, теперь мы сможем легко понять приблизительное значение корневого проекта build.gradle и дочернего проекта build.gradle после создания нового проекта в Android Studio. Давайте сначала перечислим их большую структуру:
Root Projecbuild.gradle
Appbuild.gradle
mylibrarybuild.gradle
android<>
Конфигурация проекта Android Gradle полностью в Android <>, это единственная запись. Через него вы можете настроить конфигурацию проекта Android Gradle. Примеры:
1、compileSdkVersion
2、buildToolVersion
buildToolsVerion указывает версию используемого инструмента сборки Android
3、.defaultConfig<>
applicationId
Он используется для ссылки на имя пакета сгенерированного приложения. По умолчанию оно равно нулю. Если оно равно нулю, оно будет считано из атрибута пакета тега манифеста, настроенного в файле AndroidManifest.xml при сборке.
minSdkVerion
Используется для ссылки на самое низкое поддерживаемое приложение Android Версия системы, соответствующее значение Android SKD из API Level。
targetSdkVersion
Это основная основа для Android для обеспечения прямой совместимости, указывающая, какая версия Android была разработана. Другими словами, до тех пор, пока targetSdkVersion не изменяется, даже если APK установлен на новой системе Android, его поведение остается прежним на старой системе, что обеспечивает прямую совместимость системы со старым приложением.
versionCode
Указывает внутренний номер версии приложения APP, который является целым числом и обычно используется для обновления APP.
verionName
Указывает внутреннее имя приложения APP.
testInstrumentationRunner
Runner используется для настройки модульных тестов. Обычно по умолчанию используется android.test.InstrumentationTestRunner.
testApplicationId
Имя пакета, используемое для настройки тестового приложения. По умолчанию это applicationId + «.test». Как правило, по умолчанию в порядке.
Подождите
4、buildTypes<>
minifyEnabled (обфускация)
proguardFiles/ proguardFile
Когда мы устанавливаем для minifyEnabled значение true, после запуска обфускации мы можем записать запутанную таблицу конфигурации через proguardFiles или proguardFile, как показано в коде в приведенном выше примере:
Keep keep, например, keeppattributes: указывает на зарезервированные атрибуты
Не, например, dontwarn: значит не запрашивать предупреждение
Игнорировать Игнорировать, например игнорировать: игнорировать предупреждение
Более подробные правила вы можете найти соответствующую информацию в Интернете самостоятельно, и мы не будем перечислять их здесь.
applicationldSuffix
debuggable
Используется для настройки, генерировать ли apk для отладки. Обычно релиз ложен, а отладка верна.
jinDebuggable
Подобно debuggable, он используется для настройки необходимости создания apk для отладки кода Jni (C / C ++).
multiDexEnabled
Используется для настройки включения функции автоматического разделения нескольких Dex. Как правило, в программе слишком много кодов, и если оно превышает 65535 методов, разделите несколько Dex и добавьте логическое значение. О прорыве 65535 Метод ограничения, мы введем позже
zipAlignEnabled
Инструмент для настройки, чтобы включить zipalign Android для оптимизации и оптимизации файлов APK. zipalign может повысить эффективность работы системы и приложений, быстрее читать и записывать ресурсы в APK и сокращать использование памяти. При нормальных обстоятельствах эта оптимизация будет запущена в версии, скомпилированной в режиме выпуска.
shrinkResources
signingConfig
Используется для настройки информации о подписи пакета APK, например:
Конкретное использование можно увидеть за signingConfigs<> Введенный 。
Подождите
5, signatureConfigs <> (подпись APK)
storeFile
Укажите файл подписанного сертификата и получите тип файла
storePassword
Настройте пароль для файла сертификата подписи
keyAlias
Настроить псевдоним ключа в подписывающем сертификате
keyPassword
Настройте пароль для этого ключа в сертификате подписи
MinifyEnabled в build.gradle
Можете объяснить за что отвечает параметр minifyEnabled в build.gradle файле? Он делает абфускацию кода или что то другое?
Добавлено через 27 секунд
И как добавить абфускацию в код?
Не коплилируется build.gradle
Привет. Очень нужна помощь. У меня простой проект которий просто подключається к firebase. Но при.

Привет! Перешел с eclipse на android studio. Экспортировал проект все нормально собирается, но нет.
Добавлено через 4 минуты
А когда стоит включать minifyEnabled? Когда количество методов проекта переваливает за определенное значение? Или в каких случаях? Можете объяснить?
Добавлено через 1 минуту
Обфускация делается для того чтобы при декомпиляции сложно было код разобрать или для чего?
Добавлено через 20 минут
А еще такой вопрос. Если я декомпилирую какой нибудь apk и там будет настроена обфускация то что я должен делать чтобы все таки прочитать код? Как можно обойти эту обфускацию?
Если бы была, какой тогда смысл в обфускации?
Добавлено через 5 минут
Это надо научить какие-нибудь нейронные сети и ИИ на то, чтобы просканировав код, они выдали переменным и методам что-нибудь значащие названия, короче это бред полный. Если хочешь заниматься пиратством, придётся уметь разбираться в коде.
Теперь я знаю откуда этот анекдот.
Старый грузин, работавший на мясокомбинате, выходит на пенсию и передает свое место племянику, а заодно и рассказывает о процессе работы:
-Вот смотри Кацо, ты будешь работать на этой машине. С этой стороны запихиваешь барана, а с другой стороны из машины вылазят три палки колбасы. Одна палка тебе, вторая директору мясокомбината, а третья, непосредственно мясокомбинату. Все понял?
-Нэт.
-Вот смотри еще раз. Сюда запихиваешь барана, а оттуда выходят три палки колбасы. Одна тебе, вторая директору, а третья мясокомбинату. Ну, понял?
-Нэт.
-Еще раз для особо не понятливых. Сюда запихиваешь барана, а оттуда вылазят три палки колбасы. Одна тебе, вторая директору, третья мясокомбинату. Понял?
-Нэт.
-Что ты не понял? — старый грузин сердито.
-А есть такая машина, где запихиваешь палку колбасы и получается баран?
-Есть! Твоя мама!
`Gradle build finished with 1 error` в пустом приложении
Приветствую. Использую Android Studio. Раньше работало; теперь после переустановки системы не.

При запуске нового проекта выдает ошибку: Gradle build finished with 41 error(s) Плюс красным.
«MinifyEnabled» против «shrinkResources» – какая разница? И как получить сохраненное пространство?
Задний план
Согласно веб-странице «Ресурс сокращения» в документах Andriod ( здесь ), вы можете минимизировать размер приложения через файл build.gradle, используя следующие строки:
И, они говорят, что при его использовании он также расскажет вам, сколько из них сохраняется в процессе:
Когда вы включаете shrinkResources, для создания вашего приложения должен отображаться следующий вывод во время сборки:
… Удаленные неиспользуемые ресурсы: данные двоичных ресурсов уменьшены с 2570 КБ до 1711 КБ: Удалены 33%
Вопросы
Я не могу найти ответы на эти вопросы:
При использовании Android-Studio для создания подписанного приложения, где я могу найти информацию о том, сколько было сохранено и какие файлы были удалены / изменены?
Они будут в журнале градации. Внутри студии Android я считаю, что они отображаются в окне « Messages (рядом с окнами Android, Run, TODO).
Что именно означает «shrinkResources», что «minifyEnabled» нет? И почему «shrinkResources» зависит от «minifyEnabled»?
minify запускает ProGuard. shrink удаляет ресурсы, которые ProGuard отмечены как неиспользуемые.
Может ли какой-либо из этих параметров влиять на размер и / или качество файлов изображений?
Разве Proguard не отвечает за сокращение исходного кода? Я спрашиваю об этом, потому что он говорит: «вы должны включить minifyEnabled, чтобы включить сокращение кода»,
редактировать:
Я только что нашел очень хороший пост в блоге. CommonsWare отправил его на другой вопрос stackOverlow: http://cyrilmottier.com/2014/08/26/putting-your-apks-on-diet/
Это прекрасно объясняет ваш следующий вопрос:
Почему одно зависит от другого?
Proguard работает на стороне Java. К сожалению, он не работает на стороне ресурсов. Как следствие, если образ my_image в res / drawable не используется, Proguard только удаляет его ссылку в классе R, но сохраняет связанное изображение на месте.
Это означает, что shrinkResources сравнивается только в том случае, если drawable находится в папке, но не в классе R
Ответы на вопросы 2 и 4 можно найти в этом видео с Android Dev Summit 2015 вместе с другой полезной информацией по этой теме.
Обзор рассмотренных вопросов:
shrinkResources учитывается, только если minifyEnabled истинно
minifyEnabled сокращает код, а shrinkResources сокращает ресурсы, на которые не ссылаются код
По умолчанию shrinkResources работает в safe режиме. Если вы переключите его на strict вы можете предоставить tools:keep и tools:discard флаги вручную, чтобы повлиять на сокращение ресурсов.
Играем в APK-гольф. Уменьшение размера файлов Android APK на 99,9%
В гольфе выигрывает тот, у кого меньше очков.
Применим этот принцип в Android. Мы собираемся поиграть в APK-гольф и создать приложение минимально возможного размера, которое можно установить на Android 8.0 Oreo.
Базовый уровень
Затем установим APK на смартфон Nexus 5x под Oreo, чтобы убедиться, что всё работает.
Прекрасно. Наш APK весит примерно полтора мегабайта.
APK Analyser
Полтора мегабайта кажутся слишком большим размером с учётом того, что делает наше приложение (а оно ничего не делает), так что давайте изучим проект и поищем, где по-быстрому сэкономить на объёме. Вот что сгенерировал Android Studio:
Вопреки нашим первоначальным предположениям, похоже, что самый большой файл — Dex, а на ресурсы приходится всего 20% от размера APK.
| Файл | Размер | ||||||
|---|---|---|---|---|---|---|---|
| classes.dex | 74% | ||||||
| res | 20% | ||||||
| resources.arsc | 4% | ||||||
| META-INF | 2% | ||||||
| AndroidManifest.xml | classes.dex — главный виновник раздутого APK, он занимает 73% всего объёма и поэтому станет первой целью оптимизации. Этот файл содержит весь наш скомпилированный код в формате Dex, а также список внешних методов во фреймворке Android и библиотеку поддержки. В пакете android.support перечисляется более 13 000 методов, что кажется излишним для приложения типа «Hello World». РесурсыВ директории res находится большое количество файлов шаблонов, чертежей (drawables) и анимаций, которые сразу не видны в интерфейсе Android Studio. Опять же, они вытянуты из библиотеки поддержки и занимают около 20% размера APK. Файл resources.arsc также содержит список всех этих ресурсов. ПодписьЗдесь нет очевидных целей для оптимизации. AndroidManifestВключаем минификациюМы ещё не пробовали включить опцию минификации и сжатия ресурсов в файле build.gradle для нашего приложения. Сделаем это. shrinkResources удалит из APK любые ресурсы, на которые нет прямой ссылки. Могут возникнуть проблемы, если вы получаете доступ к ресурсам не напрямую, но к нашему приложению это не относится. 786 КБ (уменьшение на 50%)Мы наполовину уменьшили размер APK без видимого изменения в работе программы. Если вы ещё не включили minifyEnabled и shrinkResources в своём приложении, это самая главная вещь, которую следует вынести из этой статьи. Можно легко сэкономить несколько мегабайт, потратив всего парочку часов на конфигурацию и тестирование. Прощай, AppCompat, мы едва тебя узнали108 КБ (уменьшение на 87%)Матерь божья, файл уменьшился почти в десять раз: с 786 КБ до 108 КБ. Единственным заметным изменением стало только изменение цвета тулбара, который окрасился в дефолтную тему ОС. На директорию res теперь приходится 95% размера APK из-за всех этих иконок лаунчера. Если бы эти иконки делал наш дизайнер, мы бы попытались конвертировать их в WebP, более эффективный формат, который поддерживается в API 15 и более поздних версиях. К счастью, Google уже оптимизировала наши drawables, хотя в противном случае мы бы и сами могли оптимизировать их и удалить из PNG ненужные метаданные с помощью ImageOptim. 6808 байт (уменьшение на 94%)Мы избавились почти от всех ресурсов, так что неудивительно, что размер APK уменьшился примерно на 95%. В файле resources.arsc по-прежнему упоминаются следующие ресурсы: Файл шаблона (6262 байта, сокращение на 9%)Выглядит как неплохой обмен. Имя приложения (6034 байта, сокращение на 4%)Давайте удалим strings.xml и заменим android:label в манифесте AndroidManifest буквой «A». Это кажется маленьким изменением, но удаление записи из resources.arsc уменьшает количество символов в манифесте и удаляет файл из директории res. Каждая мелочь идёт на пользу — мы только что сэкономили 228 байт. Иконка лаунчера (5300 байт, сокращение на 13%)Документация для resources.arsc в репозитории Android Platform объясняет, что каждый ресурс APK упоминается в resources.arsc с целочисленным идентификатором. У этих ID два пространства имён:
Так что произойдёт с нашим APK, если мы поставил ссылку на ресурс в пространстве имён 0x01? По идее, мы получим более красивую иконку и одновременно уменьшим размер своего файла. Само собой, вам никогда не следует доверять системным ресурсам вроде иконок в реальном рабочем приложении. Такой метод провалит валидацию в Google Play, а некоторые производители ещё и по-своему определяют белый цвет, так что действуйте осторожно. Манифест (5252 байта, сокращение на 1%)Мы ещё не трогали манифест. Удаление этих аттрибутов экономит 48 байт. Хак Proguard (4984 байта, сокращение на 5%)Похоже, что классы BuildConfig и R ещё остались в файле Dex. Уточнение правила Proguard удалит ненужные классы. Обфускация (4936 байт, сокращение на 1%)Обфусцируем имя для класса Activity. Для обычных классов Proguard автоматически делает это, но поскольку имя класса Activity вызывается через Intents, его не обфусцировали по умолчанию. META-INF (3307 байт, сокращение на 33%)В данный момент мы подписываем приложение одновременно подписями v1 и v2. Это кажется лишней тратой ресурсов, потому что v2 обеспечивает превосходную защиту и производительность, хешируя весь APK целиком. Давайте уберём галочку для подписи v1 в интерфейсе Android Studio и сгенерируем подписанный APK. Попробуем сделать и наоборот.
Похоже, теперь мы будем использовать v2. Куда мы идём — там не нужны IDEПришло время редактировать APK вручную. Используем следующие команды: Детальный обзор процесса подписи APK см. здесь. В общем, Gradle генерирует неподписанный архив, zipalign делает выравнивание по границе байта для несжатых ресурсов, чтобы оптимизировать потребление RAM после загрузки APK, и в конце запускается криптографическая процедура подписи APK. Неподписанный и невыровненный APK весит 1902 байт, то есть процедура добавляет примерно 1 килобайт. Несоответствие размеров файлов (2608 байт, сжатие на 21%)Хаки со сжатием (2599 байт, сокращение на 0,5%)Теперь изменим все оставшиеся строки на ‘c’, обновив версии до 26, а затем сгенерируем подписанный APK. Это уменьшает размер ещё на 9 байт. Хотя количество символов в файле не изменилось, но дело в том, что увеличилась частотность символа ‘c’. В результате алгоритм сжатия сработал более эффективно. Привет, ADB (2462 байт, сокращение на 5%)Можно ещё сильнее оптимизировать манифест, удалив фильтр намерения Launch для класса Activity. С этого момента будем запускать приложение следующей командой: Вот новый манифест: Мы также избавились от иконки лаунчера. Очистка от ссылок на методы (2179 байт, сокращение на 12%)По изначальным условиям, мы должны подготовить APK, который способен установиться на устройство. Исходные файлы теперь выглядят следующим образом: Используем adb для проверки, что APK успешно установился, это можно также проверить через «Настройки». Оптимизация Dex (1961 байт, сокращение на 10%)Я потратил несколько часов, изучая формат файла Dex ради этой оптимизации, поскольку разные механизмы вроде контрольных сумм и смещений затрудняют ручное редактирование. Иногда глупейшее решение — самое лучшее. Понимание манифеста (1961 байт, сокращение на 0%)Манифест неподписанного APK — это файл в бинарном формате XML, который вроде бы официально не документирован. Можно изменить содержимое файла с помощью редактора HexFiend. Непонимание манифеста (1777 байт, сокращение на 9%)А попробуем набросать случайных символов по всему файлу, а затем установить APK, не изменяя указанный размер файла. Так мы проверим, осуществляется ли проверка контрольной суммы, и как наши изменения повлияют на смещения в заголовке файла. Удивительно, но такой манифест воспринят как валидный APK на Nexus 5X под Oreo: Для максимальной выгоды нужно заменить все эти глупые символы нулевыми байтами. Это поможет распознать важные части файла в HexFiend, а также сократит несколько байт благодаря хаку сжатия, упомянутому выше. Манифест UTF-8Вот важные компоненты Manifest, без которых APK не установится. Некоторые вещи очевидны, такие как теги манифеста и пакета. В пуле строк видны versionCode и название пакета. Шестнадцатиричный манифестНо вряд ли здесь можно найти другие варианты для оптимизации. Готово? (1757 байт, сокращение 1%)Изучим окончательный APK. В течение всего этого имени в APK было указано моё имя в подписи v2. Создадим новое хранилище ключей, в котором используется хак для сжатия. Мы сэкономили 20 байт. Шаг 5: Признание1757 байт — это очень мало, чёрт возьми. И насколько я знаю, это самый маленький существующий APK. Однако я разумно полагаю, что кто-нибудь из Android-сообщества способен выполнить дальнейшие оптимизации и ещё улучшить результат. Если вы умудритесь уменьшить файл с нынешних 1757 байт, присылайте пулл-реквест в репозиторий, где хостится самый маленький APK, или сообщайте в твиттере. (С момента публикации статьи файл уже уменьшили до 820 байт — прим. пер.) Передовой опыт Android-разработкиНам бы хотелось поделиться с вами опытом, который мы, в Futurice, получили, разрабатывая Android-приложения. Надеемся, эти советы уберегут вас от создания собственных велосипедов. Если вы интересуетесь iOS или Windows Phone разработкой, обратите внимание на соответствующие документы на нашем сайте. Коротко о главномAndroid SDKПоместите ваш Android SDK в домашнюю директорию или другое место, не связанное с приложением. Некоторые IDE ставятся вместе с SDK, и могут устанавливать его в свою директорию. Это может помешать при обновлении (или переустановке) IDE, или когда вы перейдёте на другую IDE. Избегайте установки SDK в другую системную директорию, поскольку это может потребовать административных привилегий, если ваша IDE запускается с правами пользователя, а не администратора. Система сборкиВыбором по умолчанию должен быть Gradle. Ant гораздо скромнее по возможностям, и к тому же его инструкции менее компактны. С помощью Gradle вы легко сможете: Структура проектаЕсть два распространённых варианта: старая Ant & Eclipse ADT структура проекта — либо новая Gradle & Android Studio. Лучше выбрать второй вариант. Если ваш проект использует старую структуру, рекомендуем её портировать. Конфигурация GradleМаленькие задачи сборки. В отличие от других скриптовых языков (shell, Python, Perl, и т.д.), вы можете создавать задачи сборки в Gradle. Подробности смотрите в документации Gradle. Пароли. В файле вашего приложения build.gradle вам нужно определить параметры подписи ( signingConfigs ) для релизной сборки. Следует избегать такой ошибки: Не делайте так. Эта информация появится в системе контроля версий. Эти данные автоматически импортируются в gradle, и вы сможете использовать их в build.gradle следующим образом: Старайтесь использовать зависимости Maven, а не импортировать jar-файлы. Если вы включаете внешние jar-файлы в ваш проект, они будут законсервированы в той версии, при которой происходил импорт, например 2.1.1. Ручная загрузка jar-файлов и их обновление — достаточно трудоёмкая операция, и Maven может отлично решить эту проблему за нас, включив результат в сборку. Например: Среда разработки (IDE) и текстовый редакторИспользуйте любой редактор, который вам нравится, но он должен быть хорошо совместим со структурой проекта. Редактор — это ваш личный выбор, и вы должны выбрать такой, с которым будет удобно работать в рамках вашей структуры проекта и системы сборки. Самая популярная IDE на данный момент — Android Studio, поскольку она разрабатывается Google, интегрирована с Gradle, использует новую структуру проекта по умолчанию, находится в состоянии стабильной сборки и заточена под Android-разработку. Вы можете использовать Eclipse ADT, если он вам нравится, но его придётся настраивать, поскольку он по умолчанию работает со старой структурой проекта и системой сборки Ant. Вы можете даже использовать текстовые редакторы Vim, Sublime Text, или Emacs. В этом случае вам придётся использовать Gradle и adb из командной строки. Если вам не удастся подружить Eclipse с Gradle, вам тоже придётся использовать для сборки командную строку. Учитывая то, что ADT plugin недавно был объявлен устаревшим, лучше просто перейти на Android Studio. БиблиотекиJackson — библиотека Java для конвертации объектов в JSON и наоборот. Gson — самый распространённый способ решения этой задачи, но по нашим наблюдениям Jackson более производителен, поскольку он поддерживает альтернативные способы обработки JSON: потоковый, модель дерева в оперативной памяти, и традиционную связь форматов JSON-POJO. Имейте в виду, однако, что Jackson по размеру больше чем GSON, так что возможно, вы предпочтёте GSON для того чтобы избежать ограничения в 65k методов. Другие варианты: Json-smart и Boon JSON. Работа с сетью, кэширование и картинки. Есть пара проверенных опытом решений для производительных запросов к backend-серверам, которые вам стоит рассмотреть перед разработкой вашего собственного клиента. Используйте Volley или Retrofit. Volley к тому же предоставляет средства загрузки и кэширования изображений. Если вы выберете Retrofit, возьмите Picasso для загрузки или кэширования изображений, и OkHttp для эффективных HTTP-запросов. Все эти библиотеки — Retrofit, Picasso и OkHttp разработаны одной компанией, так что они отлично дополняют друг друга. OkHttp также может быть использован с Volley. RxJava — библиотека для Reactive Programming, другими словами, для обработки асинхронных событий. Это мощная и многообещающая концепция, которая может смутить своей необычностью. Мы рекомендуем хорошо подумать, перед тем как использовать эту библиотеку как фундамент архитектуры всего приложения. Есть проекты, созданные с использованием RxJava, и вы можете обратиться за помощью к однуму из этих людей: Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti Lammi, Vera Izrailit, Juha Ristolainen. Мы писали несколько статей в наш блог по этому поводу: [1], [2], [3], [4]. Если вы раньше не работали с Rx, начните с использования API. Или вы можете начать с его применения для обработки простых событий пользовательского интерфейса, таких как нажатие или печать в поле поиска. Если вы уверены в ваших навыках использования Rx и хотите использовать его во всей архитектуре, напишите Javadocs касательно самых сложных моментов. Имейте в виду, что программист, не имеющий опыта использования RxJava, и в файле build.gradle каждого модуля добавьте Android Studio начнёт поддерживать синтаксис лямбда-выражений. Если вы раньше их не использовали, можете начать с осознания утверждений: Activity и фрагментыВ сообществе Android-разработчиков (как и в Futurice) нет единого мнения по вопросу, как лучше всего построить архитектуру Android-приложения в плане использования фрагментов и activity. Square даже выпустила библиотеку для построения архитектуры в основном с помощью view, минимизировав таким образом необходимость фрагментов, но этот способ до сих пор не стал общепринятым. Исходя из истории развития Android API, вы можете рассматривать фрагменты, как часть пользовательского интерфейса экрана. Другими словами, фрагменты обычно относятся к UI. Activity обычно рассматриваются как контроллеры, они особенно важны с точки зрения их жизненного цикла и для управлением состояниями. Однако, может быть и по-другому: activity могут исполнять функции, связанные с UI (переход состояний между экранами), а фрагменты могут быть использованы только как контроллеры. Мы бы советовали принимать взвешенное решение, имея в виду, что архитектура, базирующаяся на использовании только фрагментов, или только activity, или только view, может иметь ряд недостатков. Вот пара советов, на что стоит обратить внимание, но отнеситесь к ним критично: Архитектура пакетов JavaАрхитектура Java для Android-приложений напоминает шаблон Model-View-Controller. В Android, фрагменты и activity представляют классы Conroller’а. С другой стороны, они являются частью пользовательского интерфейса, так что они также являются частью View. Все вышеперечисленные пакеты, в порядке от backend до пользовательского интерфейса: РесурсыСтруктура XML разметки. Если вы не уверены, как форматировать XML разметки, следующие советы могут помочь. Как показывает опыт, атрибут android:layout_**** должен быть определён в XML разметки, а остальные атрибуты android:**** должны быть определены в XML стилей. У этого правила есть исключения, но в целом оно работает хорошо. Смысл в том, чтобы хранить только атрибуты разметки (позиция, поля, размер) и атрибуты контента в файле разметки, а детали отображения визуальных компонентов (цвета, отступы, шрифты) должны быть в файлах стилей. Применимо к TextView: colors.xml это цветовая палитра. Не помещайте в colors.xml ничего, кроме связи названия цвета с его RGBA значением. Не используйте его для определения значений RGBA для разных типов кнопок. Цветовую палитру определяет дизайнер приложения. Цвета не обязательно называть «green», «blue», и т.д. Названия вроде «brand_primary», «brand_secondary», «brand_negative» тоже вполне приемлемы. Такое форматирование цветов делает простым их изменение или рефакторинг, а также позволяет легко понять, сколько цветов используется. Для создания красивого пользовательского интерфейса, важно по возможности уменьшить количество используемых цветов. Оформите dimens.xml как colors.xml. По той же причине, стоит так же определить «палитру» типичных размеров объектов и шрифтов. Рекомендуем не писать числовые значения в повторяющихся атрибутах разметки (полях и отступах), а использовать константы вида spacing_**** (примерно так, как вы обычно делаете для локализиции строковых значений). Используйте в именовании строк ключи, как в именовании пакетов — это позволит вам решить проблему с одинаковыми именами констант и лучше понимать контекст их использования. Не пишите строковые значения строчными буквами. Вы можете использовать обычные преобразования текста (в том числе, преобразование первой буквы в прописную). Если потребуется написать всю строку строчными буквами — используйте атрибут textAllCaps объекта TextView. Избегайте глубокой иерархии view. Иногда у вас будет соблазн добавить ещё один LinearLayout, для решения вашей задачи описания view. Даже если вы не видите явно выросшую вложенность в файле разметки, она может возникнуть когда вы включаете (в Java) view в другие views. Тут может возникнуть пара проблем. Вы можете получать проблемы с производительностью, поскольку процессор вынужден обрабатывать сложное описание дерева компонентов пользовательского интерфейса. Другая, более серьёзная проблема — это возможность возникновения ошибки StackOverflowError. Будьте внимательны при использовании WebView. Когда вам нужно показать web-страницу, например новостную статью, избегайте исполнения кода на клиентской стороне для формирования HTML, лучше попросите backend-программистов предоставить «чистый» HTML. WebView также могут вызывать утечку памяти при сохранении ссылки на Activity, к которой привязаны вместа ApplicationContext. Избегайте использования WebView для создания простого текста или кнопки, лучше используйте объекты TextView или Button. Фреймворки для тестированияИспользуйте Robolectric только для unit-тестов, не для UI. Этот фреймворк предоставляет возможность для запуска тестов без устройства, для увеличения скорости их выполнения, и идеально подходит для unit-тестов моделей данных и view. Однако, пользовательский интерфейс Robolectric тестирует не полностью и неточно. У вас будут проблемы при тестировании элементов пользовательского интерфейса, относящихся к анимациям, диалогам, и т.д., и процесс тестирования будет проходить «с закрытыми глазами» (не видя экрана). Robotium делает тестирование пользовательского интерфейса простым. Вы можете запускать UI-тесты без Robotium, но он очень полезен за счёт утилит для анализа view и контроля экрана. Сценарии тестирования будут выглядеть совсем просто: ЭмуляторыЕсли вы занимаетесь Android-разработкой профессионально, купите лицензию на эмулятор Genymotion. Он работает быстрее, чем обычный AVD-эмулятор. Эмулятор Genymotion позволяет записать ролик, демонстрирующий работу вашего приложения, эмулирует различное качество сетевого соединения, сигналы GPS и многое другое. Он идеален для запуска тестов. У вас появится доступ к многим (хотя не ко всем) образам устройств с ОС Android, так что стоимость лицензии Genymotion гораздо дешевле, чем покупка множества устройств. Подводные камни: Genymotion не позволяет использовать в приложении такие сервисы Google, как Google Play Store или Maps. И если вам понадобится протестировать функции API Samsung, вам придётся купить реальное устройство. Конфигурация ProguardProGuard обычно используется в проектах Android для сжатия и обфускации кода. Условия использования ProGuard зависят от настроек вашего проекта. Обычно вы настраиваете gradle использовать ProGuard для сборки релизной версии. Для того, чтобы защитить нужные классы и методу от удаления ProGuard’ом, добавьте в его конфигурацию опцию keep : Для защиты от переименования используйте опцию keepnames : Другие возможные модификации конфигурации ProGuard вы можете посмотреть в этом примере. Больше примеров конфигурации Proguard здесь. В начале вашего проекта, создайте релизную сборку, чтобы проверить, что правила для ProGuard описаны корректно. При подключении новых библиотек, создайте релизную сборку и проверьте исполняемый файл на устройстве. Не ждите версии «1.0» для создания релизной сборки, иначе вы можете получить несколько неприятных сюрпризов в условиях нехватки времени на их исправление. Совет. Сохраняйте файл mapping.txt для каждого релиза. Имея копию файла mapping.txt для каждой сборки, вы можете быть уверены что сможете найти проблему, кода пользователь поймает баг и пришлёт вам обфускированный лог ошибок. DexGuard. Если вы хотите круто оптимизировать ваш код, и обфускировать его особым образом, попробуйте использовать DexGuard, коммерческий аналог ProGuard. Он может легко разделить Dex-файл на несколько для обхода ограничения в 65k методов. БлагодарностиAntti Lammi, Joni Karppinen, Peter Tackage, Timo Tuominen, Vera Izrailit, Vihtori Mäntylä, Mark Voit, Andre Medeiros, Paul Houghton и другим разработчикам Futurice за то, что они поделились своими знаниями в области Android. |









