如何使用 Gradle 为 Android 项目生成 Eclipse 和 Intellij 项目文件
Posted
技术标签:
【中文标题】如何使用 Gradle 为 Android 项目生成 Eclipse 和 Intellij 项目文件【英文标题】:How to use Gradle to generate Eclipse and Intellij project files for Android projects 【发布时间】:2013-07-02 11:47:26 【问题描述】:是否可以使用 Gradle 为 android 项目生成 Eclipse 和 Intellij 项目文件?
在 maven 中,我们会使用 mvn eclipse:eclipse
,而在 PlayFramework 中,我们会使用 play eclipsify
。 Gradle 对 Android 项目有这个功能吗?
我已经安装了 Gradle (1.6) 和 Android SDK Manager (22.0.1) 解释here
这是我的 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 工具团队issue #57668。请给它加星标,让他们优先考虑这个问题:)
-- 更新--
Android 工具团队似乎并未调查此问题。所以现在我已经转换为Android Studio,在那里我可以通过 IDE 导入我的 gradle 项目和依赖项。
【问题讨论】:
我有理由确定你不能(很容易)。我认为我们的目标是让 Eclipse ADT 直接了解 build.gradle,但恐怕这还是在未来。 您知道为什么这不是优先功能吗?活动更好,您知道该联系谁来启用此功能吗? 除了this list 上的内容,我对他们的优先事项一无所知。也就是说,您最好的选择是去adt-dev
mailing list 并在那里询问(不过,请先搜索!)。
可以自定义gradle eclipse插件,下面查看我的回答。
【参考方案1】:
Gradle 本身是一个通用的构建工具,它不是专门为 Android 创建的。
所有功能均使用插件启用。传统上,构建插件不会生成项目结构。这是项目特定工具的工作。 Gradle 的 Android 插件遵循这一点。
问题在于 SDK 中当前的android
工具会生成旧类型的项目结构(ant builds)。新的项目结构只能通过 Android Studio 生成。
在 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 方式来创建archetypes
。我所追求的是 IDE 特定项目文件的生成,这使我能够在我喜欢的 IDE 中作为项目导入。在 maven 中我们会使用mvn eclipse:eclipse
,而在 Play Framework 中我们会使用play eclipsify
。我为开始讨论提供了 +1 ;)
@arcone 啊.. 我不认为还有这样的插件。 eclipse 不支持导入 Gradle 项目吗?
我已经为eclipse安装了Gradle插件,但是好像没有用。我应该补充一点,我没有尝试过这么多,因为我不想要那种额外的复杂性。我当然希望有一个可以处理 android 项目的gradle eclipse
命令:)【参考方案2】:
Gradle 插件 'com.android.application' 和 'eclipse' 的组合存在四个问题:首先,配置类路径没有添加到 Eclipse 的类路径中,但这很容易修复。其次,必须对 .AAR 依赖项采取一些措施。这有点棘手。第三,我们需要包含 R.java 等生成的源代码。最后,我们需要包含 Android.jar 本身。
我能够破解一个 gradle 配置,该配置将从 Android Studio build.config
为 Eclipse 生成正确的 .classpath
文件。效果让我的 CPU 粉丝非常满意,一直在 Android Studio 上运行。 Eclipse 将生成的项目视为功能齐全的 Java 项目,但仅此而已。
我最终将以下内容直接放入我的 app-project 的 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
下的文件。我使用带有 Android SDK 的“监视器”程序来查看应用程序日志。到目前为止,我还没有找到任何没有 Android Studio 的调试方法。
我想念 Android Studio 的唯一功能是调试(但谁有时间解决错误!)和可视化编辑资源。
【讨论】:
这对我来说非常有效,以至于我创建了一个 Gradle 插件来执行此操作。稍作修改以使用新的 Android 构建系统。 github.com/greensopinion/gradle-android-eclipse 这行得通。我需要一些帮助来将此项目转换为 Eclipse 库。对此有什么想法吗?【参考方案3】:Android 团队在Issue 57668 中回答(由@arcone 提出)
项目成员 #2 x...@android.com
eclipse插件与android插件不兼容。
您将无法使用 Eclipse 中的默认 Gradle 支持将 Android gradle 项目导入 Eclipse。
要使其在 Eclipse 中工作,我们必须更改 Eclipse 的 Gradle 插件,就像我们在 IntelliJ 中修改 Gradle 支持一样
Android 团队正在开发 IntelliJ 的 gradle 插件,Eclipse 的 gradle 插件也需要更新。
Eclipse 现在可以做到的是
.1。将项目作为通用项目导入
.project
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>OpenSpritz-Android</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
</natures>
</projectDescription>
.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>
.3。作为现有 Android 代码导入工作区
然后您可以以熟悉的方式浏览代码,但是 即使在那之后,您也无法使用 Eclipse ADT 运行。
.4.
现在您可以使用gradle
CLI 或Nodeclipse/Enide Gradle for Eclipse 运行构建和任务
(marketplace)
在https://github.com/Nodeclipse/nodeclipse-1/issues/148讨论
【讨论】:
【参考方案4】:以下对我有用
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
【讨论】:
【参考方案5】:我创建了一个新的 Gradle 插件,它根据 Johannes Brodwall 提供的关于此堆栈溢出的答案生成适当的 Eclipse .project
和 .classpath
文件。
详情请见https://github.com/greensopinion/gradle-android-eclipse。
【讨论】:
谢谢。运行良好,使用 Eclipse 的 Buildship 插件,我可以在build.gradle
上运行 Android Gradle 任务。【参考方案6】:
也许我遗漏了一些非常明显的东西,但eclipse plugin 不是您想要的吗?这会生成一个 .project 文件和一个 .classpath 文件,并在后续运行时根据需要更新这些文件。
还有一个IDEA plugin,虽然我没用过这个也说不上来。
希望对您有所帮助。
【讨论】:
据我了解,gradle eclipse插件只生成java项目文件而不是Android :-( 啊,那显然是我遗漏的部分。不过可能是一个很好的起点。以上是关于如何使用 Gradle 为 Android 项目生成 Eclipse 和 Intellij 项目文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Android Studio 和 gradle 构建一个 android 库?
如何在 android 库 gradle 项目中包含依赖项?
如何在 Android Studio 中使用最新的 gradle 版本