如何使用Android Studio和Gradle构建android库?


144

我正在尝试从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文件,而不是在更改文件后重新导入您的项目。


我向您的github项目发出了请求请求。有2个简单的更改。从/build.gradle中删除内容。{我这样做是因为您没有定义项目的类型,所以它抱怨不知道要使用什么项目},然后我将:SubProject:MyLib的依赖项添加到:SubProject:MyApp。然后,我运行./gradlew:SubProject:MyApp:iD(iD映射到installDebug)。我还必须删除重复的libs / android-support-v4.jar。由于它不是“真正的”依赖项,因此不能在两个地方使用它。
伊桑(Ethan)


1
值得一提的是,如果您添加compile 'com.google.android:support-v4:r6'到每个项目和maven插件(如下面的build.gradle示例中),而不是compile files('libs/android-support-v4.jar')gradle,您将意识到两个项目都包含相同的内容,并且只会包含一次。
伊桑(Ethan)

@respectTheCode我发送了拉取请求以稍微清理示例github项目。感谢分享!
JohnnyLambada 2014年

Answers:


115

注意:此答案是纯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工具)

build.gradle

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

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

build.gradle

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

我们将要添加的东西,以帮助那些尚未了解Gradle的人,让他们无需安装即可使用该项目。

build.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

settings.gradle:

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

你应该确保的最后一件事是子项目/ reallyCoolProject1 /的build.gradle具有apply plugin: "android-library"代替apply plugin: "android"

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

build.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')
}

我知道这似乎有很多步骤,但是一旦执行一次或两次,它们就非常容易。假设您已在其中安装了Android SDK,这种方法还将允许您在CI服务器上进行构建。

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

build.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/用户指南
  2. https://gist.github.com/khernyo/4226923
  3. https://github.com/ethankhall/driving-time-tracker/

1
谢谢@Ethan,这确实填补了一些空白。Android Studio仅缺少根项目build.gradle。我会用我现在得到的错误来更新问题。
尊重TheCode

1
我尝试克隆您的行车时间跟踪器存储库并导入项目,但无法编译。
尊重TheCode

我忘记了一些事,我提出了一个新要求
Ethan

1
嗨@Ethan,似乎你与摇篮经验,你能不能把我的问题协助,以及:stackoverflow.com/questions/17479076/...
TacB0sS

@Ethan您能帮忙解决 Gradle for Android 的依赖问题吗?
JJD

6

我在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,该版本声称已解决了许多问题,例如添加.jar库

http://tools.android.com/recent

希望这对人们有所帮助!


1
这个问题是在谈论Andriod库而不是Java .jar库。
尊重TheCode 2013年

2
真正!但是,我的问题确实涉及到gradle构建和android studio,这篇文章足够类似,可以帮助我找到解决方案-只是以为我散布了好消息,以防其他人遇到这个问题,并且处于同一位置我。
乔尔·巴尔默

1

这是我为mac用户设计的解决方案,我认为它也适用于window:

首先转到您的Android Studio工具栏

Build> Make Project(当您在线时,让其下载文件),然后

生成>编译模块“您的应用名称显示在此处”(仍在线,让文件
下载并完成),然后

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

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


0

Gradle Build Tools 2.2.0+-一切正常

这是正确的方法

为了避免实验性和坦率地厌倦NDK及其所有黑客行为,我很高兴Gradle Build Tools 2.2.x出现了,现在可以正常使用了。关键是将externalNativeBuildand指向ndkBuildpath参数指向Android.mk或将其更改ndkBuildcmake指向CMakeLists.txtbuild脚本并将其指向。

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离开了。您还需要注意,由于Android NDK中不推荐使用gcc,因此NDK正在迁移到clang。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.