Как использовать один источник библиотеки для нескольких проектов

Вопрос как в заголовке. Здесь был задан аналогичный вопрос, и единственным обходным решением было время публикации проекта в локальном репозитории Maven.

Эта проблема исправлена ​​(как утверждают некоторые) в Android Studio 0.5. +? В примечании к выпуску есть утверждение, в котором говорится: «Поддержка исходных папок вне корня содержимого модуля». Означает ли это, что мы можем, наконец, импортировать библиотеку извне папки проекта?

Я попробовал File-> Import Project .. но он не работает.

EDIT 2: см. Принятый ответ для последнего решения (с 0,8 +).

РЕДАКТИРОВАТЬ:

В моей структуре каталога проектов есть только один модуль, который выглядит так:

 MyApp main build.gradle src build.gradle settings.gradle 

В каталоге проекта библиотеки есть только один модуль с именем lib (все они автоматически генерируются при создании нового проекта библиотеки)

 MyLibrary lib build.gradle src build.gradle settings.gradle 

Следующая строка добавляется в MyApp/settings.gradle :

 include ':main', '..:MyLibrary' 

В MyApp/main/build.gradle :

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

В результате возникает следующая ошибка:

 FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':main'. > Configuration with name 'default' not found. 

В качестве побочного примечания, проект библиотеки MyLibrary сам может компилироваться без ошибок. Проблема, похоже, в том, что settings.gradle не может распознать структуру проекта библиотеки.

Solutions Collecting From Web of "Как использовать один источник библиотеки для нескольких проектов"

(Начиная с версии 2.1+):

Ниже приведены шаги, которые я предпринял для совместного использования источника библиотеки вне каталога проекта. Вместо простой библиотеки Java мои коды скомпилированы как модуль Android, но этот библиотечный модуль не содержится внутри основного проекта. Все в порядке со мной, пока нет дубликатов кода, и мне нужно только поддерживать один набор библиотечных кодов для всех проектов:

1) Файл-> новый проект. Дайте имя проекту вашей библиотеки (здесь я использую LibraryProject ). Продолжайте выполнение оставшихся шагов для создания нормального проекта (так как это предназначено как библиотека, я выбрал «add no activity»)

2) По умолчанию студия Android создает в папке проекта модуль с именем «приложение». Чтобы предотвратить столкновение имен с фактическим модулем приложения, переименуйте модуль на что-то еще (щелкните правой кнопкой мыши «приложение» на левой панели -> Refactor-> Rename).

3) В build.gradle внутри папки вашего библиотечного модуля измените верхнюю строку

 apply plugin: 'com.android.application' 

в

 apply plugin: 'com.android.library' 

А затем удалите строку «applicationId» под «defaultConfig». Кроме того, поскольку это библиотека, удалите пространство имен xlmns:... и тело <application ..> из Manifest.xml. Это все для части библиотеки. Теперь, чтобы создать / изменить основное приложение:

4) Если это новый проект, сначала создайте новый проект File-> new Project-> ApplicationName.

5) Откройте settings.gradle (в каждом проекте должен быть только один такой файл) и включить следующую строку (обратите внимание на недостающую ведущую полуточку в библиотечном модуле):

 include ':app', '..:LibraryProject:yourLibraryModule' 

6) Затем перейдите в «Файл-> Структура проекта».

7) Под вкладкой «Зависимости» нажмите зеленую кнопку «+» справа. Выберите «Зависимость модуля». Выберите свой библиотечный модуль и нажмите «ОК».

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


АЛЬТЕРНАТИВНЫЙ МЕТОД Если по какой-либо причине все еще есть проблемы с вышеуказанным методом, вы можете попробовать следующее (предлагаемое здесь ):

1) Повторите шаги с 1 по 4 выше. По умолчанию основной и внешний (библиотечный) проект выглядит примерно так:

  /MainProject + build.gradle + settings.gradle + app/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + app/ + build.gradle + src/ 

2) Как обычно, реорганизовать имя модуля (в студии android studio щелкните правой кнопкой мыши module-> refactor-> rename) на что-то менее запутанное, например

  /MainProject + build.gradle + settings.gradle + MainModule/ + build.gradle + src/ /LibraryProject + build.gradle + settings.gradle + LibraryModule/ + build.gradle + src/ 

3) Измените settings.gradle в MainProject :

 include ':LibraryModule', ':app' project(':LibraryModule').projectDir = new File(settingsDir, '../LibraryProject/LibraryModule') 

Синхронизируйте проект, и все готово.


Примечание о Proguard

В настоящее время вы не должны использовать proguard для проектов / модулей внешней библиотеки. Вместо этого вы заменяете следующий (оригинальный ответ здесь )

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

build.gradle следующим (в build.gradle библиотеки):

 buildTypes { release { consumerProguardFiles 'proguard-project.txt' } } 

Где proguard-project.txt – это файл, содержащий правила proguard для вашего проекта библиотеки.

Да, теперь он работает в 0.5.0. У него нет дружественного пользовательского интерфейса (Import Project – это не то, что вы хотите, поскольку это создает совершенно новый проект, модуль импорта по-прежнему не работает, см. https://code.google.com/p/android/issues/ Detail? Id = 62122 ), но вы можете настроить свои файлы сборки, чтобы они работали.

Допустим, у вас есть структура каталогов, которая выглядит так:

 MyApp appmodule build.gradle src main java build.gradle settings.gradle MyPlainJavaLibrary build.gradle src java 

Обратите внимание, что MyPlainJavaLibrary не находится под каталогом MyApp в файловой системе.

Настройте файл settings.gradle следующим образом:

 include ':appmodule', '..:MyPlainJavaLibrary' 

И включите в него зависимость в build.gradle, как это (не забудьте о главном двоеточии):

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

Это работает для меня. В моем средстве просмотра Project теперь я вижу MyApp и MyPlainJavaLibrary как два каталога модулей на уровне корня в представлении, и я могу заставить инструкции import java работать через границы модулей и т. Д.

Обратите внимание, что в этой настройке по умолчанию этот общий модуль будет иметь только одну выходную папку для сборки, которая будет использоваться для всех проектов, использующих ее. Это может быть или не быть тем, что вы хотите. Если вы хотите иметь другой выходной каталог для каждого проекта с использованием совместно используемого модуля, вы, вероятно, можете сделать некоторую магию с выходным каталогом в sourceSet ; Если вы хотите помочь в этом, я бы рекомендовал попробовать его самостоятельно и опубликовать вопрос с подробной информацией о вашей работе, если вы застряли.

У вас может быть только один файл settings.gradle для каждого проекта, так что это не займет целый другой многомодульный проект Gradle и не включит все модули одним махом; Вам нужно будет принести их индивидуально. Однако он должен удовлетворять варианту использования модуля в нескольких проектах.

Я хотел сделать что-то подобное для моего проекта Android Wear, где у вас есть mobile и wear модули. В Android Studio 1.5.1 вы можете сделать File-> New-> Module и выбрать Android-библиотеку в качестве своего модуля. Это позаботится о многих из описанных выше настроек и поместит вашу библиотеку в существующий проект Android Wear.

Чтобы в полной мере использовать Android Studio , я бы порекомендовал сначала создать обычный Android-проект. Затем в рамках этого проекта добавьте тип android library « android library » модуля и (опционально) « java library » (если у вас есть код, который вы хотите использовать, который может распространяться на приложения для Android и на серверный код).

Используя этот механизм, вам не нужно манипулировать и изменять файлы gradle и manifest.