Миграция с Eclipse на Android-Studio (gradle)

Я пытаюсь перенести свои приложения на использование gradle, но сталкиваюсь с некоторыми проблемами, включая библиотечные проекты.

Дерево моего проекта таково:

My projects root
- MyLib1
-- res
-- src
-- libs
- MyLib2
-- res
-- src
-- libs
- MyLib3
-- res
-- src
-- libs
- MyAppBase
-- res
-- src
-- libs
- MyApp - full version
-- res
-- src
-- libs
- MyAppFree - free version
-- res
-- src
-- libs

С Eclipse у меня были следующие зависимости

MyAppBase depends on:
-MyLib1
-MyLib2
-MyLib3

MyApp depends on:
-MyAppBase
-MyLib1
-MyLib2
-MyLib3

MyAppFree depends on:
-MyAppBase
-MyLib1
-MyLib2
-MyLib3

Эта организация хорошо работала в Eclipse, но теперь с Android-Studio и gradle у меня проблемы.

У меня есть следующий файл build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.+'
    }
}
apply plugin: 'android'

dependencies {
    //compile project('../MyLib1')  <- error
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 18
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 4
        targetSdkVersion 14
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        // Move the build types to build-types/<type>
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
        // This moves them out of them default location under src/<type>/... which would
        // conflict with src/ being used by the main source set.
        // Adding new build types or product flavors should be accompanied
        // by a similar customization.
        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }
}

Как я могу включить проекты MyLib1, MyLib2, MyLib3 в качестве зависимости, чтобы они были скомпилированы вместе с моим проектом???


person Pedro Rainho    schedule 02.01.2014    source источник


Ответы (3)


В настоящее время все зависимости должны находиться в корневом каталоге проекта, поэтому вам необходимо настроить корневой каталог проекта в каталоге выше MyLib1, MyLib2, < b>MyApp и т. д. Это ограничение будет снято в будущем; вы можете отслеживать его ход на странице https://code.google.com/p/android/issues/detail?id=56367. Ваши библиотеки будут библиотечными модулями в этом корне, а ваши приложения будут модулями приложений Android. Каждый модуль имеет свой отдельный файл build.gradle и может быть скомпилирован в JAR (обычная библиотека Java), AAR (библиотека Android, включающая код и ресурсы) или APK (приложение Android).

Я не уверен, являются ли MyAppFree и MyApp отдельными проектами Eclipse; если они есть, в Android Studio и Gradle я бы посоветовал вам объединить их в один модуль, который имеет бесплатные и платные варианты. Варианты сборки разработаны специально для такого варианта использования. См. http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors для получения дополнительной информации.

ОБНОВЛЕНИЕ

В комментариях ниже видно, что у вас очень большое количество библиотек. В том, что вы, вероятно, не хотите постоянно собирать их все из исходного кода или управлять проектом, в котором есть десятки модулей. В этом случае более целесообразно хранить модули, которые не меняются очень часто, в виде отдельных проектов. Эти проекты могут компилироваться в JAR или AAR, что возвращает нас к вашему первоначальному вопросу о том, как заставить их работать в Android Studio.

Вы можете скопировать файлы JAR в каталог libs в корне вашего проекта и связать их. Я считаю, что есть проблемы с попыткой сделать то же самое с библиотеками AAR; см. https://code.google.com/p/android/issues/detail?id=63908, чтобы отслеживать ход выполнения. Если вы не хотите поддерживать несколько копий библиотек, вы можете либо попробовать создать символические ссылки на каталоги (я думаю, это сработает), либо вы можете настроить локальный репозиторий Maven и иметь сторонние проекты. публиковать свои артефакты к этому. У меня нет под рукой ссылок с подробными инструкциями по этому поводу; вы можете начать с http://www.gradle.org/docs/current/userguide/publishing_maven.html.

Для настройки локального репозитория Maven потребуется довольно много времени, но как только это будет сделано, вы, вероятно, обнаружите, что оно решает вашу проблему довольно чисто, и если вы находитесь в магазине с несколькими разработчиками и хотите организовать -широкий репозиторий Maven, возможно, с артефактами, которые публикуются на нем с сервера сборки, вы можете настроить это.

person Scott Barta    schedule 02.01.2014
comment
Да, MyAppFree и MyApp — это отдельные проекты, и их можно считать разновидностями. Итак, из того, что я читаю, gradle не подходит для моего случая. Потому что мои библиотеки являются общими для всех моих приложений. И я не могу иметь копию всех библиотек во всех приложениях только потому, что они должны быть в одном корне. - person Pedro Rainho; 02.01.2014
comment
Если вы сделаете один большой проект в корне, в котором все библиотеки и приложения будут модулями, он будет работать хорошо. Я думаю, что это имеет смысл в вашем случае. У вас просто не может быть отдельных проектов с зависимостями, которые находятся за пределами корня проекта. - person Scott Barta; 02.01.2014
comment
Всего у меня 45 проектов между библиотеками и приложениями. Вы говорите, что я создаю большой проект, чтобы загрузить их все??? вы учитывали объем памяти, который мне нужен для Android-студии, чтобы все проекты были открыты одновременно? - person Pedro Rainho; 02.01.2014
comment
Хм, 45 проектов звучит суперсложно. В таком сценарии вы вряд ли захотите все время собирать все эти зависимости из исходного кода, но вместо этого, вероятно, захотите скомпилировать некоторые из них в файлы jar или aar, которые вы включаете. Разочаровывающее ограничение, с которым вы столкнетесь, заключается в том, что мы пока не можем получить исходные каталоги для библиотек jar через Gradle, что вам там навредит. Что касается памяти, Android Studio требовательна к памяти, но решить эту проблему не так-то просто. Я не хочу показаться легкомысленным, но память дешевая — 16 ГБ меньше 150 долларов. Ваша продуктивность гораздо ценнее. - person Scott Barta; 03.01.2014
comment
Моя проблема описана другим пользователем на этой странице: code.google.com /p/android/issues/detail?id=62177. Я надеюсь, что они скоро добавят поддержку. Сейчас я попробую проекты IntelliJ вместо Gradle - person Pedro Rainho; 03.01.2014

Возможно, зайдите в меню «Структура проекта» (Ctrl+Shift+Alt+S) и добавьте нужные зависимости к нужным модулям.

person prototyp3PT    schedule 02.01.2014

В Android Studio структура вашего проекта должна выглядеть так

YourProjectName

-libraries
 --myLib1
 --myLib2
 --myLib3

-MyAppBase
 --build.gradle( It will have dependency of all three libraries like mentioned in last)
 --src
 --res

-MyApp

 --src
   ---main
      ----java
      ----res
      ----Manifest
   ---full
      ----java
      ----res
      ----Manifest
   ---free
      ----java
      ----res
      ----Manifest


 --build.gradle ( It will have dependency of only MyAppBase because your MyAppBase is already having dependency of all of your three libraries so no need to include them again)

Теперь вы можете иметь свои варианты сборки в этом последнем упомянутом файле build.gradle, например

 buildTypes {

     debug {
         runProguard false
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'

     }

     release{
         runProguard false
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
         signingConfig signingConfigs.prodSigning // write your signingConfig

      }
   }

 productFlavors{

     full {
         //required configuration for full version

     }

     free {
          //required configuration for full version

     }

 }

Обратите внимание, что имя вашего каталога и имя продукта в файле build.gradle должны совпадать, поэтому во время компиляции (на вкладке «Встроенный вариант», доступной на левой панели или в командной строке) он автоматически возьмет код / ​​res / манифест из соответствующую папку.

Приведенная выше конфигурация даст четыре типа следующих вариантов сборки.

debugFull,debugFree,releaseFull,releaseFree

Вы можете добавить зависимость в build.gradle MyAppBase, например

dependencies {
    compile project(':libraries:myLib1')
    compile project(':libraries:myLib2')
    compile project(':libraries:myLib3')
}

И в файле build.gradle модуля MyApp, подобном этому

dependencies {
    compile project(':MyAppBase')      
}
person pyus13    schedule 02.01.2014
comment
Я ответил Скотту Барте, что не могу иметь ни одного проекта со всеми моими 45 библиотеками и приложениями. То, что я хочу, это просто открыть проект приложения с его зависимостями. - person Pedro Rainho; 03.01.2014
comment
@ pyus13, вы должны использовать ароматизаторы для таких вещей, как полный / бесплатный, а не для типов сборки. - person Scott Barta; 03.01.2014
comment
@ScottBarta спасибо, что поправили меня, я думал о вкусах, но писал о типах сборки. - person pyus13; 03.01.2014