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

我试图从 Eclipse 迁移一个项目,但是没有一个是可行的。在 Eclipse 中,我有3个项目(2个 android 应用程序项目和1个 android 库项目)。这两个应用程序项目依赖于库项目。当我做梯度出口我得到3个项目,不工作。我愿意重组这个项目,但是还没有找到任何关于如何完成这个项目的文档。

是否有办法使 Eclipse 导出的3个项目一起工作?我是否可以更好地进行重组,如果是的话,是否可以编写文档说明应该如何进行重组?

更新

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

更新1

根据帕德玛库马尔的建议,这是我所尝试的。

  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

根据伊森的建议,我们从这里开始

在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

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

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

更新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文件进行更改之后,您可以单击该命令,而不必重新导入项目。

180620 次浏览

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

完整的例子-一个 href = “ https://github.com/ethankhall/drive-time-acker/”rel = “ norefrer”> 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

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

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

建造,分级

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

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

建造,分级

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

我们想添加一些东西,来帮助那些还没有见过 Gradle 之光的人,让他们不用安装就可以使用这个项目。

建造,分级

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

所以现在我们有一个项目要建设。现在我们要加上其他的。我把它们放在一个目录中,可能称之为 deps 或子项目。这并不重要,但你需要知道你把它放在哪里。要告诉 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

设置等级:

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

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

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

建造,分级

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

建造,分级

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/

我只是有一个非常相似的问题,梯度构建/添加。罐子库。我通过以下几种方式让它工作起来:

  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

希望这能帮到大家!

以下是我为 Mac 用户提供的解决方案,我认为它也适用于 windows:

首先进入你的 Android Studio 工具栏

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

构建 > 编译模块“您的应用程序名称显示在这里”(仍然在线让文件是
下载并完成) ,然后

运行您的应用程序,这是做它将启动您的模拟器,并配置它,然后运行它!

就是这样! ! ! 快乐的编码家伙! ! ! ! ! ! ! !

Gradle Build Tools 2.2.0 +-所有工具都能正常工作

这是正确的做法

为了避免实验性的,坦率地说,我已经厌倦了 NDK 和它所有的黑客行为,我很高兴2.2. x 的 Gradle Build Tools 出来了,现在它只是工作。关键是 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'
//}
}
}

更多细节检查 谷歌关于添加本地代码的页面

这是正确设置后,你可以 ./gradlew installDebug和关闭你去。您还需要知道 NDK 正在转向叮当声,因为 gcc 现在在 Android NDK 中已被弃用。