Как использовать Gradle для создания файлов проектов Eclipse и Intellij для проектов Android

Можно ли с помощью Gradle генерировать файлы проектов Eclipse и Intellij для проектов Android?

В Maven мы бы сделали mvn eclipse:eclipse и в PlayFramework мы бы сделали play eclipsify, Есть ли у Gradle эта функция для проектов Android?

Я установил Gradle (1.6) и Android SDK Manager (22.0.1), описанные здесь

Это мой файл build.gradle:

buildscript {
    repositories {
      mavenCentral()
    }
    dependencies {
      classpath 'com.android.tools.build:gradle:0.5.0'
    }
}

apply plugin: 'android'
apply plugin: 'eclipse'

sourceCompatibility = 1.7
version = '1.0.2'

repositories {
    mavenCentral()
}

dependencies {
  compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    buildToolsVersion "17" 
    compileSdkVersion 8
    defaultConfig {
        versionCode 1
        versionName "1.0"
        minSdkVersion 7
        targetSdkVersion 8
    }
    sourceSets {
        main {
              manifest.srcFile 'AndroidManifest.xml'
              java.srcDirs = ['src']
              resources.srcDirs = ['src']
              aidl.srcDirs = ['src']
              renderscript.srcDirs = ['src']
              res.srcDirs = ['res']
              assets.srcDirs = ['assets']
        }
        instrumentTest.setRoot('tests')
    }
}

И тогда я запускаю команду:

gradle clean build cleanEclipse eclipse

Он прекрасно собирается, но когда я импортирую проект в Eclipse, он выглядит как обычный проект Java.

Кто-нибудь знает, как заставить Gradle создавать файлы проекта Eclipse для Android?

Это приоритетная функция Gradle?

-- ОБНОВИТЬ --

Я верю, что это проблема. Итак, я опубликовал это в выпуске команды Android Tools № 57668. Пожалуйста, отметьте это для них, чтобы расставить приоритеты в вопросе:)

-- ОБНОВИТЬ --

Не похоже, что команда Android Tools изучает эту проблему. Итак, сейчас я перешел на Android Studio, где я могу импортировать свой проект gradle с зависимостями через IDE.

6 ответов

Сам Gradle - это универсальный инструмент для сборки, он не создан специально для Android.

Все функции включены с помощью плагинов. Традиционно, подключаемые модули сборки не генерируют структуру проекта. Это работа инструментов, специфичных для проекта. Плагин Android для Gradle следует за этим.

Проблема в том, что ток android Инструмент в SDK генерирует старый тип структуры проекта (Ant builds). Новая структура проекта может быть сгенерирована только через Android Studio.

Есть понятие archetypes в таких инструментах, как Maven, которые позволяют использовать шаблоны проектов. Gradle пока не поддерживает это (запросы были сделаны для этой функции).

Обратитесь к этой теме: http://issues.gradle.org/browse/GRADLE-1289, некоторые пользователи предоставили сценарии для создания структуры.

Выполняется функция инициализации сборки: https://github.com/gradle/gradle/blob/master/design-docs/build-initialisation.md

Надеюсь, кто-то может написать скрипт для этого, обратитесь к этому руководству для новой структуры проекта: http://tools.android.com/tech-docs/new-build-system/user-guide

Обновить

Сейчас есть официальная Android IDE: Android Studio. Он основан на Intellij, а новая система сборки основана на Gradle.

Существует четыре проблемы с комбинацией плагинов Gradle 'com.android.application' и 'eclipse': во-первых, пути к классам конфигурации не добавляются в путь к классам Eclipse, но это легко исправить. Во-вторых, что-то должно быть сделано с.AAR-зависимостями. Это было немного сложнее. В-третьих, нам нужно включить сгенерированные источники для таких вещей, как R.java. Наконец, нам нужно включить сам Android.jar.

Я был в состоянии взломать конфигурацию Gradle, которая будет генерировать правильную .classpath файлы для Eclipse из Android Studio build.config, Эффекты были очень приятны для моего вентилятора процессора, который постоянно работал с Android Studio. Eclipse рассматривает полученный проект как полностью функциональный проект Java, но только это.

В итоге я поместил следующее прямо в build.gradle в моем app-проекте:

apply plugin: 'eclipse'
eclipse {
    pathVariables 'GRADLE_HOME': gradle.gradleUserHomeDir, "ANDROID_HOME": android.sdkDirectory 
    classpath {
        plusConfigurations += [ configurations.compile, configurations.testCompile ]

        file {
            beforeMerged { classpath ->
                classpath.entries.add(new org.gradle.plugins.ide.eclipse.model.SourceFolder("src/main/java", "bin"))
                // Hardcoded to use debug configuration
                classpath.entries.add(new org.gradle.plugins.ide.eclipse.model.SourceFolder("build/generated/source/r/debug", "bin"))
                classpath.entries.add(new org.gradle.plugins.ide.eclipse.model.SourceFolder("build/generated/source/buildConfig/debug", "bin"))
            }

            whenMerged { classpath ->
                def aars = []
                classpath.entries.each { dep ->
                    if (dep.path.toString().endsWith(".aar")) {
                        def explodedDir = new File(projectDir, "build/intermediates/exploded-aar/" + dep.moduleVersion.group + "/" + dep.moduleVersion.name + "/" + dep.moduleVersion.version + "/jars/")
                        if (explodedDir.exists()) {
                            explodedDir.eachFileRecurse(groovy.io.FileType.FILES) {
                                if (it.getName().endsWith("jar")) {
                                    def aarJar = new org.gradle.plugins.ide.eclipse.model.Library(fileReferenceFactory.fromFile(it))
                                    aarJar.sourcePath = dep.sourcePath
                                    aars.add(aarJar)
                                }
                            }
                        } else {
                            println "Warning: Missing " + explodedDir
                        }
                    }
                }
                classpath.entries.removeAll { it.path.endsWith(".aar") }
                classpath.entries.addAll(aars)

                def androidJar = new org.gradle.plugins.ide.eclipse.model.Variable(
                    fileReferenceFactory.fromPath("ANDROID_HOME/platforms/" + android.compileSdkVersion + "/android.jar"))
                androidJar.sourcePath = fileReferenceFactory.fromPath("ANDROID_HOME/sources/" + android.compileSdkVersion) 
                classpath.entries.add(androidJar)
            }
        }
    }
}

// We need build/generated/source/{r,buildConfig}/debug to be present before generating classpath
//  This also ensures that AARs are exploded 
eclipseClasspath.dependsOn "generateDebugSources"


// Bonus: start the app directly on the device with "gradle startDebug"
task startDebug(dependsOn: "installDebug") << {
    exec {
        executable = new File(android.sdkDirectory, 'platform-tools/adb')
        args = ['shell', 'am', 'start', '-n', android.defaultConfig.applicationId + '/.MainActivity']
    }
}

Бежать gradle eclipse и у вас будет Eclipse-проект, который можно импортировать и скомпилировать. Однако этот проект действует как обычный Java-проект. Чтобы собрать apk, я должен вернуться в командную строку gradle и выполнить gradle installDebug, gradle processDebugResources собирает изменения в файлах Android XML и восстанавливает файлы в build/generated/source, Я использую программу "монитор" с Android SDK для просмотра журналов приложений. Я до сих пор не нашел способа отладки без Android Studio.

Единственные функции, которые мне не хватает в Android Studio, - это отладка (но у кого есть время на ошибки!) И визуальное редактирование ресурсов.

Как ответили в выпуске 57668 команда Android (поднято @arcone)

Участник проекта № 2 x...@android.com

Плагин eclipse не совместим с плагином Android.

Вы не сможете импортировать проект Gradle для Android в Eclipse, используя поддержку Gradle по умолчанию в Eclipse.

Чтобы заставить его работать в Eclipse, нам нужно будет изменить плагин Gradle для Eclipse, так же, как мы модифицируем поддержку Gradle в IntelliJ.

То есть команда Android работает над плагином Gradle для IntelliJ, и плагин Gradle для Eclipse также нуждается в обновлении.

Что теперь возможно с Eclipse

0,1. импортировать проект как общий проект

.project

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>OpenSpritz-Android</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
    </buildSpec>
    <natures>
    </natures>
</projectDescription>

импорт-андроид-Gradle-в-общий-проект

0,2. Поставь 2 Затмения. "расставить" файлы на модули в /OpenSpritz-Android/app/src/main а также /OpenSpritz-Android/lib/src/main

надстройка затмения-файлы

.project

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
    <name>OpenSpritz-Android-app</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
        <buildCommand>
            <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>org.eclipse.jdt.core.javabuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
        <buildCommand>
            <name>com.android.ide.eclipse.adt.ApkBuilder</name>
            <arguments>
            </arguments>
        </buildCommand>
    </buildSpec>
    <natures>
        <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
        <nature>org.eclipse.jdt.core.javanature</nature>
    </natures>
</projectDescription>

.classpath

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="java"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

0,3. Импортировать как существующий код Android в рабочую область

Результаты

затем вы можете просмотреть код знакомым способом, но даже после этого вы не сможете работать с Eclipse ADT.

+0,4.

Теперь вы можете запустить сборку и задачи с gradle CLI или Nodeclipse/Enide Gradle для Eclipse( торговая площадка)

Начните

обсудить на https://github.com/Nodeclipse/nodeclipse-1/issues/148

Я создал новый плагин Gradle, который генерирует соответствующий Eclipse .project а также .classpath файлы, основанные на ответе Йоханнеса Бродволла об этом переполнении стека.

См. https://github.com/greensopinion/gradle-android-eclipse для получения подробной информации.

Следующее сработало для меня

eclipse.classpath.plusConfigurations += configurations.compile

eclipse.classpath.file {
    beforeMerged { classpath ->
    classpath.entries.removeAll() { c -> 
        c.kind == 'src'
    }
}

withXml {
    def node = it.asNode()

    node.appendNode('classpathentry kind="src" path="src/main/java"')
    node.appendNode('classpathentry kind="src" path="src/debug/java"')
    node.appendNode('classpathentry kind="src" path="gen"')

    node.children().removeAll() { c ->
        def path = c.attribute('path')
        path != null && (
                path.contains('/com.android.support/support-v4')
                )
    }
  }
}

eclipse.project {
   name = 'AndroidGradleBasic'

   natures 'com.android.ide.eclipse.adt.AndroidNature'
   buildCommand 'com.android.ide.eclipse.adt.ResourceManagerBuilder'
   buildCommand 'com.android.ide.eclipse.adt.PreCompilerBuilder'
   buildCommand 'com.android.ide.eclipse.adt.ApkBuilder'
}

Источник - http://blog.gouline.net/2013/11/02/new-build-system-for-android-with-eclipse/

Образец - https://github.com/krishnaraj/oneclipboard

Может быть, я упускаю что-то очень очевидное, но разве вы не ищете плагин Eclipse? Это создает файл.project, а также файл.classpath и обновляет их по мере необходимости при последующем запуске.

Существует также плагин IDEA, хотя я не использовал его и не могу с ним разговаривать.

Надеюсь, это поможет.

Другие вопросы по тегам