首页 文章

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

提问于
浏览
142

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

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

Update

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

Update 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

  • 点击 ApplyOK

  • 点击 Build > Make Project

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

Update 3

非常感谢Ethan解决这个问题 .

  • compile project(':SubProjects:MyLib') 添加到 MyLib/build.gradle

  • MyLib/build.gradle 删除 compile files('libs/android-support-v4.jar')

  • 关闭项目并从gradle导入根项目

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

Update 5

从0.1.3开始,工具栏中现在有一个"Sync Project"按钮 . 您可以在更改 .gradle 文件后单击该项而不是重新导入项目 .

4 回答

  • 6

    Note :这个答案是一个纯粹的Gradle答案,我定期在IntelliJ中使用它,但我不知道如何与Android Studio集成 . 我相信知道发生了什么事,所以这就是我使用Gradle和Android的方式 .

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

    Disclaimer :这是我正在/正在进行的项目 .

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

    所以现在我们有一个项目需要 Build . 现在我们要添加其他的 . 我把它们放在一个目录中,也许称之为deps或subProjects . 这并不重要,但你需要知道你把它放在哪里 . 要告诉Gradle项目的位置,您需要将它们添加到settings.gradle中 .

    Directory Structure:

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

    资料来源:

  • 115

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

    • 将libs文件夹移动到项目的根目录(与'src'相同的目录),并在finder中将库添加到此文件夹(使用Mac OS X)

    • 在Android Studio中,右键单击要添加为库的文件夹

    • 编辑build.gradle文件中的依赖项,添加 compile fileTree(dir: 'libs', include: '*.jar')}

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

    http://tools.android.com/recent

    希望这有助于人们!

  • 1

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

    首先转到Android Studio工具栏

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

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

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

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

  • 0

    Gradle Build Tools 2.2.0 - 一切正常

    This is the correct way to do it

    在试图避免实验性和坦率地厌倦了NDK及其所有hackery时,我很高兴Gradle Build Tools的2.2.x出现了,现在它正常工作 . 关键是 externalNativeBuild 并在 Android.mk 处指向 ndkBuild 路径参数或将 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正在变为铿锵声,因为现在在Android NDK中不推荐使用gcc .

相关问题