如何使用 Android Studio 和 gradle 构建一个 android 库?

Posted

技术标签:

【中文标题】如何使用 Android Studio 和 gradle 构建一个 android 库?【英文标题】:How to build an android library with Android Studio and gradle? 【发布时间】:2013-05-19 01:19:00 【问题描述】:

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

有没有办法让 Eclipse 导出的 3 个项目一起工作?我是不是最好重组一些东西,如果是这样,应该如何做的文档?

更新

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

更新 1

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

    创建一个名为MyApp 的新项目 点击File > New Module,选择Android Library并命名为MyLib 点击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

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

    点击File &gt; Project Structure &gt; Modules &gt; MyApp-MyApp 切换到Dependencies标签 单击+ &gt; Module Dependency 并选择MyLib 点击ApplyOK 点击Build &gt; 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 解决了这个问题。

    compile project(':SubProjects:MyLib') 添加到MyLib/build.gradleMyLib/build.gradle 中删除compile files('libs/android-support-v4.jar') 关闭项目并从 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。因为它不是一个“真正的”依赖,所以你不能在两个地方拥有它。 我评论了拉取请求。 github.com/respectTheCode/android-studio-library-example/pull/1 值得一提的是,如果您将compile 'com.google.android:support-v4:r6' 添加到您的每个项目和maven 插件(如下面的build.gradle 示例中)而不是compile files('libs/android-support-v4.jar') gradle 将意识到这两个项目都包括相同的东西,只会包含一次。 @respectTheCode 我发送了一个拉取请求来清理您的示例 github 项目。感谢分享! Android studio, gradle and NDK的可能重复 【参考方案1】:

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

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

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

Gradle 有一个defined 结构(您可以更改,底部的链接告诉您如何更改),如果您曾经使用过它,它与 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'

您应该确保的最后一件事是 subProjects/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')

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

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')

来源:

    http://tools.android.com/tech-docs/new-build-system/user-guide https://gist.github.com/khernyo/4226923 https://github.com/ethankhall/driving-time-tracker/

【讨论】:

感谢@Ethan,这确实填补了一些空白。 Android Studio 仅缺少根项目 build.gradle。我会用我现在遇到的错误更新问题。 我尝试克隆您的驾驶时间跟踪器存储库并导入项目,但无法编译。 我忘记了什么,我提出了一个新的请求 嗨@Ethan,看来您对Gradle 很有经验,您是否也愿意协助解决我的问题:***.com/questions/17479076/… @Ethan 你能帮我dependency problem 使用 Gradle for Android 吗?【参考方案2】:

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

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

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

http://tools.android.com/recent

希望这对人们有所帮助!

【讨论】:

本期讨论的是 Andriod 库而不是 Java .jar 库。 真的!但是,我的问题确实涉及 gradle 构建和 android studio,这篇文章非常相似,足以帮助我找到我的解决方案 - 只是想我会传播好消息,以防其他人被引导到这个问题,并且处于相同的位置我。【参考方案3】:

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

首先转到您的 Android Studio 工具栏

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

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

运行你的应用程序,它会启动你的模拟器并配置它然后运行它!

就是这样!!!编码快乐!!!!!!!

【讨论】:

【参考方案4】:

Gradle 构建工具 2.2.0+ - 一切正常

这是正确的做法

为了避免实验性的,坦率地说厌倦了 NDK 和它的所有hackery,我很高兴 Gradle Build Tools 的 2.2.x 出来了,现在它可以正常工作了。关键是externalNativeBuild 并将ndkBuild 路径参数指向Android.mk 或将ndkBuild 更改为cmake 并将路径参数指向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's page on adding native code。

正确设置后,您可以./gradlew installDebug 并离开。您还需要注意,由于 gcc 现在在 Android NDK 中已弃用,因此 NDK 正在转向 clang。

【讨论】:

以上是关于如何使用 Android Studio 和 gradle 构建一个 android 库?的主要内容,如果未能解决你的问题,请参考以下文章

android studio更新gradle失败的解决办法-转

Android Studio Gradle 已部署模块

Android Studio LibGDX 中的更新方法问题

Android studio gradle 下载很缓慢的解决方法

将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)

Android studio 编辑build.gradle文件时卡顿时间过长是啥原因