- Создание standalone библиотеки под android
- Публикация Android библиотеки в jCenter
- Как Android Studio подгружает зависимости
- Шаг 0: Выбираем имя будущего пакета библиотеки
- Шаг 1: создаем контейнер в Bintray
- Шаг 2: Регистрируем GROUP_ID с помощью Sonatype
- Шаг 3: Настраиваем автоматическую подпись пакетов в Bintray
- Шаг 4: настраиваем проект в Android Studio
- Как создать андроидную библиотеку с Android Studio и gradle?
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Gradle Build Tools 2.2.0+ — Все работает только
Создание 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 являются физически разными серверами, и наличие библиотеки в одном не гарантирует её наличие в другом.
Наша задача загрузить библиотеку только в 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
Теперь экспортируем созданную пару ключей в виде текстовых файлов, не забывая подставить значение для почты, которую вы указали на шаге генерации ключей:
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.
Источник