В Android Studio, если вы хотите включить любую библиотеку в своё приложение, вы просто можете добавить следующую строку с зависимостью в файл build.gradle модуля.
dependencies { compile "com.android.support:design:${supportLibrary}" }
Этого достаточно, чтобы библиотека стала пригодной для использования.
Но как Android Studio извлекает библиотеку? В этой статье подробно описывается, как эта вещь работает, в том числе, как опубликовать свою собственную библиотеку и делиться ею с разработчиками в остальном мире.
Откуда Android Studio извлекает библиотеку?
Начните с этого простого вопроса, чтобы полностью понять, как это работает. Он просто гуглит для нас библиотеку и загружает в наш проект?
На самом деле всё проще. Android Studio загружает библиотеку с сервера Maven Repository, который мы определили build.gradle. (Apache Maven — это инструмент, разработанный Apache, который предоставляет файловый сервер для распространения библиотек). В основном есть только 2 стандартных сервера, используемых для размещения библиотек для Android, таких как jCenter и Maven Central.
jCenter
jCenter — репозиторий Maven, размещенный на bintray.com. Здесь вы можете найти весь репозиторий.
Чтобы использовать jCenter в вашем проекте, вы должны определить репозиторий, как показано ниже, в файле build.gradle проекта.
allprojects { repositories { jcenter() } }
Maven Central
Maven Central — репозиторий Maven, размещенный на sonatype.org. Здесь вы можете найти весь репозиторий.
Чтобы использовать Maven Central в своём проекте, вы должны определить репозиторий, как показано ниже, в файле build.gradle проекта.
allprojects { repositories { mavenCentral() } }
Обратите внимание, что хотя jCenter и Maven Central являются стандартными репозиториями для библиотек Android, они размещаются в совершенно разных местах, предоставляемых разными провайдерами, и между ними нет ничего общего. То, что доступно в jCenter, не может быть найдено в Maven Central и наоборот.
Помимо этих двух стандартных серверов, мы также можем самостоятельно определить конкретный сервер хранилища Maven, если мы используем библиотеку от некоторых разработчиков, которые хотят размещать свои библиотеки на своем собственном сервере. Fabric.io попадает в этот случай, поскольку размещает свой собственный репозиторий Maven на странице. Если вы хотите использовать любую библиотеку Fabric.io, вам необходимо определить URL репозитория, как показано ниже.
repositories { maven { url 'https://maven.fabric.io/public' } }
И тогда вы сможете получить доступ к любой библиотеке.
dependencies { compile('com.crashlytics.sdk.android:crashlytics:2.7.1@aar') { transitive = true; } }
Но какой из способов лучше: загрузить библиотеку на стандартный сервер или разместить наш собственный сервер? Первый. Сделать нашу собственную библиотеку доступной для публики. Другому разработчику не нужно будет ничего определить, кроме строки с зависимостью. Поэтому в этой статье мы сосредоточимся только на jCenter и Maven Central.
Понимание jCenter и Maven Central
Почему существует не только один, а два стандартных репозитория?
Фактически оба из них — репозитории, имеющие одну и ту же обязанность: размещение библиотек Java\Android. Разработчики сами выбирают, куда они хотят загрузить библиотеку.
Сначала Android Studio выбирает Maven Central как репозиторий по умолчанию. Когда вы создадите новый проект на старой версии Android Studio, mavenCentral() будет определен по умолчанию в build.gradle.
Но большая проблема Maven Central заключается в том, что она не подходит для разработчиков. Удивительно сложно туда загрузить библиотеку. Так существует ещё проблема безопасности. По этой причине команда Android Studio решила вместо этого заменить репозиторий по умолчанию на jCenter, поэтому при создании проекта сейчас вы увидите в репозитории по умолчанию именно jcenter().
Есть весомые причины, по которым они решили переключиться на jCenter. Вот некоторые из основных:
- jCenter предоставляет библиотеку через CDN, что означает, что разработчик может наслаждаться более быстрой загрузкой;
- jCenter — это самый большой Java-репозиторий на Земле. Таким образом, всё, что доступно в Maven Central, может быть доступно и в jCenter. Другими словами, jCenter является надмножеством Maven Central;
- загрузить библиотеку на репозиторий очень легко. Не нужно подписывать или делать какие-либо сложные вещи, как на Maven Central;
- дружественный интерфейс;
- если вы хотите загрузить свою библиотеку и в Maven Central, вы можете это легко сделать одним кликом на сайте bintray.
Таким образом, статья будет сосредоточена на jCenter, так как после успешной загрузки вашей библиотеки в jCenter её можно сразу перенаправить в Maven Central.
Как Gradle получает библиотеку из репозитория?
Прежде чем мы будем говорить о том, как загрузить библиотеку в jCenter. Мы должны начать с того, как Gradle извлекает библиотеку из репозитория. Когда мы пишем имя зависимости в build.gradle, как именно Gradle загружает эти файлы в ваш проект?
compile "com.android.support:design:27.0.0"
Для начала мы должны знать, из чего состоит библиотека. Она состоит из трёх частей:
GROUP_ID:ARTIFACT_ID:VERSION
В приведённом выше случае GROUP_ID это com.android.support, тогда как ARTIFACT_ID является design, а VERSION — 27.0.0.
Для понимания, GROUP_ID определяет имя группы библиотеки. Возможно, что в одном и том же контексте будет работать более одной библиотеки, работающей с другим проектом. Если библиотека находится в одной группе, она будет иметь один и тот же GROUP_ID. Обычно мы называем его именем пакета разработчика. А затем определяем реальное имя библиотеки в ARTIFACT_ID. Для VERSION определяется только номер версии. Хотя это может быть любой текст, но лучше всего использовать его в формате x.y.z.
Что произойдёт, когда мы добавим зависимости в проект? Gradle спросить Maven Repository Server, существует ли библиотека, и если да, то Gradle получит путь к запрошенной библиотеке, которая в основном предоставлена GROUP_ID/ARTIFACT_ID/VERSION_ID, например, http://jcenter.bintray.com/com/squareup/otto/1.3.8.
И тогда Android Studio загрузит эти файлы и скомпилирует с вашим проектом. Вот и всё, ничего сложного.
Вы должны понимать, что библиотека, вытащенная из репозитория, не имеет ничего особенного, кроме файлов jar или aar, размещённых на сервере репозитория. Это как если бы вы скачали эти файлы самостоятельно, скопировали и скомпилировали с проектом. Но большим преимуществом, которое вы получаете от использования зависимостей, заключается в том. что вам достаточно просто набрать имя зависимости, а Gradle сделает всё остальное.
Что такое формат aar
Как было написано выше, в репозитории размещены файлы двух типов: jar и aar. Что такое jar файл ясно, но что такое aar?
Файл aar разрабатывается поверх файла jar. Это было сделано потому, что некоторые Android-библиотеки должны быть встроены в некоторые Android-файлы, такие как AndroidManifest.xml, Resources, Assets, которые не соответствуют стандарту jar-файла. Поэтому был изобретён aar, чтобы охватит эти вещи. В остальном же это обычный zip-файл, похожий на one-jar, но с другой файловой структурой. jar-файл встраивается в aar с именем classes.jar. Остальное перечислено ниже.
- /AndroidManifest.xml (обязательно)
- /classes.jar (обязательно)
- /res/ (обязательно)
- /R.txt (обязательно)
- /assets/ (опционально)
- /libs/*.jar (опционально)
- /jni/<abi>/*.so (опционально)
- /proguard.txt (опционально)
- /lint.jar (опционально)
Как вы видите, файл aar предназначен специально для Android. Итак, эта статья научит вас создавать и загружать библиотеку в формате aar.
Как загрузить вашу библиотеку в jCenter
Теперь у вас есть основные знания о том, как работает система репозиториев. Теперь давайте начнём самую важную часть: процесс загрузки. Нашей задачей является загрузить наши файлы библиотеки на http://jcenter.bintray.com. Как только мы сможем это сделать, библиотека будет опубликована. Есть две вещи, которые нужно учитывать: как создать файл aar и как загрузить встроенные файлы на репозиторий?
Хотя для этого требуется множество шагов, сделать это очень просто, поскольку bintray подготовился ко всему достаточно хорошо. Вы можете найти весь процесс загрузки на рисунке ниже.
И поскольку есть довольно много деталей, следующий этап будет разделён на 7 частей, чтобы описывать процесс шаг за шагом.
Часть 1: Создание пакета на Bintray
Прежде всего, вам нужно создать пакет на bintray. Для этого вам нужна учетная запись bintray.
Шаг 1. Зарегистрируйтесь на сайте bintray.com.
Шаг 2. Как только регистрация будет завершена, зайдите в свой профиль, нажмите Add New Repository, выберите тип Maven и введите название вашего репозитория (например, maven).
Шаг 3. На странице репозитория нажмите Add New Package, чтобы начать создание нового пакета для вашей библиотеки.
Шаг 4. Заполните всю необходимую информацию и нажмите Create package.
Шаг 5. Пакет создан! Теперь на странице репозитория у вас появится созданный пакет, в который вы можете зайти и отредактировать по желанию или просмотреть сведения о нём.
Готово! Теперь у вас есть собственный репозиторий Maven на Bintray, который готов к загрузке библиотеки.
Следующим этапом является Sonatype, провайдер Maven Central.
Часть 2: Создание учетной записи Sonatype для Maven Central
Примечание: вы можете пропустить Части 2 и 3, если у вас нет в планах загружать вашу библиотеку в Maven Central. Однако я предлагаю вам не пропускать, так как есть много разработчиков, которые всё ещё используют этот репозиторий.
Так же, как и jCenter, для использования Maven Central вам необходимо зарегистрировать на сайте провайдера Sonatype.
Что вам нужно знать, так это то, что учетная запись, которую вы должны создать, это учетная запись JIRA Issute Tracker на сайте Sonatype. Для этого перейдите на панель инструментов Sonatype и просто зарегистрируйте учетную запись.
Как только вы это сделаете, вы должны запросить разрешение на распространение вашей библиотеки в Maven Central. Вам нужно создать новую задачу в JIRA, чтобы вам позволили загрузить новую библиотеку, которая будет соответствовать GROUP_ID, предоставленным Maven Central.
Чтобы создать задачу, описанную выше, нажмите наверху на панели инструментов кнопку «Создать».
Заполните следующую информацию:
- Проект: Community Support — Maven Central (MVNCENTRAL)
- Тип задачи: New Project
- Тема: название вашей библиотеки
- Group id: поле GROUP_ID вашей библиотеки. Сотрудники Sonatype проверять идентификатор группы на доступность, возможна такая ситуация, когда они могут попросить изменить идентификатор на другой.
- Project URL: адрес библиотеки, которую вы хотите предоставлять.
- SCM URL: адрес для контроля версий
Остальное оставьте без изменений и нажмите «Создать». Это всё. Теперь вам нужно дождаться ответа от Sonatype, которые должны либо одобрить и создать репозиторий, либо указать на ошибки и попросить их исправить (в моём случае ожидание заняло около 4 часов).
Последнее, что нужно сделать — дать bintray ваше имя пользователя на Sonatype OSS. Для этого нужно в настройках вашего профиля перейти на вкладку Accounts.
Нажмите Update и на этом настройка завершена.
Часть 3: Включение автоматической подписи в Bintray
Как упоминалось выше, мы могли загрузить библиотеку в Maven Central через jCenter, но для этого нам нужно сначала подписать эту библиотеку. Bintray предоставляет механизм, чтобы сделать это легко через веб-интерфейс, что позволит автоматически подписывать вашу библиотеку после загрузки.
Первый шаг — сгенерировать ключ через командную строку с помощью команды ниже. Для этого нам понадобится утилита GnuPG, которую можно скачать здесь.
gpg --gen-key
Необходимо заполнить некоторые обязательные поля. Некоторые поля можете оставить по умолчанию, нужно будет ввести только своё полное имя, фразу для ключа и email.
После создания ключа вызовите следующую команду, чтобы просмотреть информацию о созданном ключе.
gpg --list-keys
Если всё было сделано верно, вы увидите информацию, как показано ниже на примере.
pub 2048R/01ABCDEF 2015-03-07 uid Sittiphol Phanvilai <yourmail@email.com> sub 2048R/98765432 2015-03-07
Теперь нам нужно загрузить открытый ключ в keyservers, чтобы затем использовать. Для этого вызовите команду ниже и замените PUBLIC_KEY_ID на 8-значное шестнадцатиричное значение после знака слэша («/») в строке pub, которая в этом примере равна 01ADBCDEF.
gpg --keyserver hkp://pool.sks-keyservers.net --send-keys PUBLIC_KEY_ID
А затем экспортируйте открытый и закрытый ключи следующей командой, заменив yourmail@email.com на тот, который вы указывали при создании ключа.
gpg -a --export yourmail@email.com > public_key_sender.asc gpg -a --export-secret-key yourmail@email.com > private_key_sender.asc
Откройте страницу редактирования профиля на Bintray. Зайдите в GPG Signing и заполните поля Public key и Private key содержимым открытого ключа и закрытого ключа соответственно, которые были экспортированы на предыдущем шаге. Нажмите Update чтобы сохранить изменения.
Заключительный шаг — включить автоматическую подпись. Перейдите на страницу репозитория и нажмите Edit. На странице редактирования в самом низу поставьте галочку на GPG Sign uploaded files automatically и нажмите Update.
Это всё. С этого момента каждая отдельная библиотека, загруженная в ваш репозиторий Maven, будет автоматически подписана и готова к отправке в Maven Central одним щелчком мыши.
Обратите внимание, что это одноразовое действие, которое также будет применять к каждой отдельной библиотеке, созданной после этого.
Bintray и Maven Central теперь готовы. Перейдём к части в Android Studio.
Часть 4: Подготавливаем проект Android Studio
Во многих случаях нам может потребоваться больше 1 библиотеки для загрузки в репозиторий в одном проекте, и в то же время нам может не понадобиться загружать что-либо. Поэтому лучшей структурой, которую я бы рекомендовал, является разделение каждой части на модуль. В принципе, я предлагаю разделить, по крайней мере, на 2 модуля, один — на модуль приложения для примера использования библиотеки, а второй — на модуль библиотеки, содержащий исходный код, который вы хотите загрузить в репозиторий. Обратите внимание: если вы хотите иметь более 1 библиотеки в своем проекте, создайте ещё один модуль: один модуль на одну библиотеку.
- app — модуль приложения (apply plugin: ‘com.android.application’), не будет загружен на репозиторий
- materialfilepicker — модуль библиотеки (apply plugin ‘com.android.library’), будет загружен на репозиторий
Создать модуль библиотеки достаточно просто, поэтому я не буду углубляться в эту часть.
Далее следует применить плагин bintray к вашему проекту. Для этого нам нужно изменить файл build.gradle проекта, добавив зависимость.
dependencies { classpath 'com.android.tools.build:gradle:3.0.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' }
Затем вы определим имя пользователя и ключ API, используемые для аутентификации в Bintray, изменив local.properties. Причина, по которой нам нужно помещать эти данные именно в этот файл, заключается в том, что этими данными не нужно делиться ни с кем, а файл local.properties по умолчанию внесён в .gitignore. Поэтому эти конфиденциальные данные не будут загружены в git непреднамеренно.
Вот две строки, которые нужно добавить:
bintray.user=<имя пользователя на bintray> bintray.apikey=<ключ API>
Поместите свои имя пользователя и ключ API, который вы можете найти в настройках профиля на Bintray в поле API Key.
Последний шаг, который нужно изменить — это файл build.gradle модуля. Откройте его и поместите эти строки сразу после apply plugin ‘com.andorid.library’.
ext { bintrayRepo = <название вашего репозитория с Bintray> bintrayName = <название пакета в репозитории> publishedGroupId = <идентификатор группы, созданный на Sonatype> libraryName = <название библиотеки> artifact = <идентификатор артефакта> libraryDescription = <описание библиотеки (если есть)> siteUrl = <URL, указанный в сведениях о пакете> gitUrl = <URL для контроля версий, указанный в сведениях о пакете> libraryVersion = <версия библиотеки> developerId = <идентификатор разработчика> developerName = <имя разработчика> developerEmail = <email разработчика> licenseName = <название лицензии> licenseUrl = <ссылка на лицензию> allLicenses = <перечень лицензий> }
Например:
ext { bintrayRepo = 'maven' bintrayName = 'materialfilepicker' publishedGroupId = 'io.github.japskiddin' libraryName = 'materialfilepicker' artifact = 'materialfilepicker' libraryDescription = 'Library for selecting folders' siteUrl = 'https://github.com/Japskiddin/MaterialFilePicker' gitUrl = 'https://github.com/Japskiddin/MaterialFilePicker' libraryVersion = '1.0.0' developerId = 'nkita' developerName = 'Nikita Bezhentsev' developerEmail = 'nkita@yandex.ru' licenseName = 'The Apache Software License, Version 2.0' licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt' allLicenses = ["Apache-2.0"] }
Конечным шагом является применение сразу двух скриптов, используемых для создания файлов библиотек и загрузки собранных файлов в Bintray. Для этого добавьте в самый конец этого же файла build.gradle следующие строки.
apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle'
Готово! Теперь ваш проект настроен и готов к загрузке на bintray.
Часть 5: Загружаем библиотеку на bintray
Настало время загрузить вашу библиотеку в свой репозиторий на bitntray. Для этого перейдите на вкладку Terminal в Android Studio.
Первый шаг — проверить правильность кода и собрать файлы библиотеки (aar, pom и т.д.). Введите следующую команду для этого.
gradlew install
Если всё хорошо, вы увидите что-то вроде:
BUILD SUCCESSFUL
Мы уже на полпути. Следующий шаг — загрузить собранные файлы в bintray с помощью следующей команды.
gradlew bintrayUpload
Если вы увидите сообщение, как показано внизу, значит всё сделано верно!
SUCCESSFUL
Проверьте свой пакет на сайте bintray. Вы увидите изменения в области Versions.
Нажмите на вкладку Files, и вы увидите загруженные файлы вашей библиотеки.
Поздравляем, ваша библиотека теперь и сети и готова для использования всеми людьми!
Однако не радуйтесь раньше времени. Библиотека всё ещё находится на вашем собственном репозитории Maven, но не в jCenter. Если кто-то захочет использовать вашу библиотеку, они должны сначала определить URL вашего репозитория, как показано ниже.
repositories { maven { url 'https://dl.bintray.com/nkita/maven' } } ... dependencies { compile 'io.github.japskiddin:materialfilepicker:1.0.0' }
Вы можете найти URL вашего репозитория в веб-интерфейсе bintray. Вы можете пройти по этому URL и увидеть структуру изнутри.
Как уже упоминалось выше, это не лучшая практика. Поэтому давайте передадим нашу библиотеку из нашего собственного репозитория в jCenter.
Часть 6: Синхронизируем наш репозиторий с jCenter
Сделать это достаточно легко. Просто зайдите на страницу своего репозитория и нажмите Add to JCenter. В появившемся окне ничего не заполняем и просто жмём Send.
Теперь нужно подождать, пока команда bintray одобрит ваш запрос. Как только запрос на синхронизацию будет одобрен, вы получите электронное письмо с сообщением об этом изменении. Теперь давайте проверим страницу репозитория, вы должны увидеть jCenter в поле Linked To.
С этого момента любой разработчик, использующий репозиторий jcenter(), сможет использовать вашу библиотеку, добавив зависимость.
compile 'io.github.japskiddin:materialfilepicker:1.0.0'
Хотите проверить наличие библиотеки в jCenter? Перейдите по ссылке http://jcenter.bintray.com и перейдите в каталог, соответствующий вашему идентификатору группы и артефакта.
Обратите внимание, что синхронизация с jCenter — это одноразовое действие. С этого момента, если вы производите какие-либо изменения в своём пакете, эти изменения также добавятся в jCenter.
И будьте осторожны. Если вы решите удалить пакет, файлы библиотеки, размещённые в jCenter, в этом случае не будут удалены. Они останутся там, как файлы зомби, которые больше никто не сможет удалить. Поэтому если вы хотите удалить пакет, сначала удалить каждую версию из веб-интерфейса.
Часть 7: Пересылаем библиотеку в Maven Central
Не все разработчики Android используют jCenter. Есть ещё множество разработчиков, пользующихся mavenCentral(), поэтому давайте загрузим библиотеку в Maven Central. Чтобы переслать библиотеку из jCenter в Maven Central, вам нужно достичь двух целей:
- Пакет bintray должен быть связан с jCenter
- Репозиторий на Maven Central должен быть одобрен
Способ пересылки пакета в Maven Central невероятно прост. Просто нажмите на странице пакета на Maven Central.
Введите имя пользователя и пароль от аккаунта Sonatype и нажмите Sync.
Successfullt synced and closed repo будет показан в поле Last sync, как только синхронизация будет выполнена успешно. Но если есть какие-либо проблемы, они будут показаны в Last Sync Errors. Вы должны исправить проблему в каждом конкретном случае, поскольку условия для библиотеки, которая должна быть загружена на Maven Central, являются строгими.
Когда всё будет сделано, вы можете найти свои файлы в Maven Central Repository в каталоге, соответствующем идентификатору группы.
Поздравляю! Это всё. Хотя для этого потребовалось довольно много шагов, но сами шаги просты. И большинство из них — одноразовые действия.