145

我正在尝试从 Eclipse 迁移一个项目,但我没有尝试过任何工作。在 Eclipse 中,我有 3 个项目(2 个 android 应用程序项目和 1 个 android 库项目)。2 个应用程序项目依赖于库项目。当我进行 gradle 导出时,我得到了 3 个不起作用的项目。我对重组项目持开放态度,但还没有找到任何关于如何做到这一点的文档。

有没有办法让 Eclipse 导出的 3 个项目一起工作?我是否更好地重组事物,如果是这样,应该如何做的文档?

更新

我已将整个项目上传到 GitHub https://github.com/respectTheCode/android-studio-library-example

更新 1

根据 Padma Kumar 的建议,这是我尝试过的。

  1. 创建一个名为的新项目MyApp
  2. 单击File > New Module,选择Android Library并命名它MyLib
  3. 点击Build > Make Project

构建失败并出现此错误

Module "MyLib" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 1 error and 0 warnings in 19 sec
1 error
0 warnings
/.../MyApp/MyLib/build/bundles/debug/AndroidManifest.xml
Gradle: <manifest> does not have package attribute.

然后我在清单中添加了一个package属性

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mylib" >

构建后我收到此错误

Module "MyApp" was fully rebuilt due to project configuration/dependencies changes
Compilation completed with 2 errors and 0 warnings in 13 sec
2 errors
0 warnings
/.../MyApp/MyLib/src/main/java/com/example/mylib/MainActivity.java
Gradle: package R does not exist
Gradle: package R does not exist

添加依赖项似乎对错误没有任何影响。从上面继续

  1. 点击File > Project Structure > Modules > MyApp-MyApp
  2. 切换到Dependencies选项卡
  3. 点击+ > Module Dependency并选择MyLib
  4. 单击ApplyOK
  5. 点击Build > Make Project

更新 2

根据 Ethan 的建议,这是我们得到的

2 子项目build.gradle似乎具有所有正确的部分,唯一的区别是下面的插件行是MyApp/build.gradle.

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 7
        targetSdkVersion 16
    }
}

根项目build.gradle是空的,所以我像这样添加了两个项目

dependencies {
    compile project(":MyLib")
    compile project(":MyApp")
}

我现在在构建时收到此错误

Gradle:
FAILURE: Build failed with an exception.
* Where:
Build file '/Users/kevin/GitHub/AppPress/MyApp/build.gradle' line: 2
* What went wrong:
A problem occurred evaluating root project 'MyApp'.
> Could not find method compile() for arguments [project ':MyLib'] on root project 'MyApp'.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

更新 3

非常感谢 Ethan 解决了这个问题。

  1. 添加compile project(':SubProjects:MyLib')MyLib/build.gradle
  2. compile files('libs/android-support-v4.jar')_MyLib/build.gradle
  3. 关闭项目并从 gradle 导入根项目

更新 4

从 0.1.2 开始,您现在可以包含compile "com.android.support:support-v4:13.0.0"而不是compile files('libs/android-support-v4.jar'). 由于它现在来自 mavin,因此您可以将其包含在多个项目中而不会出现问题。

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.4.2'
    }
}

apply plugin: 'android'

dependencies {
    compile "com.android.support:support-v4:13.0.0"

    compile project(':SubProjects:MyLib')
}

更新 5

从 0.1.3 开始,工具栏中现在有一个“同步项目”按钮。您可以单击它而不是在对文件进行更改后重新导入您的项目.gradle

4

4 回答 4

117

注意:这个答案是一个纯粹的 Gradle 答案,我经常在 IntelliJ 中使用它,但我不知道如何与 Android Studio 集成。我坚信自己会发生什么,所以这就是我使用 Gradle 和 Android 的方式。

TL;DR完整示例 - https://github.com/ethankhall/driving-time-tracker/

免责声明:这是我正在/正在从事的项目。

Gradle 有一个定义的结构(您可以更改,底部的链接告诉您如何更改),如果您曾经使用过它,它与 Maven 非常相似。

Project Root
+-- src
|   +-- main (your project)
|   |   +-- java (where your java code goes)
|   |   +-- res  (where your res go)
|   |   +-- assets (where your assets go)
|   |   \-- AndroidManifest.xml
|   \-- instrumentTest (test project)
|       \-- java (where your java code goes)
+-- build.gradle
\-- settings.gradle

如果您只有一个项目,则不需要 settings.gradle 文件。但是,您想添加更多项目,所以我们需要它。

现在让我们看一下那个 build.gradle 文件。您将需要它(添加 android 工具)

构建.gradle

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

现在我们需要告诉 Gradle 一些 Android 部分。这很简单。一个基本的(适用于我的大多数情况)如下所示。我在这个块中有一个注释,它将允许我在生成 APK 时指定版本名称和代码。

构建.gradle

apply plugin: "android"
android {
        compileSdkVersion 17
        /*
        defaultConfig {
            versionCode = 1
            versionName = "0.0.0"
        }
        */
    }

我们将要添加一些东西,以帮助尚未看到 Gradle 之光的任何人,一种让他们无需安装即可使用该项目的方式。

构建.gradle

task wrapper(type: org.gradle.api.tasks.wrapper.Wrapper) {
    gradleVersion = '1.4'
}

所以现在我们有一个项目要构建。现在我们要添加其他的。我将它们放在一个目录中,可能称之为 deps 或 subProjects。这并不重要,但你需要知道你把它放在哪里。要告诉 Gradle 项目在哪里,您需要将它们添加到 settings.gradle。

目录结构:

Project Root
+-- src (see above)
+-- subProjects (where projects are held)
|   +-- reallyCoolProject1 (your first included project)
|       \-- See project structure for a normal app
|   \-- reallyCoolProject2 (your second included project)
|       \-- See project structure for a normal app
+-- build.gradle
\-- settings.gradle

设置.gradle:

include ':subProjects:reallyCoolProject1'
include ':subProjects:reallyCoolProject2'

您应该确保的最后一件事是subProjects/reallyCoolProject1/build.gradleapply plugin: "android-library"而不是apply plugin: "android".

像每个 Gradle 项目(和 Maven)一样,我们现在需要告诉根项目它的依赖关系。这也可以包括您想要的任何普通 Java 依赖项。

构建.gradle

dependencies{
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.4'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.4'
    compile project(":subProjects:reallyCoolProject1")
    compile project(':subProjects:reallyCoolProject2')
}

我知道这看起来有很多步骤,但是一旦你做了一两次,它们就很容易了。假设您在 CI 服务器上安装了 Android SDK,这种方式还允许您在 CI 服务器上进行构建。

NDK 旁注:如果您要使用 NDK,您将需要以下内容。示例 build.gradle 文件可以在这里找到:https ://gist.github.com/khernyo/4226923

构建.gradle

task copyNativeLibs(type: Copy) {
    from fileTree(dir: 'libs', include: '**/*.so' )  into  'build/native-libs'
}
tasks.withType(Compile) { compileTask -> compileTask.dependsOn copyNativeLibs }

clean.dependsOn 'cleanCopyNativeLibs'

tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
  pkgTask.jniDir new File('build/native-libs')
}

资料来源:

  1. http://tools.android.com/tech-docs/new-build-system/user-guide
  2. https://gist.github.com/khernyo/4226923
  3. https://github.com/ethankhall/driving-time-tracker/
于 2013-05-23T18:19:43.247 回答
8

我刚刚在 gradle 构建/添加 .jar 库时遇到了非常相似的问题。我通过以下组合使其工作:

  1. 将 libs 文件夹移动到项目的根目录(与“src”相同的目录),并将库添加到 finder 中的此文件夹(使用 Mac OS X)
  2. 在 Android Studio 中,右键单击要添加为库的文件夹
  3. 编辑 build.gradle 文件中的依赖项,添加compile fileTree(dir: 'libs', include: '*.jar')}

但更重要和烦人的是,在我让它工作几个小时后,Android Studio 刚刚发布了 0.3.7,它声称已经解决了很多 gradle 问题,例如添加 .jar 库

http://tools.android.com/recent

希望这对人们有所帮助!

于 2013-12-04T16:58:55.347 回答
3

这是我为 mac 用户提供的解决方案,我认为它也适用于窗口:

首先转到您的 Android Studio 工具栏

Build > Make Project(当你们在线时让它下载文件)然后

Build > Compile Module “your app name is shown here”(仍然在线让文件
下载并完成)然后

运行完成的应用程序,它将启动您的模拟器并对其进行配置,然后运行它!

这就对了!!!快乐的编码家伙!!!!!!!

于 2014-04-24T21:36:27.997 回答
1

Gradle Build Tools 2.2.0+ - 一切正常

这是正确的方法

为了避免实验性的,坦率地说厌倦了 NDK 和它的所有hackery,我很高兴 Gradle Build Tools 的 2.2.x 出来了,现在它可以正常工作了。关键是externalNativeBuild指向ndkBuild路径参数Android.mk或更改ndkBuildcmake并将路径参数指向CMakeLists.txt构建脚本。

android {
    compileSdkVersion 19
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 19

        ndk {
            abiFilters 'armeabi', 'armeabi-v7a', 'x86'
        }

        externalNativeBuild {
            cmake {
                cppFlags '-std=c++11'
                arguments '-DANDROID_TOOLCHAIN=clang',
                        '-DANDROID_PLATFORM=android-19',
                        '-DANDROID_STL=gnustl_static',
                        '-DANDROID_ARM_NEON=TRUE',
                        '-DANDROID_CPP_FEATURES=exceptions rtti'
            }
        }
    }

    externalNativeBuild {
        cmake {
             path 'src/main/jni/CMakeLists.txt'
        }
        //ndkBuild {
        //   path 'src/main/jni/Android.mk'
        //}
    }
}

有关更多详细信息,请查看Google 关于添加本机代码的页面

正确设置后,您就可以./gradlew installDebug出发了。您还需要注意 NDK 正在迁移到 clang,因为 gcc 现在在 Android NDK 中已弃用。

于 2017-02-23T09:03:20.623 回答