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

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

В 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, чтобы создать Android конкретные файлы проекта Eclipse?

Является ли это приоритетной функцией Gradle?

- ОБНОВЛЕНИЕ -

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

- ОБНОВЛЕНИЕ -

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

Ответ 1

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

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

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

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

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

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

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

Обновление

В настоящее время существует официальная IDE для Android: Android Studio. Он основан на Intellij, а новая система сборки основана на Gradle.

Ответ 2

Как указано в Issue 57668 командой Android (поднято @arcone)

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

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

Вы не сможете импортировать проект Android gradle в 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>

import-android-gradle-as-general-project

0,2. Поместите 2 Eclipse. "dot" в модули в /OpenSpritz-Android/app/src/main и /OpenSpritz-Android/lib/src/main

add-eclipse-files

.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 в рабочее пространство

results

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

0,4.

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

start

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

Ответ 3

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

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

Ответ 4

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

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

Я закончил тем, что прямо в build.gradle в моем проекте-приложении:

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. Я использую программу "monitor" с Android SDK для просмотра журналов приложений. Я до сих пор не нашел способ отладки без Android Studio.

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

Ответ 5

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

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

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

Ответ 6

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

Подробнее см. https://github.com/greensopinion/gradle-android-eclipse.