Как совместно использовать один источник библиотеки в нескольких проектах
вопрос как в заголовке. Аналогичный вопрос был задан здесь, и единственным обходным путем в то время было опубликовать проект в локальном репозитории Maven.
эта проблема исправлена (как утверждают некоторые) в Android Studio 0.5.+? В его версии есть заявление, которое говорит "поддержка исходных папок за пределами корневого содержимого модуля". Означает ли это, что мы можем, наконец, импортировать библиотеку из-за пределов проекта папка?
я попробовал файл - > импорт проекта.. но это не работает.
EDIT 2: см. принятый ответ для последнего решения (по состоянию на 0.8.+)
EDIT:
моя структура каталогов проекта имеет только один модуль main
выглядит так:
MyApp
main
build.gradle
src
build.gradle
settings.gradle
каталог проекта библиотеки имеет только один модуль с именем like 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
не удается распознать структуру проекта библиотеки.
4 ответа:
(начиная с версии 2.1+):
Ниже приведены шаги, которые я предпринял, чтобы поделиться источником библиотеки за пределами каталога проекта. Вместо простой библиотеки Java мои коды компилируются как модуль Android, но этот модуль библиотеки не содержится внутри основного проекта. Это нормально для меня, пока нет дубликатов кода, и мне нужно только поддерживать один набор кода библиотеки для всех проектов:
1) Файл - > Новый проект. Дайте имя вашей библиотеке проект (здесь я использую
LibraryProject
). Продолжите оставшиеся шаги, чтобы создать нормальный проект (так как это предназначено в качестве библиотеки, я выбрал "добавить без активности")2) по умолчанию Android Studio создает модуль с именем "приложение" внутри папки проекта. Чтобы предотвратить столкновение имен с фактическим модулем приложения, переименуйте модуль на что-то другое (щелкните правой кнопкой мыши модуль "приложение" на левой панели->рефакторинг - >переименовать).
3) в
build.gradle
внутри модуля библиотеки папка изменить верхнюю строкуapply plugin: 'com.android.application'
до
apply plugin: 'com.android.library'
а затем удалите строку "applicationId" в разделе "defaultConfig". Кроме того, поскольку это библиотека, удалите
xlmns:...
пространство имен и<application ..>
тело из Манифеста.и xml тоже. Это все для библиотечной части. Теперь, чтобы создать / изменить Ваше главное приложение:4) Если это новый проект, сначала создайте новый файл проекта->Новый проект->имя приложения.
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 щелкните правой кнопкой мыши модуль - > рефакторинг - > переименование) на что-то менее запутанное, например как
/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 } }
со следующим (in
build.gradle
библиотеки):buildTypes { release { consumerProguardFiles 'proguard-project.txt' } }
здесь
proguard-project.txt
is файл, содержащий правила proguard для проекта библиотеки.
Да, теперь он работает в 0.5.0. В нем нет дружественного пользовательского интерфейса (проект импорта-это не то, что вы хотите, так как это создает совершенно новый проект; модуль импорта все еще сломан; см. 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 каталог в файловой системе.
настройка настройки.gradle файл вот так:
include ':appmodule', '..:MyPlainJavaLibrary'
и включить зависимость от него в построить.gradle вот так (не забудьте ведущую двоеточие):
dependencies { ... compile project(':..:MyPlainJavaLibrary') }
это работает для меня. В моем средстве просмотра проектов теперь я вижу MyApp и MyPlainJavaLibrary как два каталога модулей корневого уровня в представлении, и я могу сделать java
import
операторы работают через границы модуля и такие.обратите внимание, что в этой настройке по умолчанию этот общий модуль будет иметь только одну выходную папку сборки, которая будет совместно использоваться всеми проектами, использующими его. Это может быть или не быть то, что вы хотите. Если вы хотите иметь другой выходной каталог для каждого проекта, используя общий модуль, вы, вероятно, можете сделать некоторую магию с выходным каталогом в
sourceSet
; если вы хотите помочь с этим, я бы рекомендовал попробовать его самостоятельно и опубликовать вопрос с подробностями о вашей работе, если вы застряли.вы можете иметь только один настройки.gradle файл для каждого проекта, так что это не будет принимать целый другой многомодульный проект Gradle и принести все модули одним махом; вам нужно будет принести их по отдельности. Однако он должен удовлетворять случаю использования модуля в нескольких проектах.
Я хотел сделать что-то подобное для моего проекта Android Wear, где у вас есть
mobile
иwear
модули. В Android Studio 1.5.1 вы можете сделать Файл->Новый->модуль и выбрать библиотеку Android в качестве модуля. Это позволит позаботиться о многих настройках, описанных выше и поставить свою библиотеку внутри ваш существующий проект Android Wear.
в полной мере использовать Android Studio, Я бы рекомендовал изначально создать нормальный android-проект. Затем, в рамках этого проекта, добавьте модуль"
android library
" тип, и (необязательно) a "java library
" (если у вас есть код, который вы хотите использовать, который может быть общим для приложений Android и кода на стороне сервера).используя этот механизм, вам не нужно манипулировать и изменять файлы gradle и манифеста.