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

时间:2013-05-23 15:29:30

标签: android gradle android-studio

我正在尝试从Eclipse迁移项目,但我尝试过的任何工作都没有。在Eclipse中我有3个项目(2个Android应用程序项目和1个android库项目)。 2个app项目取决于库项目。当我进行gradle导出时,我得到3个不起作用的项目。我愿意对项目进行重组,但没有找到任何关于如何完成这项工作的文件。

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

更新

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

更新1

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

  1. 创建一个名为MyApp
  2. 的新项目
  3. 点击File > New Module,选择Android Library并将其命名为MyLib
  4. 点击Build > Make Project
  5. 构建因此错误而失败

    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
    6. 更新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')
      3. 中删除MyLib/build.gradle
      4. 关闭项目并从gradle导入根项目
      5. 更新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 个答案:

答案 0 :(得分:115)

注意:这个答案是一个纯粹的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)一样,我们现在需要告诉root项目它的依赖性。这还可以包括您想要的任何普通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 Side注意:如果您打算使用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/user-guide
  2. https://gist.github.com/khernyo/4226923
  3. https://github.com/ethankhall/driving-time-tracker/

答案 1 :(得分:6)

我在gradle构建/添加.jar库时遇到了类似的问题。我通过以下方式实现了它:

  1. 将libs文件夹移动到项目的根目录(与'src'相同的目录),并在finder中将库添加到此文件夹(使用Mac OS X)
  2. 在Android Studio中,右键单击要添加为库的文件夹
  3. 编辑build.gradle文件中的依赖项,添加compile fileTree(dir: 'libs', include: '*.jar')}
  4. 但更重要和恼人的是,在我开始工作几个小时之后,Android Studio刚刚发布了0.3.7,声称已经解决了很多问题,例如添加.jar库

    http://tools.android.com/recent

    希望这有助于人们!

答案 2 :(得分:1)

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

首先转到Android Studio工具栏

构建&gt;制作项目(当你们在线时让它下载文件)然后

构建&gt;编译模块“您的应用程序名称显示在此处”(仍然在线让文件为
                                                           下载并完成)然后

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

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

答案 3 :(得分:0)

Gradle Build Tools 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然后离开。您还需要注意NDK正在转向clang,因为Android NDK现在不推荐使用gcc。