Создайте библиотеку Android

Библиотека Android структурно такая же, как и модуль приложения Android. Она включает в себя все необходимое для создания приложения, включая исходный код, файлы ресурсов и манифест Android.

Однако вместо компиляции в APK, который запускается на устройстве, библиотека Android компилируется в файл Android Archive (AAR), который можно использовать в качестве зависимости для модуля приложения Android. В отличие от файлов JAR, файлы AAR предлагают следующую функциональность для приложений Android:

  • Файлы AAR могут содержать ресурсы Android и файл манифеста, который позволяет объединять общие ресурсы, такие как макеты и чертежи, в дополнение к классам и методам Kotlin или Java.
  • Файлы AAR могут содержать библиотеки C/C++ для использования кодом C/C++ модуля приложения.

Библиотечный модуль полезен в следующих ситуациях:

  • При создании нескольких приложений, использующих некоторые из одних и тех же компонентов, таких как действия, службы или макеты пользовательского интерфейса.
  • При создании приложения, которое существует в нескольких вариантах APK, например, в бесплатной и платной версии, которые используют общие основные компоненты

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

На этой странице объясняется, как создать и использовать модуль библиотеки Android. Для получения руководства о том, как опубликовать библиотеку, см. Опубликуйте свою библиотеку

Создать библиотечный модуль

Чтобы создать новый библиотечный модуль в вашем проекте, выполните следующие действия:

  1. Нажмите Файл > Создать > Новый модуль .
  2. В появившемся диалоговом окне «Создать новый модуль» нажмите «Библиотека Android» , затем нажмите «Далее» .

    Также есть возможность создать библиотеку Kotlin или Java, которая создает традиционный файл JAR. Хотя файл JAR полезен для многих проектов, особенно когда вы хотите поделиться кодом с другими платформами, он не позволяет включать ресурсы Android или файлы манифеста, что очень полезно для повторного использования кода в проектах Android. Это руководство посвящено созданию библиотек Android.

  3. Дайте своей библиотеке имя и выберите минимальную версию SDK для кода в библиотеке, затем нажмите « Готово» .

После завершения синхронизации проекта Gradle модуль библиотеки появится на панели Project . Если вы не видите новую папку модуля, убедитесь, что на панели отображается вид Android .

Преобразовать модуль приложения в модуль библиотеки

Если у вас есть существующий модуль приложения с кодом, который вы хотите использовать повторно, вы можете превратить его в модуль библиотеки следующим образом:

  1. Откройте файл build.gradle на уровне модуля, если вы используете Groovy, или файл build.gradle.kts , если вы используете скрипт Kotlin.
  2. Удалите строку для applicationId . Только модуль приложения Android может это определить.
  3. Найдите блок `plugins` в верхней части файла, который выглядит следующим образом:

    Круто

      plugins {
          id 'com.android.application'
      }
      

    Котлин

      plugins {
          id("com.android.application")
      }
      

    Измените его на следующий:

    Круто

      plugins {
          id 'com.android.library'
      }
      

    Котлин

      plugins {
          id("com.android.library")
      }
      
  4. Сохраните файл и нажмите Файл > Синхронизировать проект с файлами Gradle .

Структура модуля осталась прежней, но теперь он работает как библиотека Android. Сборка создает файл AAR вместо APK.

Если вы хотите собрать файл AAR, выберите модуль библиотеки в окне проекта и нажмите «Сборка» > «Сборка APK» .

Добавьте зависимости с помощью диалогового окна «Структура проекта»

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

Используйте свою библиотеку из того же проекта

Чтобы использовать код новой библиотеки Android в другом приложении или модуле библиотеки в том же проекте, добавьте зависимость на уровне проекта:

  1. Перейдите в Файл > Структура проекта > Зависимости .
  2. Выберите модуль, который вы хотите добавить в библиотеку.
  3. На вкладке «Объявленные зависимости» нажмите и выберите в меню пункт «Зависимость модуля» .

  4. В диалоговом окне «Добавить зависимость модуля» выберите модуль библиотеки.

    Добавить зависимость модуля в диалоговом окне «Структура проекта»

  5. Выберите конфигурацию, требующую этой зависимости, или выберите реализацию, если она применяется ко всем конфигурациям, затем нажмите кнопку ОК .

Android Studio редактирует файл build.gradle или build.gradle.kts вашего модуля, чтобы добавить зависимость, в следующей форме:

Круто

  implementation project(path: ":example-library")

Котлин

  implementation(project(":example-library"))

Используйте свою библиотеку в других проектах

Рекомендуемый способ совместного использования зависимостей (JAR и AAR) — с помощью репозитория Maven, размещенного на сервисе, например Maven Central , или с помощью структуры каталогов на локальном диске. Для получения дополнительной информации об использовании репозиториев Maven см. Удаленные репозитории .

Когда библиотека Android публикуется в репозитории Maven, метаданные включаются, чтобы зависимости библиотеки были включены в потребляющую сборку. Это позволяет автоматически дедуплицировать библиотеку, если она используется в нескольких местах.

Чтобы использовать код вашей библиотеки Android в другом модуле приложения в другом проекте, выполните следующие действия:

  1. Перейдите в Файл > Структура проекта > Зависимости .
  2. На вкладке «Объявленные зависимости» нажмите и выберите в меню пункт «Зависимость библиотеки» .

  3. В диалоговом окне Add Library Dependency используйте поле поиска, чтобы найти библиотеку для добавления. Эта форма ищет репозитории, указанные в блоке dependencyResolutionManagement { repositories {...}} в файле settings.gradle или settings.gradle.kts .

    Добавить зависимость библиотеки в диалоговом окне «Структура проекта»

  4. Выберите конфигурацию, требующую этой зависимости, или выберите реализацию, если она применяется ко всем конфигурациям, затем нажмите кнопку ОК .

Проверьте файл build.gradle или build.gradle.kts вашего приложения, чтобы убедиться, что в нем отображается объявление, похожее на следующее (в зависимости от выбранной конфигурации сборки):

Круто

  implementation 'com.example:examplelibrary:1.0.0'

Котлин

  implementation("com.example:examplelibrary:1.0.0")

Добавьте ваш AAR или JAR как зависимость

Чтобы использовать код вашей библиотеки Android в другом модуле приложения, выполните следующие действия:

  1. Перейдите в Файл > Структура проекта > Зависимости .
  2. На вкладке «Объявленные зависимости» нажмите и выберите в меню пункт Jar Dependency .

  3. В диалоговом окне Add Jar/Aar Dependency введите путь к файлу AAR или JAR, затем выберите конфигурацию, к которой применяется зависимость. Если библиотека должна быть доступна для всех конфигураций, выберите конфигурацию реализации .

    Добавить зависимость AAR в диалоговом окне «Структура проекта»

    Проверьте файл build.gradle или build.gradle.kts вашего приложения, чтобы убедиться, что в нем отображается объявление, похожее на следующее (в зависимости от выбранной конфигурации сборки):

    Круто

      implementation files('my_path/my_lib.aar')

    Котлин

      implementation(files("my_path/my_lib.aar"))

Чтобы импортировать зависимость от сборки Gradle, запущенной вне Android Studio, добавьте путь к зависимости в файле build.gradle или build.gradle.kts вашего приложения. Например:

Круто

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}

Котлин

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
}

Дополнительную информацию о добавлении зависимостей Gradle см. в разделе Добавление зависимостей сборки .

Объявить публичный ресурс

Ресурсы включают все файлы в каталоге res/ вашего проекта, например, изображения. Все ресурсы в библиотеке по умолчанию являются публичными. Чтобы сделать все ресурсы неявно приватными, необходимо определить как минимум один конкретный атрибут как публичный.

Чтобы объявить публичный ресурс, добавьте объявление в файл public.xml вашей библиотеки. Если вы еще не добавляли публичные ресурсы, вам нужно создать файл public.xml в каталоге res/values/ вашей библиотеки.

Следующий пример кода создает два общедоступных строковых ресурса с именами mylib_app_name и mylib_public_string :


     name="mylib_app_name" type="string"/>
     name="mylib_public_string" type="string"/>

Чтобы запретить пользователям вашей библиотеки получать доступ к ресурсам, предназначенным только для внутреннего использования, используйте этот автоматический механизм назначения частных ресурсов, объявив один или несколько общедоступных ресурсов. В качестве альтернативы вы можете сделать все ресурсы частными, добавив пустой тег . Это не помечает ничего как общедоступное и делает все ресурсы частными.

Любые ресурсы, которые вы хотите оставить видимыми для разработчиков, использующих вашу библиотеку, должны быть общедоступными.

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

При создании библиотеки плагин Android Gradle получает определения общедоступных ресурсов и извлекает их в файл public.txt , который затем упаковывается в файл AAR.

Вопросы разработки библиотечных модулей

При разработке библиотечных модулей и зависимых приложений учитывайте следующие особенности поведения и ограничения.

  • Библиотеки объединяются в порядке приоритета.

    После добавления ссылок на модули библиотеки в модуль приложения Android вы можете задать их относительный приоритет. Во время сборки библиотеки объединяются с приложением по одной, начиная с самого низкого приоритета и заканчивая самым высоким.

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

  • Избегайте конфликтов при слиянии ресурсов.

    Инструменты сборки объединяют ресурсы из модуля библиотеки с ресурсами зависимого модуля приложения. Если заданное имя ресурса определено в обоих модулях, используется ресурс из приложения.

    Если возникают конфликты между несколькими библиотеками AAR, то используется ресурс из библиотеки, указанной первой в списке зависимостей (ближайшей к началу блока dependencies ).

    Чтобы избежать конфликтов ресурсов, рассмотрите возможность использования префикса или другой последовательной схемы именования, уникальной для модуля (или уникальной для всех модулей проекта).

  • В многомодульных сборках зависимости JAR рассматриваются как транзитивные зависимости.

    При добавлении зависимости JAR к проекту библиотеки, который выводит AAR, JAR обрабатывается модулем библиотеки и упаковывается вместе с его AAR.

    Однако если ваш проект включает в себя модуль библиотеки, который потребляется модулем приложения, модуль приложения рассматривает локальную зависимость JAR библиотеки как транзитивную зависимость. В этом случае локальный JAR обрабатывается модулем приложения, который его потребляет, а не модулем библиотеки. Это ускоряет инкрементальные сборки, вызванные изменениями в коде библиотеки.

    Любые конфликты ресурсов Java, вызванные локальными зависимостями JAR, должны быть разрешены в модуле приложения, который использует библиотеку.

  • Модуль библиотеки может зависеть от внешней библиотеки JAR.

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

    Обратите внимание, что и модуль библиотеки, и зависимое приложение должны объявить внешнюю библиотеку в своих файлах манифеста в элементе .

  • minSdkVersion модуля приложения должно быть равно или больше версии, определенной библиотекой.

    Библиотека компилируется как часть зависимого модуля приложения, поэтому API, используемые в модуле библиотеки, должны быть совместимы с версией платформы, которую поддерживает модуль приложения.

  • Каждый модуль библиотеки создает свой собственный класс R

    При сборке зависимых модулей приложения модули библиотеки компилируются в файл AAR, а затем добавляются в модуль приложения. Таким образом, каждая библиотека имеет свой собственный класс R , названный в соответствии с именем пакета библиотеки.

    Класс R , сгенерированный из основного модуля и модуля библиотеки, создается во всех необходимых пакетах, включая пакет основного модуля и пакеты библиотек.

  • Модуль библиотеки может включать собственный файл конфигурации ProGuard.

    Если у вас есть проект библиотеки, который вы используете для сборки и публикации AAR, вы можете добавить файл конфигурации ProGuard в конфигурацию сборки вашей библиотеки. Если вы это сделаете, плагин Android Gradle применит указанные вами правила ProGuard. Инструменты сборки встраивают этот файл в сгенерированный файл AAR для модуля библиотеки. Когда вы добавляете библиотеку в модуль приложения, файл ProGuard библиотеки добавляется к файлу конфигурации ProGuard ( proguard.txt ) модуля приложения.

    Встраивая файл ProGuard в модуль библиотеки, вы помогаете гарантировать, что модули приложений, зависящие от вашей библиотеки, не должны вручную обновлять свои файлы ProGuard для использования вашей библиотеки. Когда система сборки Android Studio собирает ваше приложение, она использует директивы как из модуля приложения, так и из библиотеки. Поэтому нет необходимости запускать code shrinker для библиотеки на отдельном этапе.

    Чтобы добавить правила ProGuard в проект библиотеки, укажите имя файла с помощью свойства consumerProguardFiles внутри блока defaultConfig файла build.gradle или build.gradle.kts вашей библиотеки.

    Например, следующий фрагмент устанавливает lib-proguard-rules.txt в качестве файла конфигурации библиотеки ProGuard:

    Круто

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }

    Котлин

    android {
        defaultConfig {
            consumerProguardFiles("lib-proguard-rules.txt")
        }
        ...
    }

    Однако, если ваш модуль библиотеки является частью многомодульной сборки, которая компилируется в APK и не генерирует AAR, запустите сокращение кода только для модуля приложения, который использует библиотеку. Чтобы узнать больше о правилах ProGuard и их использовании, прочитайте статью Сжимайте, обфускируйте и оптимизируйте свое приложение .

  • Тестирование библиотечного модуля почти такое же, как тестирование приложения.

    Главное отличие в том, что библиотека и ее зависимости автоматически включаются в качестве зависимостей тестового APK. Это означает, что тестовый APK включает не только свой собственный код, но и AAR библиотеки и все ее зависимости. Поскольку отдельного тестируемого приложения нет, задача androidTest устанавливает (и удаляет) только тестовый APK.

    При объединении нескольких файлов манифеста Gradle следует порядку приоритетов по умолчанию и объединяет манифест библиотеки с основным манифестом тестового APK.

Анатомия файла AAR

Расширение файла AAR — .aar , а тип артефакта Maven — aar . Сам файл — это ZIP-файл. Единственная обязательная запись — /AndroidManifest.xml .

Файл AAR может также включать одну или несколько из следующих необязательных записей: