Как поделиться одним источником библиотеки в нескольких проектах
Вопрос как в заголовке. Аналогичный вопрос был задан здесь, и единственным обходным решением было время публикации проекта в локальном репозитории Maven.
Является ли эта проблема исправленной (как утверждают некоторые) в Android Studio 0.5. +? В примечании к выпуску есть утверждение, в котором говорится: "Поддержка исходных папок вне корня содержимого модуля" . Означает ли это, что мы можем, наконец, импортировать библиотеку извне папки проекта?
Я попробовал File- > Import Project.. но он не работает.
РЕДАКТИРОВАТЬ 2: см. принятый ответ для последнего решения (с 0.8. +)
EDIT:
В моей структуре каталога проектов есть только один модуль main
, который выглядит как
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
не может распознать структуру проекта библиотеки.
Ответы
Ответ 1
(начиная с версии 2.1 +):
Ниже приведены шаги, которые я предпринял для совместного использования источника библиотеки вне каталога проекта. Вместо простой библиотеки Java мои коды скомпилированы как модуль Android, но этот библиотечный модуль не содержится внутри основного проекта. Это нормально со мной, пока нет дубликатов кода, и мне нужно только поддерживать один набор библиотечных кодов для всех проектов:
1) Файл- > новый проект. Дайте имя проекту библиотеки (здесь я использую LibraryProject
). Продолжайте выполнение оставшихся шагов для создания нормального проекта (так как это предназначено как библиотека, я выбрал "не добавлять активность" )
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 для проектов/модулей внешней библиотеки. Вместо этого вы заменяете следующий (оригинальный ответ здесь)
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
debug {
minifyEnabled false
}
}
со следующим (в build.gradle
библиотеки):
buildTypes {
release {
consumerProguardFiles 'proguard-project.txt'
}
}
где proguard-project.txt
- это файл, содержащий правила proguard для вашего проекта библиотеки.
Ответ 2
Да, теперь он работает в 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 как два каталога модулей на уровне корня в представлении, и я могу заставить инструкции java import
работать через границы модулей и т.д.
Обратите внимание, что в этой настройке по умолчанию этот общий модуль будет иметь только одну выходную папку сборки, которая будет использоваться для всех проектов, использующих ее. Это может быть или не быть тем, что вы хотите. Если вы хотите иметь другой выходной каталог для каждого проекта с использованием общего модуля, вы, вероятно, можете сделать магию с выходным каталогом в sourceSet
; если вы хотите помочь с этим, я бы рекомендовал попробовать его самостоятельно и опубликовать вопрос с подробной информацией о вашей работе, если вы застряли.
У вас может быть только один файл settings.gradle для каждого проекта, так что это не займет целый другой проект с несколькими модулями Gradle и не приведет все модули одним махом; вам нужно будет привести их в индивидуальном порядке. Однако он должен удовлетворять варианту использования модуля в нескольких проектах.
Ответ 3
Я хотел сделать что-то похожее для моего проекта Android Wear, где у вас есть модули mobile
и wear
. В Android Studio 1.5.1 вы можете сделать File- > New- > Module и выбрать Android-библиотеку в качестве своего модуля. Это позаботится о многих из описанных выше настроек и поместит вашу библиотеку внутри в существующий проект Android Wear.
Ответ 4
Чтобы полностью использовать Android Studio, я бы рекомендовал сначала создать обычный проект Android. Затем в рамках этого проекта добавьте тип модуля "android library
" и (необязательно) "java library
" (если у вас есть код, который вы хотите использовать, это может быть распространено для приложений Android и кода на стороне сервера).
Используя этот механизм, вам не нужно манипулировать и изменять файлы gradle и манифеста.