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


вопрос как в заголовке. Аналогичный вопрос был задан здесь, и единственным обходным путем в то время было опубликовать проект в локальном репозитории 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 51

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 и манифеста.