Как создать проект библиотеки в Android Studio и проект приложения, использующий проект библиотеки

164

Я новичок в системе сборки Gradle и IntelliJ.

Итак, как мне создать проект библиотеки Android (например, com.myapp.lib1) и проект приложения (например, com.myapp.app) и сделать так, чтобы система сборки включала com.myapp.lib1 в проект приложения?

Я перешел в Project Structure -> Modules -> My App project и добавил зависимость в проект lib. IntelliJ теперь может распознавать классы из проекта lib при использовании в проекте приложения, но когда я запускаю проект приложения, появляются такие ошибки, как:

Gradle: error: package com.myapp.lib1 does not exist
Рэнди Сугианто 'Юку'
источник
1
Я использовал библиотеки Android для создания бесплатных / платных версий моего приложения. Новая система сборки Gradle делает этот подход устаревшим с концепцией Build Variants. Теперь вы можете автоматически создавать разные подписанные APK из одного и того же кода. Я хотел бы знать это раньше.
theczechsensation
1
@ theczechsensation - можешь уточнить? После загрузки APK для полной версии, я попытался загрузить APK для бесплатной версии, но с тем же именем пакета. Google Play Store (GPS) сообщил мне, что я уже использовал название этого пакета. Означает ли то, что вы говорите о gradle, что мне не нужно два отдельных приложения в двух разных пакетах?
DSlomer64
Вот идеальный ответ stackoverflow.com/a/31366602/1118772 . Акиб Мумтаз упоминается в ответах, но это наконец. Вместо того, чтобы тратить время на другие пути, вы можете пойти с этим. philosophicalhacker.com/2014/10/02/...
Noundla Sandeep
Интересная ветка добавления библиотек. С наглядным объяснением.
Хариш

Ответы:

111

Чтобы создать библиотеку:

Файл> Новый модуль

выберите библиотеку Android

Lib

Чтобы использовать библиотеку, добавьте ее в качестве зависимости:

Файл> Структура проекта> Модули> Зависимости

отд

Затем добавьте модуль (библиотеку Android) в качестве зависимости модуля.

добавить модуль

Запустите свой проект. Это будет работать.

Бландел
источник
194
Это создает файлы модуля в проекте. Что если вы хотите, чтобы модуль был внешним по отношению к проекту, чтобы его можно было использовать с другим приложением?
rrbrambley
2
@rrbrambley: я нашел способ повторно использовать модуль в нескольких проектах. Я создал (NTFS Junction) ссылки на папки, используя приложение под названием winbolic link для Windows. Когда у меня есть модуль, который я хотел бы повторно использовать в нескольких проектах, я создаю ссылку на папку для проекта, который будет использоваться повторно, внутри каталога каждого проекта, в котором он будет использоваться. После этого я добавляю зависимости модуля (в Andr. Studio). Теперь я могу использовать / редактировать модуль в каждом проекте, сохраняя синхронизацию. Не уверен, что это правильный путь, но пока он работает довольно хорошо! Это работает лучше, чем местный репозиторий Maven.
Питер
1
К сожалению, по состоянию на июль 2014 года, больше нет настроек проекта, подобных тем, что показаны на скриншоте. Я должен был отредактировать файлы .grade, как в ответе GrkEngineer ниже.
Тим Брей
24
Это должно быть отклонено, поскольку это создает модуль из существующего проекта
Джонатан
2
Если вы хотите использовать ту же библиотеку в других проектах, вам необходимо скопировать библиотечный модуль в этот проект и вручную настроить settings.gradle и build.gradle основного модуля.
Хану
114

Интересно, почему нет примера отдельного проекта фляги?

В eclipse мы просто устанавливаем флажок «Is Library» в диалоге настроек проекта.
В студии Android я выполнил эти шаги и получил файл jar.

  1. Создать проект.

  2. Откройте файл в левом меню проекта. (app / build.gradle): Сценарии Gradle> build.gradle (Модуль: XXX)

  3. изменить одну строку: apply plugin: 'com.android.application'->'apply plugin: com.android.library'

  4. удалить applicationId в файле: applicationId "com.mycompany.testproject"

  5. построить проект: Build> Rebuild Project

  6. тогда вы можете получить файл aar: app> build> output> aar folder

  7. изменить aarимя расширения файла наzip

  8. распакуйте, и вы можете увидеть classes.jarв папке. переименуйте и используйте его!

Во всяком случае, я не знаю, почему Google делает создание банок так хлопотно в Android Studio.

Джинбом Хо
источник
1
У меня работает на Android Studio 2.2.2 дек. 2016.
Герман
95

Google Gradle Plugin Рекомендуемый способ настройки файлов Gradle для создания нескольких проектов имеет некоторые недостатки. Если у вас есть несколько проектов, зависящих от одного библиотечного проекта, в этом посте кратко объясняется рекомендуемая Google конфигурация, ее недостатки и рекомендуются другие способы настройки файлов Gradle для поддержка многопроектных настроек в Android Studio:

Альтернативная мультипроектная настройка для андроид студии

Другой путь:

Оказывается, есть лучший способ управлять несколькими проектами в Android Studio. Хитрость заключается в том, чтобы создавать отдельные проекты Android Studio для ваших библиотек и сообщать gradle, что модуль для библиотеки, от которой зависит ваше приложение, находится в каталоге проектов библиотеки. Если вы хотите использовать этот метод со структурой проекта, которую я описал выше, вы бы сделали следующее:

  1. Создать проект Android Studio для библиотеки StickyListHeaders
  2. Создать проект Android Studio для App2
  3. Создайте проект Android Studio для App1
  4. Сконфигурируйте App1 и App2 для сборки модулей в проекте StickyListHeaders.

4-й шаг - это сложная часть, поэтому это единственный шаг, который я опишу подробно. Вы можете ссылаться на модули, которые являются внешними по отношению к каталогу вашего проекта, добавив оператор проекта в файл settings.gradle и установив свойство projectDir для объекта ProjectDescriptor, который возвращается этим оператором проекта:

введите описание изображения здесь

Код, который нужно вставить settings.gradle:

include ':library1'
project(':library1').projectDir = new File('../StickyListHeader/library1')

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

введите описание изображения здесь

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

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

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

Акиб Мумтаз
источник
4
Это идеальный ответ. Спасибо.
Нундла Сандип
1
Хороший ответ, но вы должны скопировать соответствующие биты из поста в ваш ответ в случае разрыва ссылки.
Грейсон Паррелли
2
ПРИМЕЧАНИЕ: для оценки строки в gradle вы должны использовать двойную кавычку ("). Это" спасите день "для меня.
Связано
1
Как мы ссылаемся на код библиотеки из кода приложения? После выполнения инструкций по настройке код приложения по-прежнему не может ссылаться на пакет в коде библиотеки. Есть ли дополнительный шаг, который нужно сделать?
CEGRD
2
@CEGRD Вам нужно перейти в File> Project Structure и нажать на название модуля, над которым вы работаете. Затем перейдите на вкладку зависимостей> нажмите «+», затем «Зависимость модуля» в раскрывающемся меню. После этого вы сможете добавить модуль library1 в ваш текущий проект.
OliasailO
45

Проверьте эту ссылку о настройках нескольких проектов .

Некоторые вещи, на которые следует обратить внимание, убедитесь, что ваш файл settings.gradle обновлен и теперь содержит ссылки на модули приложения и библиотеки.

settings.gradle: include ':app', ':libraries:lib1', ':libraries:lib2'

Также убедитесь, что в build.gradle приложения есть следующее:

dependencies {
     compile project(':libraries:lib1')
}

Вы должны иметь следующую структуру:

 MyProject/
  | settings.gradle
  + app/
    | build.gradle
  + libraries/
    + lib1/
       | build.gradle
    + lib2/
       | build.gradle

Build.gradle приложения должен использовать com.android.applicationплагин, в то время как build.gradle любой библиотеки должен использовать com.android.libraryплагин.

Среда разработки Android Studio должна обновиться, если вы можете собрать из командной строки с этой настройкой.

GrkEngineer
источник
Является ли плагин, определенный в build.gradle, единственным отличием? т.е. вы можете изменить существующий модуль в библиотеку Android, изменив эту строку?
Энрико
22
Однажды мы нажмем кнопку импорта, и библиотека просто заработает, затем мы начнем вводить код в редакторе.
Стив М
6
Этот подход, кажется, включает в себя библиотеки в реальном проекте. ОП хотел знать, как создать отдельный проект библиотеки Android, который живет в своем собственном проекте / пространстве и включается только в основной проект приложения как библиотека
Джонатан
@ SteveM Это было моей проблемой на протяжении всей моей карьеры. Я просто начинаю кодировать без какого-либо дизайна. А потом потратить часы на отладку и рефакторинг.
Раджкиран
13

Для Intellij IDEA (и Android Studio) каждая библиотека является модулем. Думайте о модуле в Android Studio как о эквиваленте проекта в Eclipse. Проект в Android Studio представляет собой сборник модулей. Модули могут быть работающими приложениями или библиотечными модулями.

Итак, для добавления нового проекта библиотеки Android вам необходимо создать модуль типа «Библиотека Android». Затем добавьте этот библиотечный модуль в список зависимостей вашего основного модуля (прикладного модуля).

Simon-Droid
источник
12

Самый простой способ для меня создать и повторно использовать проект библиотеки:

  1. На открытом проекте file > new > new module(и ответить на вопросы пользовательского интерфейса)

введите описание изображения здесь

  1. проверьте / или добавьте, если в файле settings.gradle :include ':myLibrary'
  2. проверьте / или добавьте, если в файле build.gradle :

    dependencies { ... compile project(':myLibrary') }

  3. Чтобы повторно использовать этот библиотечный модуль в другом проекте, скопируйте его папку в проекте вместо шага 1 и выполните шаги 2 и 3.

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

apply plugin: 'com.android.application'

android {...}

в

apply plugin: 'com.android.library'

android {...}

больше здесь

hanoo
источник
Если вы измените существующий модуль приложения на библиотечный модуль, изменив назначение плагина, вам также придется удалить строку `applicationId" com .... "из файла Gradle.
TDG
«ПРЕДУПРЕЖДЕНИЕ. Конфигурация 'compile' устарела и была заменена на 'реализация' и 'api'."
Slhck
9

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

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

Для ссылки на этот модуль вы должны:

  • В файле build.gradle вашего приложения добавьте:

    dependencies {
    ...
    compile project(':myandroidlib')
    }
    
  • В файле settings.gradle добавьте следующее:

     include ':app', ':myandroidlib'
     project(':myandroidlib').projectDir = new File(PATH_TO_YOUR_MODULE)
    
юлианский
источник
например, project(':library').projectDir = new File('../library')где libraryимя папки параллельно папке проекта Android.
Кто-то где-то
5

Не забудьте использовать вместо плагина apply plugin: 'com.android.library'свой build.gradleплагин:'com.android.application'

Райан Р
источник
4

Путь документации

Это рекомендуемый способ согласно совету, приведенному в документации Android Studio.

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

Создайте новый проект, в который войдет ваша библиотека. Нажмите Файл> Новый> Новый модуль> Библиотека Android> Далее> (выберите имя)> Готово . Затем добавьте все необходимые классы и ресурсы в свою библиотеку.

При сборке модуля будет создан файл AAR. Вы можете найти это в project-name/module-name/build/outputs/aar/.

Добавьте свою библиотеку в качестве зависимости

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

  1. Импортируйте файл библиотеки AAR с помощью меню «Файл»> «Новый модуль»> «Импорт пакета .JAR / .AAR»> «Далее» (выберите местоположение файла)> «Готово» . (Не импортируйте код, иначе он будет редактируемым в слишком многих местах.)
  2. Убедитесь, что в файле settings.gradle указано имя вашей библиотеки.

    include ':app', ':my-library-module'
    
  3. В файле build.gradle приложения добавьте строку компиляции в раздел зависимостей:

    dependencies {
        compile project(":my-library-module")
    }
    
  4. Вам будет предложено синхронизировать ваш проект с Gradle. Сделай это.

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

Ноты

Если вы хотите, чтобы ваша библиотека была легко доступна для более широкой аудитории, рассмотрите возможность использования JitPac или JCenter .

Suragch
источник
3

Возник тот же вопрос и решил его следующим образом:

Начальная ситуация :

FrigoShare (root)
|-Modules:    frigoshare,   frigoShare-backend

Цель : хотите добавить модуль с именемdataformats

  1. Добавить новый модуль (например: Java Library)
  2. Убедитесь, что вы settings.gradleвыглядите так (обычно автоматически):

    include ':frigoshare', ':frigoShare-backend', ':dataformats'

  3. Убедитесь ( вручную ), что build.gradleфайлы модулей, которые должны использовать вашу библиотеку, имеют следующую зависимость:

    dependencies { ... compile project(':dataformats') }

Матиас
источник
2

Как вышеупомянутый комментарий, я пытаюсь найти варианты Gradle Build Varians и нашел эту ссылку: http://code.tutsplus.com/tutorials/using-gradle-build-variants--cms-25005 Это очень простое решение. Вот что я сделал: - В build.gradle:

flavorDimensions "version"

productFlavors {
    trial{
        applicationId "org.de_studio.recentappswitcher.trial"
        flavorDimension "version"
    }
    pro{
        applicationId "org.de_studio.recentappswitcher.pro"
        flavorDimension "version"
    }

}

Затем у меня есть еще 2 версии моего приложения: профессиональная и пробная с 2-мя различными именами пакетов, в коде 2 которых указан идентификатор приложения, так что я могу загрузить обе версии в Google Play. Я все еще просто кодирую в разделе "main" и использую getpackageName для переключения между версиями. Просто перейдите по ссылке, которую я дал для деталей.

Хай нгуен тхан
источник
1

Есть два простейших способа, если один не работает, попробуйте другой.

  1. Добавьте зависимость библиотеки внутри зависимости внутри файла build.gradle библиотеки, которую вы используете, и вставьте вашу библиотеку во внешние библиотеки.

ИЛИ

  1. Просто перейдите в папку libs внутри папки приложения и вставьте все свои файлы .jar. Например, файлы библиотеки. Теперь хитрость заключается в том, что теперь перейдите в файл settings.gradle и добавьте эту строку «include»: app: libs »« after »include ': Приложение "Это определенно будет работать ........... :)
Судханшу Гаур
источник
1

В моем случае я использую MAC OS X 10.11 и Android 2.0 и делаю именно то, что объяснил Акиб Мумтаз.

Но каждый раз у меня было следующее сообщение: « При настройке проекта«: приложение »возникала проблема.> Не удалось оценить модуль xxx: Конфигурация с именем« по умолчанию »не найдена». ».

Я обнаружил, что причина этого сообщения в том, что Android 2.0 не позволяет создавать библиотеки напрямую. Итак, я решил сначала создать проект приложения, а затем изменить build.gradle, чтобы преобразовать его в библиотеку.

Это решение не работает, потому что проект библиотеки сильно отличается от проекта приложения.

Итак, я решил мою проблему следующим образом:

  • Сначала создайте стандартное приложение (при необходимости);
  • Затем выберите «Файл / Создать модуль»
  • Перейдите к искателю и переместите папку модуля, только что созданную в директорию вашего фреймворка.

Затем продолжите решение, предложенное Акибом Мумтазом.

В результате исходный код вашей библиотеки будет предоставлен без необходимости дублирования исходных файлов каждый раз (это было ересью для меня!)

Надеюсь, что это поможет вам.

Chrstph SLN
источник