Làm cách nào để xuất thư viện sang Jar trong Android Studio?


84

Tôi đã tải xuống một số nguồn thư viện và muốn xuất nó dưới dạng tệp Jar bằng Android Studio. Có cách nào để xuất sang tệp jar bằng Android studio không?

biên tập:

Thư viện tôi muốn xuất dưới dạng jar là một thư viện Android. Nó được gọi là "StandOut" và có thể tải xuống từ GitHub. https://github.com/pingpongboss/StandOut


Vui lòng cung cấp thêm chi tiết về thư viện bạn muốn xuất
gamag

Tôi đã chỉnh sửa câu hỏi của mình bằng các chi tiết của thư viện Android.
Sage Pourpre

Câu trả lời:


85

Không thể xuất thư viện Android dưới dạng tệp jar. Tuy nhiên, có thể xuất nó dưới dạng aartệp. Aartệp là định dạng nhị phân mới cho các thư viện Android. Có thông tin về chúng trong Google I / O, video Hệ thống xây dựng mới .

Đầu tiên, hãy xây dựng thư viện trong Android Studio hoặc từ dòng lệnh phát hành gradle buildtừ thư mục gốc của thư viện của bạn.

Điều này sẽ dẫn đến <yourlibroot>/libs/build/yourlib.aartệp.

Tệp aar này là một đại diện nhị phân của thư viện của bạn và có thể được thêm vào dự án của bạn thay vì thư viện như một dự án phụ thuộc.

Để thêm tệp aar làm phụ thuộc, bạn phải xuất bản tệp đó lên trung tâm maven hoặc vào kho lưu trữ maven cục bộ, sau đó tham chiếu tệp aar trong tệp dự án của bạn gradle.build.

Tuy nhiên, bước này hơi phức tạp. Tôi đã tìm thấy một lời giải thích tốt về cách làm như vậy ở đây:

http://www.flexlabs.org/2013/06/using-local-aar-android-library-packages-in-gradle-builds


2
cũng có thư viện android tùy thuộc vào thư viện android khác có thể phá vỡ mọi thứ.
Loïc Faure-Lacroix

Thư mục res sẽ được bao gồm trong tệp aar?
Bagusflyer

xem câu trả lời của @ Wallmart_Hobo bên dưới, có thể và tôi có thể xác nhận rằng jar đã xuất hoạt động tốt trong một dự án ứng dụng android eclipse.
Pellet

2
Tôi đã tìm thấy tệp aar của mình được bao gồm trong liên kết này: lib \ build \ outputs \ aar
Simon


44

Tôi đã có thể tạo mã nguồn thư viện cho .jartệp đã biên dịch , sử dụng cách tiếp cận từ giải pháp này: https://stackoverflow.com/a/19037807/1002054

Đây là sự cố về những gì tôi đã làm:

1. Kho thư viện Checkout

Trong trường hợp có thể, nó là một thư viện Volley

2. Nhập thư viện trong Android Studio.

Tôi đã sử dụng Android Studio 0.3.7. Tôi đã gặp một số vấn đề trong bước đó, cụ thể là tôi phải sao chép gradlethư mục từ dự án android mới trước khi có thể nhập mã nguồn thư viện Volley, điều này có thể khác nhau tùy thuộc vào mã nguồn bạn sử dụng.

3. Sửa đổi build.gradletệp của bạn

// If your module is a library project, this is needed
//to properly recognize 'android-library' plugin
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.3'
    }
}

apply plugin: 'android-library'

android {
    compileSdkVersion 17
    buildToolsVersion = 17

    sourceSets {
        main  {
            // Here is the path to your source code
            java {
                srcDir 'src'
            }
        }
    }
}

// This is the actual solution, as in https://stackoverflow.com/a/19037807/1002054
task clearJar(type: Delete) {
    delete 'build/libs/myCompiledLibrary.jar'
}

task makeJar(type: Copy) {
    from('build/bundles/release/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'myCompiledLibrary.jar')
}

makeJar.dependsOn(clearJar, build)

4. Chạy gradlew makeJarlệnh từ gốc dự án của bạn.

Tôi trường hợp của tôi, tôi đã phải sao chép gradlew.batgradlecác tệp từ dự án Android mới vào thư viện gốc của dự án. Bạn sẽ tìm thấy tệp thư viện đã biên dịch của mình myCompiledLibrary.jartrong build\libsthư mục.

Tôi hi vọng ai đó thấy nó hữu ích.

Biên tập:

Cảnh báo trước

Mặc dù điều này hoạt động, bạn sẽ gặp phải ngoại lệ thư viện trùng lặp trong khi biên dịch một dự án với nhiều mô-đun, trong đó nhiều hơn một mô-đun (bao gồm cả mô-đun ứng dụng) phụ thuộc vào cùng một jartệp (ví dụ: mô-đun có thư mục thư viện riêng, được tham chiếu trong build.gradlemô-đun nhất định) .

Trong trường hợp bạn cần sử dụng một thư viện trong nhiều hơn một mô-đun, tôi khuyên bạn nên sử dụng phương pháp này: bản dựng Android gradle và thư viện hỗ trợ


Tôi thấy không có cách nào để bao gồm res bên trong bình. Điều đó có thể không?
Bagusflyer

7
Trong các phiên bản gần đây của Android studio đòi hỏi một sự thay đổi: dòng nên đọc 'từ ( 'build / trung gian / bó / release /') `
Greg Ennis

@GregEnnis ya, nhưng trong trường hợp của tôi, nó đang tạo một cái lọ với tên mobule của tôi và cái lọ thực sự nằm bên trong cái lọ đó. Tôi đã giải nén jar được tạo với tên mô-đun của tôi như module_name.jar.
pyus13

6
@bagusflyer, Nếu bạn muốn có resthư mục, thì tệp AAR chính xác là như vậy - tệp JAR có reshỗ trợ thư mục.
Martin Konecny

làm thế nào để áp dụng proguard để tạo jar này?
Amrut Bidri

37

Vì Android Studio V1.0, tệp jar có sẵn bên trong liên kết dự án sau:

gỡ lỗi ver: "your_app" \ build \ trung gian \ bó \ debug \ class.jar

phát hành phiên bản: "your_app" \ xây dựng \ trung gian \ gói \ phát hành \ lớp.jar

Tệp JAR được tạo trên quy trình xây dựng, Trong Android Studio GUI, nó từ Build-> Make Project và từ dòng CMD là "gradlew build".


3
bạn sẽ nhận được tất cả internets của tôi cho câu trả lời này
m02ph3u5

1
Tìm thấy rồi, trong Build Variants, chúng ta phải chọn Build Variant để 'phát hành'. Nhưng bây giờ các lớp.jar không có trong thư mục phát hành!
Aparajith Sairam

1
@AparajithSairam bạn đã xây dựng JAR, dòng lệnh hoặc gui của mình như thế nào?
Avi Levin

1
@AparajithSairam, tôi đã tìm thấy thứ gì đó trong GUI nhưng nó chỉ liên quan đến các bản dựng tệp APK. sau khi chọn biến thể xây dựng có liên quan, hãy nhấn vào biểu tượng "phát" màu xanh lá cây. nó sẽ chạy lệnh gradle lắp ráp nền sẽ tạo tệp. Đối với tệp JAR trong CMD, bạn sẽ phải chạy gradlew assemblyDebug hoặc Release hoặc bất kỳ hương vị nào bạn có. Sau đó JAR sẽ có sẵn trên các vị trí sau: your_app "\ build \ trung gian \ bó \" falvor "\ classes.jar bạn có thể xem tất cả các lệnh lắp ráp bằng cách sử dụng 'nhiệm vụ gradlew'
Avi Levin

1
Tôi đã ủng hộ một câu trả lời khác hơn một năm trước. Bắt đầu kinh doanh. Đây là bánh! Cảm ơn!!
Kevin

31

Bao gồm những thứ sau vào build.gradle:

android.libraryVariants.all { variant ->
    task("generate${variant.name}Javadoc", type: Javadoc) {
        description "Generates Javadoc for $variant.name."
        source = variant.javaCompile.source
        ext.androidJar = "${android.plugin.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
        classpath = files(variant.javaCompile.classpath.files) + files(ext.androidJar)
    }

    task("javadoc${variant.name}", type: Jar) {
        classifier = "javadoc"
        description "Bundles Javadoc into a JAR file for $variant.name."
        from tasks["generate${variant.name}Javadoc"]

    }

    task("jar${variant.name}", type: Jar) {
        description "Bundles compiled .class files into a JAR file for $variant.name."
        dependsOn variant.javaCompile
        from variant.javaCompile.destinationDir
        exclude '**/R.class', '**/R$*.class', '**/R.html', '**/R.*.html'
    }
}

Sau đó, bạn có thể thực thi gradle với: ./gradlew clean javadocRelease jarReleasesẽ tạo cho bạn Jar của bạn và cũng là một jar javadoc vào build/libs/thư mục.

CHỈNH SỬA: Với các công cụ android gradle 1.10. + Việc lấy dir SDK android khác với trước đây. Bạn phải thay đổi những điều sau (cảm ơn Vishal!):

android.sdkDirectory 

thay vì

android.plugin.sdkDirectory

Câu trả lời tuyệt vời, điều này làm việc hoàn hảo cho tôi. Bạn cũng có thể thêm mục tiêu gradle trong android studio để chạy tác vụ jarDebug sẽ tạo ra jar có thể sử dụng được (Tôi đã thử nghiệm điều này trong một dự án nhật thực và nó cũng hoạt động tốt).
Pellet

8
Tại sao "mới" xây dựng hệ thống Android làm cho nó xấu xí này :(.
Martin Konecny

Cho đến nay đó là câu trả lời duy nhất có hiệu quả. Cảm ơn bạn rất nhiều @Walmart_Hobo
Drew

Giải pháp tuyệt vời để tạo tệp JAR! Có thể bao gồm cả các tài nguyên không?
Gaëtan

12

Tôi đã có thể xuất tệp jar trong Android Studio bằng hướng dẫn này: https://www.youtube.com/watch?v=1i4I-Nph-Cw "Cách xuất tệp jar từ Android Studio"

Tôi đã cập nhật câu trả lời của mình để bao gồm tất cả các bước để xuất JAR trong Android Studio:

1) Tạo dự án ứng dụng Android, truy cập app-> build.gradle

2) Thay đổi những điều sau trong tệp này:

  • sửa đổi áp dụng plugin: 'com.android.application' để áp dụng plugin: 'com.android.library'

  • loại bỏ những thứ sau: applicationId, versionCode và versionName

  • Thêm mã sau:

// Task to delete old jar
task deleteOldJar(type: Delete){
   delete 'release/AndroidPlugin2.jar'
}
// task to export contents as jar
task exportJar(type: Copy) {
    from ('build/intermediates/bundles/release/')
    into ('release/')
    include ('classes.jar')
    rename('classes.jar', 'AndroidPlugin2.jar')
}
exportJar.dependsOn(deleteOldJar, build)

3) Đừng quên nhấp vào đồng bộ ngay trong tệp này (trên cùng bên phải hoặc sử dụng nút đồng bộ).

4) Nhấp vào tab Gradle (thường ở giữa bên phải) và cuộn xuống exportjar

5) Khi bạn thấy thông báo xây dựng thành công trong cửa sổ chạy, sử dụng trình khám phá tệp thông thường, hãy chuyển đến jar đã xuất bằng đường dẫn: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release, bạn sẽ thấy trong thư mục này tệp jar của mình.

Chúc may mắn :)


1
Bước 2 là rất quan trọng. Không ai khác đề cập đến điều này. Cảm ơn bạn, điều này đã làm việc cho tôi!
pookie

9

Đây là một câu trả lời khác, hơi khác với một vài cải tiến.

Mã này lấy .jar ngay ra khỏi .aar. Cá nhân tôi, điều đó khiến tôi tự tin hơn một chút rằng các bit được vận chuyển qua .jar cũng giống như các bit được vận chuyển qua .aar. Điều này cũng có nghĩa là nếu bạn đang sử dụng ProGuard, jar đầu ra sẽ bị xáo trộn như mong muốn.

Tôi cũng đã thêm một nhiệm vụ siêu "makeJar", tạo ra các lọ cho tất cả các biến thể xây dựng.

task(makeJar) << {
    // Empty. We'll add dependencies for this task below
}

// Generate jar creation tasks for all build variants
android.libraryVariants.all { variant ->
    String taskName = "makeJar${variant.name.capitalize()}"

    // Create a jar by extracting it from the assembled .aar
    // This ensures that products distributed via .aar and .jar exactly the same bits
    task (taskName, type: Copy) {
        String archiveName = "${project.name}-${variant.name}"
        String outputDir = "${buildDir.getPath()}/outputs"

        dependsOn "assemble${variant.name.capitalize()}"
        from(zipTree("${outputDir}/aar/${archiveName}.aar"))
        into("${outputDir}/jar/")
        include('classes.jar')
        rename ('classes.jar', "${archiveName}-${variant.mergedFlavor.versionName}.jar")
    }

    makeJar.dependsOn tasks[taskName]
}

Đối với người đọc tò mò, tôi đã cố gắng xác định các biến và tham số chính xác mà plugin com.android.library sử dụng để đặt tên cho các tệp .aar. Cuối cùng tôi đã tìm thấy chúng trong Dự án nguồn mở Android tại đây .


4

Chúng tôi có thể xuất tệp jar cho dự án thư viện Android mà không cần tệp tài nguyên của Android studio. Đó cũng là yêu cầu mà tôi đã gặp gần đây.

1. Định cấu hình tệp build.gradle của bạn

    // Task to delete old jar

    task clearJar(type: Delete){
       delete 'release/lunademo.jar'
    }

    // task to export contents as jar
    task makeJar(type: Copy) {
       from ('build/intermediates/bundles/release/')
       into ('build/libs/')
       include ('classes.jar')
       rename('classes.jar', 'lunademo.jar')
    }
    makeJar.dependsOn(clearJar, build)

2. Chạy gradlew makeJar dưới gốc dự án của bạn

Bạn sẽ thấy lib của mình dưới dir là build / libs / nếu bạn may mắn.

================================================== ==========

Nếu bạn gặp sự cố là "Ngoại lệ thời gian chờ của ổ cắm" trên dòng lệnh như bên dưới,

nhập mô tả hình ảnh ở đây

Bạn có thể làm theo các bước sau để mở cửa sổ Gradle ở phần bên phải và nhấp vào "makeJar" trên Android studio như thế này,

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Sau đó vào build / libs dir, bạn sẽ thấy tệp jar của mình.

Hy vọng rằng nó là hữu ích cho bạn.

Chúc may mắn @.@

ánh trăng

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.