Kitaplığı Android Studio'da Jar'a nasıl aktarabilirim?


84

Bazı kitaplık kaynaklarını indirdim ve bunu Android Studio kullanarak bir Jar dosyası olarak dışa aktarmak istiyorum. Android stüdyosunu kullanarak jar dosyasına aktarmanın bir yolu var mı?

Düzenle:

Jar olarak dışa aktarmak istediğim kitaplık bir Android kitaplığıdır. Adı "StandOut" ve GitHub'dan indirilebilir. https://github.com/pingpongboss/StandOut


Lütfen dışa aktarmak istediğiniz kütüphane hakkında daha fazla bilgi verin
gamag

Sorumu Android kitaplığının ayrıntılarıyla düzenledim.
Sage Pourpre

Yanıtlar:


85

Bir Android kitaplığını jar dosyası olarak dışa aktarmak mümkün değildir. Bununla birlikte, aardosya olarak dışa aktarmak mümkündür . AarAndroid kitaplıkları için yeni ikili biçim olan dosyalar. New Build System videosu olan Google I / O'da onlar hakkında bilgi var .

Öncelikle, kitaplığı Android Studio'da veya gradle buildkitaplığınızın kök dizininden verilen komut satırından oluşturun .

Bu <yourlibroot>/libs/build/yourlib.aardosya ile sonuçlanacaktır .

Bu aar dosyası, kitaplığınızın ikili gösterimidir ve bir bağımlılık projesi olarak kitaplık yerine projenize eklenebilir.

Aar dosyasını bağımlılık olarak eklemek için, onu maven central'da veya yerel maven deponuzda yayınlamanız ve ardından projenizin dosyasındaki aar dosyasına başvurmanız gerekir gradle.build.

Ancak, bu adım biraz kıvrımlıdır. Bunun nasıl yapılacağına burada iyi bir açıklama buldum:

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


2
diğer android kitaplıklarına bağlı olarak android kitaplığına sahip olmak işleri bozabilir.
Loïc Faure-Lacroix

Res klasörü aar dosyasına dahil edilecek mi?
Bagusflyer

Aşağıdaki @ Wallmart_Hobo'nun cevabına bakın, bu mümkün ve dışa aktarılan kavanozun bir tutulma android uygulaması projesinde iyi çalıştığını onaylayabilirim.
Pellet

2
Bu bağlantıda bulunan aar dosyamı buldum: lib \ build \ outputs \ aar
Simon


44

.jarBu çözümün yaklaşımını kullanarak derlenen dosyaya bir kitaplık kaynak kodu oluşturabildim : https://stackoverflow.com/a/19037807/1002054

İşte yaptığım şeyin dökümü:

1. Kitaplık havuzunu kontrol edin

Belki bir Volley kütüphanesiydi

2. Kitaplığı Android Studio'ya aktarın.

Android Studio 0.3.7 kullandım. Bu adımda bazı sorunlarla karşılaştım, yani gradleVolley kitaplık kaynak kodunu içeri aktarmadan önce yeni android projesinden klasör kopyalamak zorunda kaldım , bu kullandığınız kaynak koda göre değişebilir.

3. build.gradleDosyanızı değiştirin

// 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 makeJarKomutu proje kökünüzden çalıştırın .

Benim durumum , yeni android projesinden kütüphane proje köküme kopyalamak gradlew.batve gradledosyalar yapmak zorunda kaldım . Eğer derlenmiş kitaplığı dosyasını bulmak gerekir myCompiledLibrary.jariçinde build\libsdizine.

Umarım birisi bunu yararlı bulur.

Düzenle:

Uyarı

Bu işe yarasa da, birden fazla modülün (uygulama modülü dahil) aynı jardosyaya bağlı olduğu bir projeyi birden fazla modülle derlerken yinelenen kütüphane istisnasıyla karşılaşacaksınız (örn. Modüller build.gradle, belirli modülde başvurulan kendi kütüphane dizinine sahiptir ) .

Birden fazla modülde tek kitaplık kullanmanız gerektiğinde, şu yaklaşımı kullanmanızı tavsiye ederim: Android gradle oluşturma ve destek kitaplığı


Kavanozun içine rezin dahil edilmesinin bir yolu olmadığını buldum. Mümkün mü?
Bagusflyer

7
Android stüdyosunun son sürümlerinde bir değişiklik gerekiyor: satırda `` from ('build / intermediates / bundles / release /') ``
Greg Ennis

@GregEnnis ya, ama benim durumumda benim mobule ismimle bir kavanoz oluşturuyor ve gerçek kavanoz o kavanozun içinde yatıyor. Oluşturulan jar dosyasını modül adımı modül_adı.jar gibi çıkardım.
pyus13

6
@bagusflyer, resKlasör istiyorsanız , bir AAR dosyası tam olarak budur - resklasör desteği olan bir JAR dosyası .
Martin Konecny

Bu kavanozu oluşturmak için proguard nasıl uygulanır?
Amrut Bidri

37

Android Studio V1.0'dan beri jar dosyası aşağıdaki proje bağlantısında mevcuttur:

hata ayıklama ver: "uygulamanız" \ build \ intermediates \ bundles \ debug \ classes.jar

sürüm sürümü: "uygulamanız" \ build \ intermediates \ bundles \ release \ classes.jar

JAR dosyası, derleme prosedüründe oluşturulur, Android Studio GUI'de Build-> Make Project'ten ve CMD satırından "gradlew build" olur.


3
bu cevap için tüm internetlerimi alacaksınız
m02ph3u5

1
Bulduk, Derleme Varyantlarında, 'sürüm' olarak Derleme Varyantını seçmemiz gerekiyor. Ama şimdi, classes.jar, sürüm klasöründe mevcut değil!
Aparajith Sairam

1
@AparajithSairam JAR, komut satırı veya GUI'nizi nasıl oluşturdunuz?
Avi Levin

1
@AparajithSairam, GUI'de bir şey buldum, ancak bu yalnızca APK dosyaları derlemeleri için geçerli. ilgili yapı varyantını seçtikten sonra yeşil "oynat" simgesine basın. dosyayı oluşturacak bir arka plan derleme gradle komutunu çalıştıracaktır. CMD'deki bir JAR dosyası için, gradlew assembleDebug veya Release veya sahip olduğunuz her çeşidi çalıştırmanız gerekir. Bundan sonra JAR şu konumda kullanılabilir olacaktır: uygulamanız "\ build \ intermediates \ bundles \" falvor "\ classes.jar" gradlew tasks "kullanarak tüm assembly komutlarınızı görebilirsiniz
Avi Levin

1
Bir yıldan uzun süre önce başka bir cevaba oy verdim. Bu işi boşver. Bu pasta! Teşekkürler!!
Kevin

31

Aşağıdakileri build.gradle'a ekleyin:

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

Daha sonra gradle'ı: ile çalıştırabilirsiniz ./gradlew clean javadocRelease jarRelease; bu size Jar'nızı ve ayrıca build/libs/klasörün içine bir javadoc jar'ı oluşturacaktır .

DÜZENLEME: Android gradle araçlarıyla 1.10. + Android SDK dizinini almak öncekinden farklı. Aşağıdakileri değiştirmeniz gerekiyor (teşekkürler Vishal!):

android.sdkDirectory 

onun yerine

android.plugin.sdkDirectory

Harika cevap, bu benim için mükemmel çalıştı. Kullanılabilir kavanozu oluşturacak olan jarDebug görevini çalıştırmak için android stüdyosunda bir gradle hedefi de ekleyebilirsiniz (bunu bir tutulma projesinde test ettim ve aynı zamanda iyi çalışıyor).
Pellet

8
Neden "yeni" Android derleme sistemi onu bu kadar çirkin yapıyor :(.
Martin Konecny

Şimdiye kadar işe yarayan tek cevap buydu. Çok teşekkür ederim @Walmart_Hobo
Drew

Bir JAR dosyası oluşturmak için harika bir çözüm! Kaynakları da dahil etmek mümkün mü?
Gaëtan

12

Bu eğiticiyi kullanarak Android Studio'da bir jar dosyasını dışa aktarabildim: https://www.youtube.com/watch?v=1i4I-Nph-Cw "Android Studio'dan Jar Nasıl Dışa Aktarılır?"

Cevabımı Android Studio'da bir JAR'ı dışa aktarmak için tüm adımları içerecek şekilde güncelledim:

1) Android uygulama projesi oluşturun, app-> build.gradle'a gidin

2) Bu dosyada aşağıdakileri değiştirin:

  • , değiştirmek eklenti geçerlidir: 'com.android.application' için eklentisi geçerlidir: 'com.android.library'

  • aşağıdakileri kaldırın: applicationId, versionCode ve versionName

  • Aşağıdaki kodu ekleyin:

// 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) Bu dosyada şimdi eşitlemeyi tıklamayı unutmayın (sağ üst veya eşitleme düğmesini kullanın).

4) Gradle sekmesine tıklayın (genellikle sağ ortada) ve exportjar'a ilerleyin

5) Çalıştırma penceresinde derleme başarılı mesajını gördükten sonra , normal dosya gezgini kullanarak dışa aktarılan jar'e gidin: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release , bu dizinde jar dosyanızı görmelisiniz.

İyi şanslar :)


1
2. Adım çok önemlidir. Bundan başka kimse bahsetmiyor. Teşekkür ederim, bu benim için çalıştı!
pookie

9

İşte birkaç geliştirme ile biraz farklı bir cevap daha.

Bu kod, .jar'ı .aar'dan çıkarır. Kişisel olarak, bu bana .jar üzerinden gönderilen bitlerin .aar yoluyla gönderilenlerle aynı olduğuna dair biraz daha fazla güven veriyor. Bu ayrıca, ProGuard kullanıyorsanız, çıktı kavanozunun istenildiği gibi gizleneceği anlamına gelir.

Ayrıca tüm yapı varyantları için kavanozlar oluşturan süper bir "makeJar" görevi de ekledim.

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

Meraklı okuyucu için, com.android.library eklentisinin .aar dosyalarını adlandırmak için kullandığı doğru değişkenleri ve parametreleri belirlemekte zorlandım. Sonunda Android Açık Kaynak Projesi içinde buldum burada .


4

Android kitaplık projesi için bir jar dosyasını Android stüdyosu tarafından kaynak dosyaları olmadan dışa aktarabiliriz. Geçenlerde tanıştığım şey de bir gereklilik.

1. build.gradle dosyanızı yapılandırı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. Gradlew makeJar'ı proje kökünüzün altında çalıştırın

Eğer şanslıysanız, liblerinizi build / libs / olarak dir altında göreceksiniz.

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

Aşağıdaki gibi komut satırında "Soket zaman aşımı istisnası" olarak bir sorunla karşılaştıysanız,

görüntü açıklamasını buraya girin

Sağ tarafta Gradle penceresini açmak için bu adımları takip edebilir ve bunun gibi Android stüdyo üzerinde "makeJar" seçeneğine tıklayabilirsiniz

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

Daha sonra build / libs dizinine gidin, jar dosyanızı göreceksiniz.

Umarım sizin için yararlıdır.

İyi şanslar @.@

Luna

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.