Làm cách nào để xây dựng thư viện Android với Android Studio và gradle?


143

Tôi đang cố gắng di chuyển một dự án từ Eclipse nhưng không có gì tôi đã thử làm việc. Trong Eclipse tôi có 3 dự án (2 dự án ứng dụng Android và 1 dự án thư viện Android). 2 dự án ứng dụng phụ thuộc vào dự án thư viện. Khi tôi thực hiện xuất khẩu lớp, tôi nhận được 3 dự án không hoạt động. Tôi sẵn sàng tái cấu trúc dự án nhưng chưa tìm thấy tài liệu nào về cách thực hiện.

Có cách nào để làm cho 3 dự án mà xuất khẩu Eclipse hoạt động cùng nhau không? Tôi có nên tái cấu trúc mọi thứ tốt hơn không và nếu có thì tài liệu cho việc này nên được thực hiện như thế nào?

Cập nhật

Tôi đã tải toàn bộ dự án lên GitHub https://github.com/respectTheCode/android-studio-l Library-example

Cập nhật 1

Dựa trên những gợi ý từ Padma Kumar, đây là những gì tôi đã thử.

  1. Tạo một dự án mới gọi là MyApp
  2. Nhấp File > New Module, chọn Android Libraryvà đặt tên cho nóMyLib
  3. Nhấp chuột Build > Make Project

Việc xây dựng không thành công với lỗi này

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.

Sau đó tôi đã thêm một packagethuộc tính vào tệp kê khai làm cho nó

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.mylib" >

Sau khi xây dựng tôi gặp lỗi này

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

Thêm phụ thuộc dường như không có bất kỳ tác động nào đến lỗi. Tiếp tục từ trên cao

  1. Nhấp chuột File > Project Structure > Modules > MyApp-MyApp
  2. Chuyển sang DependenciesTab
  3. Nhấp + > Module Dependencyvà chọnMyLib
  4. Nhấp ApplyOK
  5. Nhấp chuột Build > Make Project

Cập nhật 2

Dựa trên những gợi ý từ Ethan, đây là nơi chúng tôi nhận được

Dự án phụ 2 build.gradledường như có tất cả các phần chính xác và sự khác biệt duy nhất là dòng plugin dưới đây là 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
    }
}

Dự án gốc build.gradletrống nên tôi đã thêm hai dự án như thế này

dependencies {
    compile project(":MyLib")
    compile project(":MyApp")
}

Bây giờ tôi gặp lỗi này khi xây dựng

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.

Cập nhật 3

Cảm ơn rất nhiều vì Ethan đã giải quyết điều này.

  1. Thêm compile project(':SubProjects:MyLib')vàoMyLib/build.gradle
  2. Xóa compile files('libs/android-support-v4.jar')khỏiMyLib/build.gradle
  3. Đóng dự án và nhập dự án gốc từ lớp

Cập nhật 4

Kể từ 0.1.2, bây giờ bạn có thể bao gồm compile "com.android.support:support-v4:13.0.0"thay vì compile files('libs/android-support-v4.jar'). Vì nó đến từ mavin nên bạn có thể đưa nó vào nhiều dự án mà không gặp vấn đề gì.

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

Cập nhật 5

Kể từ 0.1.3, giờ đây đã có nút "Dự án đồng bộ hóa" trên thanh công cụ. Bạn có thể nhấp vào đó thay vì nhập lại dự án của bạn sau khi thay đổi .gradletệp.


Tôi đã thực hiện một yêu cầu kéo cho dự án github của bạn. Có 2 thay đổi đơn giản. Xóa nội dung khỏi /build.gradle của bạn. {Tôi đã làm điều này bởi vì bạn đã không xác định loại dự án đó là gì, vì vậy nó đã phàn nàn về việc không biết phải làm gì với nó}, sau đó tôi đã thêm phần phụ thuộc từ: SubProject: MyLib vào: SubProject: MyApp. Sau đó tôi đã chạy ./gradlew: SubProject: MyApp: iD (iD maps to installDebug). Tôi cũng đã phải xóa libs / android-support-v4.jar trùng lặp. Vì nó không phải là một sự phụ thuộc 'thực sự', bạn không thể có nó ở hai nơi.
Ethan


1
Điều đáng nói, nếu bạn thêm compile 'com.google.android:support-v4:r6'vào từng dự án của mình và plugin maven (như trong ví dụ build.gradle bên dưới) thay vì compile files('libs/android-support-v4.jar')lớp sẽ nhận ra rằng cả hai dự án đều bao gồm cùng một thứ và sẽ chỉ bao gồm một lần.
Ethan

@respectTheCode Tôi đã gửi một yêu cầu kéo để dọn sạch dự án github mẫu của bạn một chút. Cám ơn vì đã chia sẻ!
JohnnyLambada

Câu trả lời:


115

Lưu ý : Câu trả lời này là câu trả lời Gradle thuần túy, tôi sử dụng câu hỏi này trong IntelliJ một cách thường xuyên nhưng tôi không biết cách tích hợp với Android Studio. Tôi là một tín đồ trong việc biết những gì đang xảy ra với tôi, vì vậy đây là cách tôi sử dụng Gradle và Android.

Ví dụ đầy đủ về TL; DR - https://github.com/ethankhall/drive-time-tracker/

Tuyên bố miễn trừ trách nhiệm : Đây là một dự án tôi đang / đang thực hiện.

Gradle có cấu trúc được xác định (mà bạn có thể thay đổi, liên kết ở phía dưới cho bạn biết cách thức) rất giống với Maven nếu bạn đã từng sử dụng nó.

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

Nếu bạn chỉ có một dự án, thì tệp settings.gradle không cần thiết. Tuy nhiên, bạn muốn thêm nhiều dự án, vì vậy chúng tôi cần nó.

Bây giờ hãy xem qua tập tin build.gradle đó. Bạn sẽ cần điều này trong đó (để thêm các công cụ Android)

xây dựng. nâng cấp

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

Bây giờ chúng ta cần nói với Gradle về một số phần của Android. Nó khá đơn giản. Một cái cơ bản (hoạt động trong hầu hết các trường hợp của tôi) trông giống như sau. Tôi có một nhận xét trong khối này, nó sẽ cho phép tôi chỉ định tên phiên bản và mã khi tạo APK.

xây dựng. nâng cấp

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

Một cái gì đó chúng tôi sẽ muốn thêm vào, để giúp đỡ bất cứ ai chưa nhìn thấy ánh sáng của Gradle, một cách để họ sử dụng dự án mà không cần cài đặt nó.

xây dựng. nâng cấp

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

Vì vậy, bây giờ chúng tôi có một dự án để xây dựng. Bây giờ chúng tôi sẽ thêm những người khác. Tôi đặt chúng trong một thư mục, có thể gọi nó là deps hoặc dự án con. Nó không thực sự quan trọng, nhưng bạn sẽ cần phải biết bạn đặt nó ở đâu. Để cho Gradle biết các dự án bạn sẽ cần thêm chúng vào cài đặt. Nâng cấp.

Cấu trúc thư mục:

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

cài đặt. Nâng cấp:

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

Điều cuối cùng bạn nên chắc chắn là các dự án con / reallyCoolProject1 / build.gradleapply plugin: "android-library"thay vì apply plugin: "android".

Giống như mọi dự án Gradle (và Maven) bây giờ chúng ta cần nói với dự án gốc về sự phụ thuộc của nó. Điều này cũng có thể bao gồm bất kỳ phụ thuộc Java bình thường nào mà bạn muốn.

xây dựng. nâng cấp

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

Tôi biết điều này có vẻ như rất nhiều bước, nhưng chúng khá dễ dàng một khi bạn làm điều đó một hoặc hai lần. Cách này cũng sẽ cho phép bạn xây dựng trên máy chủ CI giả sử bạn đã cài đặt SDK Android ở đó.

Lưu ý bên NDK: Nếu bạn sẽ sử dụng NDK, bạn sẽ cần một cái gì đó như dưới đây. Ví dụ tập tin build.gradle có thể được tìm thấy ở đây: https://gist.github.com/khernyo/4226923

xây dựng. nâng cấp

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

Nguồn:

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

1
Cảm ơn @Ethan điều này không điền vào một số khoảng trống. Android Studio chỉ thiếu bản dựng dự án gốc. Nâng cấp. Tôi sẽ cập nhật câu hỏi với lỗi tôi nhận được bây giờ.
tôn trọng TheCode

1
Tôi đã thử nhân bản repo theo dõi thời gian lái xe của bạn và nhập dự án nhưng không được biên dịch.
tôn trọng TheCode

Tôi đã quên một cái gì đó, tôi đã thực hiện một yêu cầu mới
Ethan

1
Hi @Ethan, có vẻ như bạn đang trải qua với Gradle, bạn sẽ nhớ hỗ trợ với vấn đề của tôi cũng như: stackoverflow.com/questions/17479076/...
TacB0sS

@Ethan Bạn có thể giúp đỡ với một vấn đề phụ thuộc với Gradle cho Android không?
JJD

6

Tôi chỉ có một vấn đề rất giống với xây dựng lớp / thêm thư viện .jar. Tôi đã làm cho nó hoạt động bằng sự kết hợp của:

  1. Di chuyển thư mục libs lên thư mục gốc của dự án (cùng thư mục với 'src') và thêm thư viện vào thư mục này trong công cụ tìm (sử dụng Mac OS X)
  2. Trong Android Studio, nhấp chuột phải vào thư mục để thêm làm thư viện
  3. Chỉnh sửa các phụ thuộc trong tệp build.gradle, thêm compile fileTree(dir: 'libs', include: '*.jar')}

NHƯNG quan trọng và khó chịu hơn, chỉ vài giờ sau khi tôi hoạt động, Android Studio mới phát hành 0.3.7, tuyên bố đã giải quyết được rất nhiều vấn đề cấp độ như thêm thư viện .jar

http://tools.android.com/recent

Hy vọng điều này sẽ giúp mọi người!


1
Vấn đề này đang nói về Thư viện Andriod chứ không phải thư viện Java .jar.
tôn trọng TheCode

2
Thật! Tuy nhiên, vấn đề của tôi liên quan đến việc xây dựng gradle và studio android và bài đăng này đủ tương tự để giúp tôi hướng tới giải pháp của mình - chỉ nghĩ rằng tôi đã lan truyền tin tốt khi có bất kỳ ai khác dẫn đến câu hỏi này, và ở vị trí tương tự tôi.
Joel Balmer

1

Đây là giải pháp của tôi cho người dùng mac Tôi nghĩ rằng nó cũng hoạt động cho cửa sổ:

Đầu tiên hãy vào thanh công cụ Android Studio của bạn

Xây dựng> Tạo dự án (trong khi các bạn đang trực tuyến, hãy để nó tải xuống các tệp) và sau đó

Build> Compile Module "tên ứng dụng của bạn được hiển thị ở đây" (vẫn trực tuyến cho phép các tệp được
tải xuống và kết thúc) và sau đó

Chạy ứng dụng của bạn đã xong, nó sẽ khởi chạy trình giả lập của bạn và cấu hình nó sau đó chạy nó!

Thế là xong !!! Chúc các bạn mã hóa vui vẻ !!!!!!!


0

Gradle Build Tools 2.2.0+ - Mọi thứ chỉ hoạt động

Đây là cách chính xác để làm điều đó

Khi cố gắng tránh thử nghiệm và thẳng thắn chán ngấy với NDK và tất cả các tin tặc của nó, tôi rất vui khi 2.2.x của Công cụ xây dựng Gradle xuất hiện và bây giờ nó chỉ hoạt động. Điều quan trọng là externalNativeBuildvà chỉ ndkBuildsố đường dẫn ở một Android.mkhoặc thay đổi ndkBuildđể cmakevà điểm số đường dẫn ở CMakeLists.txtxây dựng kịch bản.

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

Để biết thêm chi tiết, hãy kiểm tra trang của Google về việc thêm mã gốc .

Sau khi thiết lập chính xác, bạn có thể ./gradlew installDebugvà tắt bạn đi. Bạn cũng sẽ cần phải biết rằng NDK đang chuyển sang clang vì gcc hiện không được dùng trong NDK của Android.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.