Подтвердить что ты не робот

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

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

4b9b3361

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