Android studio как создать библиотеку

Создание standalone библиотеки под android

В этой статье я расскажу как создать библиотеку, которая использует другие библиотеки и при этом уместить всё в одном jar.

Допустим мы пишем библиотеку, она использует другие библиотеки и, в частности, для примера, support library. Если бы мы использовали maven, то в pom файле просто прописали зависимости и не парились. Но что если нашу библиотеку будут использовать люди, которые не пользуются системами сборок или пользуются ant’ ом?

Мы можем положить зависимости рядом с нашим jar. Но тогда неизбежны конфликты библиотек разных версий, например, если мы используем одну версию support library, а в самом приложении другая. Тогда придется руками одну из них удалять.

Можно пойти другим путем, вспомним что jar это обычный zip файл. Мы распакуем все зависимости, получим байт-код в виде .class файлов, далее компилируем код нашей библиотеки, кладем все .class файлы в одно место и собираем из них jar. Но если в приложении используются те же библиотеки что и у нас, то получим ошибку что в проекте два одинаковых класса.

Для решения этой проблемы воспользуемся утилитой jarjar. Она переименовывает все классы в jar файле. На примере support library — все классы находятся в пакете android.support.v4

Создадим правило для переименования классов android.support.v4.* в inner.android.support.v4.*
и сохраним в файл rules.txt

В итоге получили jar’ку с переименованными классами. Далее мы распаковываем все наши зависимости с переименованными классами и компилируем. Получаем библиотеку, которая содержит весь код нужный для выполнения.

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

И в заключение небольшой скрипт на gradle который всё это делает

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

В моём случае библиотека использует support library и dropbox sdk, и весит 50 кБ.

Этим же способом можно уменьшать размер вашего apk, все зависимости можно подключать не как jar файлы, а распаковывать в .classes и применять proguard, тогда он удалит неиспользуемые классы из библиотек. Так можно подключать к проекту тяжелые фреймворки не боясь увеличения размера apk

Источник

Публикация Android библиотеки в jCenter

В жизни каждого андроид разработчика настаёт момент, когда количество самописных утилит и хелперов, качующих из проекта в проект, переваливает за десяток. В этом случае хорошей практикой будет оформление подобных хелперов в виде самостоятельных «модулей» в терминах Android Studio. Еще лучше, если Вы собираетесь поделиться Вашими наработками с комьюнити, снабдив исходный код подходящей лицензией. Но просто залить исходники на GitHub в этом случае будет недостаточно – хочется, чтобы любой желающий мог подключить библиотеку с помощью однострочной Gradle зависимости, например такой:

О том, как этого добиться и пойдет речь в данной статье.

Как Android Studio подгружает зависимости

Вместе с выходом Android Studio разработчикам была предложена новая система автоматической сборки проектов Gradle. Теперь, чтобы добавить библиотеку в Ваш проект, достаточно поправить файл build.gradle, указав однострочную зависимость (в рассматриваемом случае она называется Remote Binary Dependency) в блоке dependencies:

После этого Android Studio загрузит указанную библиотеку нужной версии с сервера-хранилища и добавит в проект, что действительно очень удобно. Пожалуй, самыми популярным серверами-хранилищами Java библиотек являются jCenter и Maven Central. Аналогами можно назвать NPM для Node.js, NuGet для .Net, pip для Python и т.д.

Заглянем в build.gradle, расположенный в корне проекта:

Здесь jcenter() указывает, что Android Studio следует искать указанные зависимости в репозиториях jCenter. Аналогичная запись заставит Android Studio искать зависимости на Maven Central:

Последние версии Android Studio по умолчанию указывают jCenter — от части это связано с тем, что загрузка библиотеки в Maven Central требует больше усилий со стороны разработчика. jCenter считается крупнейшим хранилищем Java библиотек, но в то же время многие разработчики предпочитают Maven Central. Не стоит забывать, что jCenter и Maven Central являются физически разными серверами, и наличие библиотеки в одном не гарантирует её наличие в другом.

Читайте также:  Hot android apps что это

Наша задача загрузить библиотеку только в jCenter. Схематично процесс будет выглядеть так:

Шаг 0: Выбираем имя будущего пакета библиотеки

Существует конвенция именования пакетов, которой мы должны придерживаться. Название пакета состоит из 3-ех частей:

GROUP_ID: можно представить себе как идентификатор аккаунта, организации или package name, под которым распространяется библиотека или несколько библиотек. GROUP_ID должен быть в формате Reverse FQDN;
ARTIFACT_ID: название библиотеки или в терминологии Maven название «артефакта»;
VERSION: рекомендуется использовать паттерн вида x.y.z, но допустимо использование любых строковых значений.

Здесь com.squareup.okhttp это GROUP_ID, под которым распространяется множество библиотек, в частности okhttp и okhttp-urlconnection.

Примечание: при выборе GROUP_ID следует иметь в виду, что Вам должен принадлежать выбранный домен. В противном случае возникнут проблемы при его регистрации на Шаге 2.

В качестве демонстрационного примера я буду использовать тривиальный класс SimplePrefs.java, который упрощает обращение к SharedPreferences. Подразумевается, что Вы можете самостоятельно смастерить из него библиотеку-модуль в Android Studio и разместить исходный код в публичном репозитории.

Поскольку исходный код я буду размещать на Github, то GROUP_ID мне следует выбрать в формате:

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

Шаг 1: создаем контейнер в Bintray

Дело в том, что деплой библиотеки в Maven Central это весьма трудоёмкая задача, поэтому существуют сервисы, упрощающие этот процесс. Bintray — это система хранения библиотек, выступающая посредником между jCenter, Mavel Central и другими хранилищами. Ей-то мы и воспользуемся.

Создаём аккаунт на Bintray (достаточно бесплатного аккаунта) и подготавливаем контейнер, в который будет загружена наша библиотека: в разделе Owned Repositories выбираем Maven:

Жмём на Add New package:

Заполняем все поля, не забываем указать выбранную лицензию, жмём Create Package:

После этого Bintray подготовит наш контейнер:

Шаг 2: Регистрируем GROUP_ID с помощью Sonatype

Sonatype OSS Repository Hosting Service – это доверенное хранилище артефактов для Maven Central. Сервера Maven Central регулярно синхронизируются с OSSRH, и те артефакты, которые пользователь помечает как готовые к релизу, загружаются в центральное хранилище Maven Central. Чтобы зарегистрировать GROUP_ID, от имени которого Вы будете распространять библиотеки, нужно завести issue в их JIRA. После рассмотрения заявки Вам откроют нужный репозиторий на Sonatype, и Вы сможете загрузить артефакт.

Регистрируемся здесь, открываем и заполняем новую issue:

Остаётся дождаться ответа, после которого Вам создадут репозитории Sonatype с выбранным GROUP_ID. Мне ответили в течение часа:

изначально я не знал о том, что на GROUP_ID накладываются ограничения и выбрал такой: com.romangromov, на что получил ответ:


вот сылка из письма

После этого я сменил GROUP_ID на предложенный com.github.romangromov и успокоился.

Нам остаётся связать наш аккаунт Sonatype с Bintray, для этого идём в Настройки Профиля -> Accounts и указываем юзернейм, который зарегистрировали в джире Sonatype:

Шаг 3: Настраиваем автоматическую подпись пакетов в Bintray

Перед загрузкой артефактов в Maven Central они должны быть подписаны цифровой подписью. Bintray позволяет настроить автоматическую подпись новых пакетов или при загрузке обновлений для уже существующих. Для начала необходимо сгененировать приватный и публичный ключ. Стандарной утилитой для шифрования на линуксе является PGP( Pretty Good Privacy). Она бесплатна для частных лиц, но для использования её в коммерческих целях требуется лицензия. Полностью открытый аналог этой программы GnuPG (Gnu Privacy Guard) — делает то же самое, но абсолютно бесплатно.

Генерируем пару открытый-закрытый ключ:

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

Нам интересен идентификатор публичного ключа в строке pub: 2048R/

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

gpg —keyserver hkp://pool.sks-keyservers.net —send-keys PUBLIC_KEY_ID

Теперь экспортируем созданную пару ключей в виде текстовых файлов, не забывая подставить значение для почты, которую вы указали на шаге генерации ключей:

Читайте также:  Как платить через гугл pay андроид

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:

Остаётся поставить галочку, разрешающую автоматическую подпись: снова идём в редактирование профиля и ищем GPG Sign Uploaded files automatically.

Теперь загружаемые артефакты будут автоматически подписаны в Bintray.

Подробней можно почитать тут.

Шаг 4: настраиваем проект в Android Studio

Создаём типовой проект, который содержит два модуля:

1) Модуль библиотеки, SimplePrefsLibrary, который мы будем загружать в jCenter;
2) Модуль приложения, sample, демонстрирующего возможности библиотеки (не подлежит загрузке).

Для того, чтобы загрузить нашу библиотеку в Bintray мы воспользуемся плагином bintray-release для Gradle.

Дело в том, что перед загрузкой библиотеки в Bintray её необходимо снабдить определенными мета-данными, которые соответствуют требованиям jCenter или Maven Central. Чтобы не делать это вручную, мы воспользуемся плагином, который берёт на себя генерацию необходимых мета-файлов.

Сперва заберём API ключ, который нам любезно предоставляет Bintray: Настройки Профиля -> API Key:

Теперь идём в build.gradle в корне проекта, добавляем плагин:

Правим build.gradle для модуля библиотеки:

Здесь мы указали необходимые параметры конфигурации maven в Bintray, подробное описание параметров есть на wiki.

После этого открываем терминал в Android Studio и выполняем:

gradlew clean build bintrayUpload -PbintrayUser= -PbintrayKey= -PdryRun=false

Это запустит gradle скрипт сборки проекта и деплой в Bintray, и, если всё в порядке, мы увидим надпись BUILD SUCCESSFUL, иначе читаем сообщение и устраняем ошибки, как правило сообщения внятные/гуглятся.

Теперь идём в Bintray во вкладку Files и проверяем, загрузился ли пакет:

Если всё в порядке, то мы увидим содержимое нашего пакета. Отлично, теперь его может загрузить любой желающий! Но на данный момент пакет размещен в нашем персональном Maven репозитории, а не в Maven Central или jCenter. Чтобы его использовать необходимо указывать maven репозиторий автора в явном виде:

Мне самому не нравятся подобные зависимости, поэтому сразу же избавимся от этого с помощью синхронизации с jCenter (благо это делается в один клик!): идём в Bintray на страницу нашего пакета, жмём вкладку Maven Central и ссылку из всплывающего окна «Add to jCenter».

Ну вот и всё, после этого будет сформирован запрос на добавление библитеки в jCenter:

После того, как библиотека добавится в jCenter, появится значок c надписью Linked to jCenter, теперь любой желающий сможет использовать Вашу библиотеку с помощью однострочной зависимости:

Источник

Как создать андроидную библиотеку с Android Studio и gradle?

Я пытаюсь перенести проект из Eclipse, но ничего, что я пробовал, работает. В Eclipse у меня есть 3 проекта (2 проекта приложений для Android и 1 проект библиотеки Android). Проекты из двух приложений зависят от проекта библиотеки. Когда я делаю экспорт gradle, я получаю 3 проекта, которые не работают. Я открыт для реструктуризации проекта, но не нашел никакой документации о том, как это сделать.

Есть ли способ сделать 3 проекта, которые Eclipse экспортирует вместе? Мне лучше реорганизовать вещи, и если да, то это документация о том, как это сделать?

Обновление

Обновление 1

Основываясь на предложениях Падма Кумара, это то, что я пробовал.

  • Создайте новый проект под названием MyApp
  • Нажмите File > New Module , выберите Android Library и назовите его MyLib
  • Нажмите Build > Make Project

Сбой сборки с этой ошибкой

Затем я добавил атрибут package в манифест, создавая его

После сборки я получаю эту ошибку

Добавление зависимости не влияет на ошибку. Продолжение сверху

  • Нажмите File > Project Structure > Modules > MyApp-MyApp
  • Перейдите на вкладку Dependencies
  • Нажмите + > Module Dependency и выберите MyLib
  • Нажмите Apply и OK
  • Нажмите Build > Make Project

Обновление 2

Основываясь на предложениях от Этана, мы получаем

У 2-подпроекта build.gradle , кажется, есть все правильные части, и единственная разница в том, что строка плагина ниже MyApp/build.gradle .

Корневой проект build.gradle был пустым, поэтому я добавил два проекта, таких как

Теперь я получаю эту ошибку при создании

Обновление 3

Большое спасибо Этану за это.

  • Добавьте compile project(‘:SubProjects:MyLib’) в MyLib/build.gradle
  • Удалите compile files(‘libs/android-support-v4.jar’) из MyLib/build.gradle
  • Закрыть проект и импортировать корневой проект из gradle

Обновление 4

Начиная с версии 0.1.2 теперь вы можете включить compile «com.android.support:support-v4:13.0.0» вместо compile files(‘libs/android-support-v4.jar’) . Поскольку это происходит из mavin, вы можете включить это в несколько проектов без проблем.

Читайте также:  Рингтоны для андроид мелодии для звонка

Обновление 5

Начиная с версии 0.1.3 на панели инструментов появляется кнопка «Синхронизировать проект». Вы можете щелкнуть это, вместо того, чтобы повторно импортировать ваш проект после внесения изменений в .gradle файлы.

ОТВЕТЫ

Ответ 1

Примечание. Этот ответ является чистым ответом Gradle, я использую его в IntelliJ на регулярной основе, но я не знаю, как интеграция с Android Studio. Я верю в то, что знаю, что происходит для меня, поэтому я использую Gradle и Android.

Отказ от ответственности. Это проект, над которым я/работаю.

Gradle имеет определенную структуру (которую вы можете изменить, ссылка внизу описывает, как), которая очень похожа на Maven if вы когда-либо использовали его.

Если у вас есть только один проект, файл settings.gradle не нужен. Однако вы хотите добавить больше проектов, поэтому нам это нужно.

Теперь давайте взглянем на этот файл build.gradle. Вам понадобится это в нем (чтобы добавить инструменты для Android)

build.gradle

Теперь нам нужно сообщить Gradle о некоторых частях Android. Это довольно просто. Основной (который работает в большинстве моих случаев) выглядит следующим образом. У меня есть комментарий в этом блоке, он позволит мне указать имя и код версии при создании APK.

build.gradle

Что-то, что мы хотим добавить, чтобы помочь любому, кто еще не видел свет Gradle, способ использовать проект без его установки.

build.gradle

Итак, теперь у нас есть один проект для сборки. Теперь мы собираемся добавить остальных. Я помещаю их в каталог, возможно, называю его deps или subProjects. Это не имеет большого значения, но вам нужно знать, где вы его положили. Чтобы сообщить Gradle, в каких проектах вам нужно будет добавить их в settings.gradle.

Структура каталогов:

settings.gradle:

Последнее, что вы должны убедиться в том, что subProjects/reallyCoolProject1/build.gradle имеет apply plugin: «android-library» вместо apply plugin: «android» .

Как и каждый проект Gradle (и Maven), нам нужно сообщить корневому проекту об этой зависимости. Это может также включать любые нормальные зависимости Java, которые вы хотите.

build.gradle

Я знаю, что это похоже на много шагов, но они довольно легкие, как только вы это сделаете один или два раза. Этот способ также позволит вам построить сервер CI, если у вас установлен Android SDK.

Сторона NDK Примечание. Если вы собираетесь использовать NDK, вам понадобится что-то вроде ниже. Пример файла build.gradle можно найти здесь: https://gist.github.com/khernyo/4226923

build.gradle

Ответ 2

У меня были очень похожие проблемы с gradle сборкой/добавлением библиотеки .jar. Я получил его работу с помощью комбинации:

  • Перемещение папки libs до корня проекта (тот же каталог, что и «src» ), и добавление библиотеки в эту папку в finder (с использованием Mac OS X).
  • В Android Studio щелкните правой кнопкой мыши по папке для добавления в качестве библиотеки
  • Редактирование зависимостей в файле build.gradle, добавление compile fileTree(dir: ‘libs’, include: ‘*.jar’)>

НО, что более важно и досадно, только через несколько часов после того, как я его заработал, Android Studio только что выпустила 0.3.7, которая утверждает, что разрешила множество проблем gradle, таких как добавление библиотек .jar

Надеюсь, это поможет людям!

Ответ 3

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

Сначала перейдите на панель инструментов Android Studio

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

Сборкa > Компилировать модуль «здесь отображается ваше имя приложения» (все еще он-лайн разрешает файлы — скачать и закончить), а затем

Запустите приложение, которое будет завершено, и он запустит ваш эмулятор и настроит его, а затем запустит его!

Вот и все. Счастливые Кодирующие парни.

Ответ 4

Gradle Build Tools 2.2.0+ — Все работает только

Это правильный способ сделать это

Пытаясь избежать экспериментальных и откровенно сытых по горло NDK и всех его хакеров, я рад, что появился 2.2.x из Gradle Build Tools, и теперь он просто работает. Ключ — это аргумент externalNativeBuild и pointing ndkBuild path в Android.mk или изменить ndkBuild на cmake и указать аргумент пути в CMakeLists.txt build script.

После правильной настройки вы можете ./gradlew installDebug и выйти. Вам также необходимо знать, что NDK переходит на clang, поскольку gcc теперь устарел в Android NDK.

Источник

Оцените статью