จะส่งออกไลบรารีไปยัง Jar ใน Android Studio ได้อย่างไร


85

ฉันดาวน์โหลดแหล่งที่มาของไลบรารีแล้วและต้องการส่งออกเป็นไฟล์ Jar โดยใช้ Android Studio มีวิธีส่งออกไปยังไฟล์ jar โดยใช้ Android studio หรือไม่?

แก้ไข:

ไลบรารีที่ฉันต้องการส่งออกเป็น jar คือไลบรารี Android เรียกว่า "StandOut" และสามารถดาวน์โหลดได้จาก GitHub https://github.com/pingpongboss/StandOut


โปรดให้รายละเอียดเพิ่มเติมเกี่ยวกับไลบรารีที่คุณต้องการส่งออก
gamag

ฉันแก้ไขคำถามของฉันด้วยรายละเอียดของไลบรารี Android
Sage Pourpre

คำตอบ:


85

ไม่สามารถส่งออกไลบรารี Android เป็นไฟล์ jar ได้ อย่างไรก็ตามเป็นไปได้ที่จะส่งออกเป็นaarไฟล์ Aarไฟล์ที่เป็นรูปแบบไบนารีใหม่สำหรับไลบรารี Android มีข้อมูลเกี่ยวกับพวกเขาในงาน Google I / O, เป็นสร้างใหม่ระบบวิดีโอ

ขั้นแรกสร้างไลบรารีใน Android Studio หรือจากบรรทัดคำสั่งที่ออกgradle buildจากไดเร็กทอรีรูทของไลบรารีของคุณ

ซึ่งจะส่งผลให้<yourlibroot>/libs/build/yourlib.aarไฟล์

ไฟล์ aar นี้เป็นการแสดงไบนารีของไลบรารีของคุณและสามารถเพิ่มลงในโปรเจ็กต์ของคุณแทนที่จะเป็นไลบรารีเป็นโปรเจ็กต์การอ้างอิง

ในการเพิ่มไฟล์ aar เป็นการอ้างอิงคุณต้องเผยแพร่ไปยัง maven central หรือไปยังที่เก็บ maven ในเครื่องของคุณจากนั้นอ้างอิงไฟล์ aar ในไฟล์ของโปรเจ็กต์ของgradle.buildคุณ

อย่างไรก็ตามขั้นตอนนี้ค่อนข้างซับซ้อน ฉันพบคำอธิบายที่ดีในการดำเนินการที่นี่:

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


2
นอกจากนี้ยังมีไลบรารี android ขึ้นอยู่กับไลบรารี android อื่น ๆ อาจทำให้สิ่งต่างๆพัง
Loïc Faure-Lacroix

โฟลเดอร์ res จะรวมอยู่ในไฟล์ aar หรือไม่?
Bagusflyer

ดูคำตอบของ @ Wallmart_Hobo ด้านล่างนี้เป็นไปได้และฉันสามารถยืนยันได้ว่า jar ที่ส่งออกทำงานได้ดีในโครงการแอพ eclipse android
Pellet

2
ฉันพบไฟล์ aar ของฉันรวมอยู่ในลิงค์นี้: lib \ build \ outputs \ aar
Simon


44

ฉันสามารถสร้างซอร์สโค้ดของไลบรารีเป็น.jarไฟล์ที่คอมไพล์โดยใช้แนวทางจากโซลูชันนี้: https://stackoverflow.com/a/19037807/1002054

นี่คือรายละเอียดของสิ่งที่ฉันทำ:

1. ที่เก็บไลบรารี Checkout

ในกรณีนี้อาจเป็นห้องสมุดวอลเลย์

2. นำเข้าไลบรารีใน Android Studio

ฉันใช้ Android Studio 0.3.7 ฉันพบปัญหาบางอย่างในระหว่างขั้นตอนนั้นคือฉันต้องคัดลอกgradleโฟลเดอร์จากโครงการ Android ใหม่ก่อนที่ฉันจะสามารถนำเข้าซอร์สโค้ดไลบรารีของ Volley ซึ่งอาจแตกต่างกันไปขึ้นอยู่กับซอร์สโค้ดที่คุณใช้

3. แก้ไขbuild.gradleไฟล์ของคุณ

// 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. เรียกใช้gradlew makeJarคำสั่งจากรูทโปรเจ็กต์ของคุณ

กรณีของฉันฉันต้องคัดลอกgradlew.batและgradleไฟล์จากโครงการ Android ใหม่ลงในรูทโปรเจ็กต์ไลบรารีของฉัน คุณควรค้นหาไฟล์ไลบรารีที่คอมไพล์แล้วmyCompiledLibrary.jarในbuild\libsไดเร็กทอรี

ฉันหวังว่าจะมีคนพบว่าสิ่งนี้มีประโยชน์

แก้ไข:

ข้อแม้

แม้ว่าจะใช้งานได้ แต่คุณจะพบข้อยกเว้นไลบรารีที่ซ้ำกันในขณะที่รวบรวมโปรเจ็กต์ที่มีโมดูลหลายโมดูลโดยที่มากกว่าหนึ่งโมดูล (รวมถึงโมดูลแอปพลิเคชัน) ขึ้นอยู่กับjarไฟล์เดียวกัน(เช่นโมดูลมีไดเร็กทอรีไลบรารีของตัวเองซึ่งอ้างอิงในbuild.gradleโมดูลที่กำหนด) .

ในกรณีที่คุณต้องการใช้ไลบรารีเดียวในโมดูลมากกว่าหนึ่งโมดูลฉันขอแนะนำให้ใช้แนวทางนี้: Android gradle build และ support library


ฉันพบว่าไม่มีวิธีใดที่จะรวม res ไว้ในโถ เป็นไปได้หรือไม่
Bagusflyer

7
ใน Android Studio เวอร์ชันล่าสุดต้องการการเปลี่ยนแปลงเพียงอย่างเดียว: บรรทัดควรอ่านจาก ('build / intermediates / bundle / release /') `
Greg Ennis

@GregEnnis ใช่ แต่ในกรณีของฉันมันคือการสร้างขวดที่มีชื่อ mobule ของฉันและโถที่แท้จริงอยู่ในโถนั้น ฉันได้แตก jar ที่สร้างขึ้นด้วยชื่อโมดูลของฉันเช่น module_name.jar
pyus13

6
@bagusflyer ถ้าคุณต้องการresโฟลเดอร์ไฟล์ AAR ก็ตรงตามนั้น - ไฟล์ JAR ที่resรองรับโฟลเดอร์
Martin Konecny

จะใช้ proguard เพื่อสร้าง jar นี้ได้อย่างไร?
Amrut Bidri

38

เนื่องจาก Android Studio V1.0 ไฟล์ jar จะอยู่ในลิงค์โครงการต่อไปนี้:

เวอร์ชัน debug: "your_app" \ build \ intermediates \ bundles \ debug \ class.jar

เวอร์ชันเผยแพร่: "your_app" \ build \ intermediates \ bundles \ release \ class.jar

ไฟล์ JAR ถูกสร้างขึ้นตามขั้นตอนการสร้างใน Android Studio GUI จะมาจาก Build-> Make Project และจากบรรทัด CMD มันคือ "gradlew build"


3
คุณจะได้รับการ
ฝึกงาน

1
พบว่าใน Build Variants เราต้องเลือก Build Variant เพื่อเป็น 'release' แต่ตอนนี้ class.jar ไม่มีอยู่ในโฟลเดอร์ release!
Aparajith Sairam

1
@AparajithSairam คุณสร้าง JAR บรรทัดคำสั่งหรือ gui ของคุณได้อย่างไร?
Avi Levin

1
@AparajithSairam ฉันพบบางอย่างใน GUI แต่เกี่ยวข้องกับไฟล์ APK ที่สร้างเท่านั้น หลังจากเลือกเวอร์ชันบิวด์ที่เกี่ยวข้องแล้วให้กดไอคอน "เล่น" สีเขียว มันจะเรียกใช้คำสั่ง gradle ประกอบพื้นหลังซึ่งจะสร้างไฟล์ สำหรับไฟล์ JAR ใน CMD คุณจะต้องเรียกใช้ gradlew AssembleDebug หรือ Release หรือรสชาติที่คุณมี หลังจากนั้น JAR จะพร้อมใช้งานในตำแหน่งต่อไปนี้: your_app "\ build \ intermediates \ bundles \" falvor "\ class.jar คุณสามารถดูคำสั่งประกอบทั้งหมดของคุณโดยใช้" gradlew งาน "
Avi Levin

1
ฉันโหวตคำตอบอื่นเมื่อปีที่แล้ว สกรูธุรกิจนั้น นี่คือเค้ก! ขอบคุณ !!
Kevin

31

รวมสิ่งต่อไปนี้ลงใน 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'
    }
}

จากนั้นคุณสามารถดำเนินการ gradle ด้วย: ./gradlew clean javadocRelease jarReleaseซึ่งจะสร้าง Jar ของคุณและ jar javadoc ลงในbuild/libs/โฟลเดอร์

แก้ไข:ด้วย android gradle tools 1.10 + การรับ android SDK dir นั้นแตกต่างจากเมื่อก่อน คุณต้องเปลี่ยนแปลงสิ่งต่อไปนี้ (ขอบคุณ Vishal!):

android.sdkDirectory 

แทน

android.plugin.sdkDirectory

คำตอบที่ดีสิ่งนี้ใช้ได้ผลดีสำหรับฉัน คุณยังสามารถเพิ่มเป้าหมาย gradle ใน android studio เพื่อเรียกใช้งาน jarDebug ซึ่งจะสร้าง jar ที่ใช้งานได้ (ฉันได้ทดสอบสิ่งนี้ในโครงการ eclipse และมันก็ใช้งานได้ดี)
Pellet

8
ทำไมระบบ
บิว

จนถึงตอนนี้เป็นคำตอบเดียวที่ใช้ได้ผล ขอบคุณมาก @Walmart_Hobo
Drew

ทางออกที่ดีในการสร้างไฟล์ JAR! เป็นไปได้หรือไม่ที่จะรวมทรัพยากรด้วย
Gaëtan

12

ฉันสามารถส่งออกไฟล์ jar ใน Android Studio โดยใช้บทช่วยสอนนี้: https://www.youtube.com/watch?v=1i4I-Nph-Cw "วิธีการส่งออก Jar จาก Android Studio"

ฉันอัปเดตคำตอบเพื่อรวมขั้นตอนทั้งหมดสำหรับการส่งออก JAR ใน Android Studio:

1) สร้างโครงการแอปพลิเคชัน Android ไปที่app-> build.gradle

2) เปลี่ยนสิ่งต่อไปนี้ในไฟล์นี้:

  • แก้ไขใช้ปลั๊กอิน: 'com.android.application'เพื่อใช้ปลั๊กอิน: 'com.android.library'

  • ลบสิ่งต่อไปนี้: applicationId, versionCode และ versionName

  • เพิ่มรหัสต่อไปนี้:

// 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) อย่าลืมคลิกซิงค์ทันทีในไฟล์นี้ (ขวาบนหรือใช้ปุ่มซิงค์)

4) คลิกที่แท็บ Gradle (โดยปกติจะอยู่ตรงกลางขวา) และเลื่อนลงไปที่exportjar

5) เมื่อคุณเห็นข้อความที่สร้างสำเร็จในหน้าต่างการทำงานโดยใช้ file explorer ปกติไปที่ jar ที่ส่งออกโดยใช้เส้นทาง: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release คุณจะเห็นในไดเรกทอรีนี้ไฟล์ jar ของคุณ

โชคดี :)


1
ขั้นตอนที่ 2 มีความสำคัญ ไม่มีใครพูดถึงเรื่องนี้ ขอบคุณสิ่งนี้ได้ผลสำหรับฉัน!
pookie

9

นี่เป็นอีกหนึ่งคำตอบที่แตกต่างกันเล็กน้อยพร้อมการปรับปรุงเล็กน้อย

รหัสนี้จะนำ. jar ออกจาก. aar โดยส่วนตัวแล้วนั่นทำให้ฉันมั่นใจมากขึ้นเล็กน้อยว่าบิตที่ส่งผ่าน. jar นั้นเหมือนกับบิตที่ส่งผ่าน. aar นอกจากนี้ยังหมายความว่าหากคุณใช้ ProGuard โถเอาท์พุตจะสับสนตามต้องการ

ฉันยังเพิ่มงาน "makeJar" ขั้นสูงที่สร้างไหสำหรับรูปแบบการสร้างทั้งหมด

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

สำหรับผู้อ่านที่อยากรู้อยากเห็นฉันพยายามหาตัวแปรและพารามิเตอร์ที่ถูกต้องที่ปลั๊กอิน com.android.library ใช้ตั้งชื่อไฟล์. aar ในที่สุดผมก็พบว่าพวกเขาในโครงการของ Android ที่มาเปิดที่นี่


4

เราสามารถส่งออกไฟล์ jar สำหรับโครงการไลบรารี Android โดยไม่มีไฟล์ทรัพยากรโดย Android studio นอกจากนี้ยังต้องการสิ่งที่ฉันพบเมื่อเร็ว ๆ นี้

1. กำหนดค่าไฟล์ build.gradle ของคุณ

    // 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. เรียกใช้ gradlew makeJar ภายใต้รูทโปรเจ็กต์ของคุณ

คุณจะเห็น libs ของคุณภายใต้ dir เป็น build / libs / ถ้าคุณโชคดี

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

หากคุณพบปัญหา "ข้อยกเว้นการหมดเวลาของซ็อกเก็ต" ในบรรทัดคำสั่งดังต่อไปนี้

ใส่คำอธิบายภาพที่นี่

คุณสามารถทำตามขั้นตอนนี้เพื่อเปิดหน้าต่าง Gradle ในส่วนด้านขวาและคลิก "makeJar" บน Android studio เช่นนี้

ใส่คำอธิบายภาพที่นี่

ใส่คำอธิบายภาพที่นี่

จากนั้นไปที่ build / libs dir คุณจะเห็นไฟล์ jar ของคุณ

หวังว่าจะเป็นประโยชน์สำหรับคุณ

โชคดี @.@

ลูน่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.