如何使用 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 > Project Structure > Modules > MyApp-MyApp
切换到Dependencies
标签
单击+ > Module Dependency
并选择MyLib
点击Apply
和OK
点击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 解决了这个问题。
-
将
compile project(':SubProjects:MyLib')
添加到MyLib/build.gradle
从MyLib/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 LibGDX 中的更新方法问题
Android studio gradle 下载很缓慢的解决方法
将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)