Як експортувати бібліотеку в Jar в Android Studio?


84

Я завантажив деякі бібліотечні джерела і хотів би експортувати їх як файл 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, відео New System System .

Спочатку побудуйте бібліотеку в Android Studio або з командного рядка, що видається gradle buildз кореневого каталогу вашої бібліотеки.

Це призведе до <yourlibroot>/libs/build/yourlib.aarфайлу.

Цей файл aar є двійковим поданням вашої бібліотеки і може бути доданий до вашого проекту замість бібліотеки як проект залежності.

Щоб додати файл aar як залежність, потрібно опублікувати його в центральній системі maven або у вашому локальному сховищі maven, а потім вказати файл aar у файлі вашого проекту gradle.build.

Однак цей крок трохи заплутаний. Я знайшов хороше пояснення, як це зробити тут:

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


2
також наявність андроїд-бібліотеки залежно від іншої андроїд-бібліотеки може розбити речі.
Loïc Faure-Lacroix

Чи буде папка res включена до файлу aar?
Bagusflyer

див. відповідь @ Wallmart_Hobo нижче, це можливо, і я можу підтвердити, що експортована банка чудово працює в проекті додатка eclipse android.
Pellet

2
Я знайшов свій файл aar, включений у це посилання: lib \ build \ outputs \ aar
Саймон


44

Я зміг створити вихідний код бібліотеки для скомпільованого .jarфайлу, використовуючи підхід з цього рішення: https://stackoverflow.com/a/19037807/1002054

Ось розбивка того, що я зробив:

1. Оформити сховище бібліотеки

Можливо, це була бібліотека Воллі

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 і бібліотека підтримки


Я виявив, що немає можливості включити res всередину банки. Це можливо?
Bagusflyer

7
В останніх версіях Android Studio потрібна одна зміна: рядок повинен читати `from ('build / intermediates / bundles / release /')`
Грег Енніс,

@GregEnnis ya, але в моєму випадку це створює банку з моїм ім'ям мобули, і фактична банка лежить всередині цієї банки. Я витягнув створену банку з моїм ім'ям модуля, наприклад module_name.jar.
pyus13

6
@bagusflyer, Якщо ви хочете resпапку, файл AAR - це саме це - файл JAR з resпідтримкою папок.
Martin Konecny

як застосувати proguard для створення цієї банки?
Амрут Бідрі,

37

Оскільки Android Studio V1.0 файл jar доступний за таким посиланням на проект:

налагоджувальна версія: "your_app" \ build \ intermediates \ bundles \ debug \ classes.jar

Release ver: "your_app" \ build \ intermediates \ bundles \ release \ classes.jar

Файл JAR створюється за процедурою збірки, в графічному інтерфейсі Android Studio це з Build-> Make Project, а з рядка CMD - "gradlew build".


3
ти отримаєш усі мої інтернети за цю відповідь
m02ph3u5,

1
Знайшов це, у Варіантах збірки ми повинні вибрати Варіант збірки, щоб бути «випуском». Але зараз classes.jar відсутній у папці випуску!
Aparajith Sairam

1
@AparajithSairam, як ти створив свій JAR, командний рядок або графічний інтерфейс?
Аві Левін

1
@AparajithSairam, я знайшов щось у графічному інтерфейсі, але це стосується лише збірки файлів APK. після вибору відповідного варіанту збірки натисніть зелений значок "відтворити". він запустить команду gradle у фоновому режимі, яка створить файл. Для файлу JAR у CMD вам доведеться запустити gradlew assembleDebug або Release або будь-який інший смак. Після цього JAR буде доступний у такому розташуванні: your_app "\ build \ intermediates \ bundles \" falvor "\ classes.jar, ви зможете побачити всі свої команди збірки за допомогою" gradlew tasks "
Avi Levin

1
Більше року тому я підтримав іншу відповідь. Закрути цю справу. Це торт! Дякую!!
Кевін

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-файл jar у build/libs/папці.

РЕДАКТУВАТИ : За допомогою інструментів android gradle 1.10. + Отримання режиму Android SDK відрізняється від попереднього. Ви повинні змінити наступне (дякую Вішале!):

android.sdkDirectory 

замість

android.plugin.sdkDirectory

Чудова відповідь, це прекрасно для мене спрацювало. Ви також можете додати ціль gradle в андроїд-студії, щоб запустити завдання jarDebug, яка створить придатну jar (я тестував це в проекті eclipse, і він також чудово працює).
Pellet

8
Чому "нова" система збірки Android робить це таким потворним :(.
Мартін Конечні

Поки що це єдина відповідь, яка спрацювала. Велике спасибі @Walmart_Hobo
Дрю

Чудове рішення для створення файлу 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) Як тільки ви побачите повідомлення про успішну збірку у вікні запуску, за допомогою звичайного провідника файлів перейдіть до експортованого jar, використовуючи шлях: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release, ви повинні побачити в цьому каталозі свій файл jar.

Щасти :)


1
Крок 2 є критичним. Про це більше ніхто не згадує. Дякую, це у мене вийшло!
pookie

9

Ось ще одна, трохи інша відповідь із кількома вдосконаленнями.

Цей код витягує .jar прямо з .aar. Особисто це додає мені трохи більшої впевненості в тому, що біти, що передаються через .jar, такі ж, як ті, що передаються через .aar. Це також означає, що якщо ви використовуєте ProGuard, вихідний jar буде затулений за бажанням.

Я також додав супер "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 Open Source тут .


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 під коренем вашого проекту

Ви побачите свої бібліотеки під папкою як build / libs /, якщо вам пощастить.

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

Якщо ви зустріли проблему як "виняток часу очікування сокета" в командному рядку, як показано нижче,

введіть тут опис зображення

Ви можете виконати ці дії, щоб відкрити вікно Gradle у правій частині та натиснути "makeJar" у студії Android,

введіть тут опис зображення

введіть тут опис зображення

Потім перейдіть до директорії build / libs, і ви побачите свій файл jar.

Сподіваюся, що це корисно для вас.

Щасти @.@

Луна

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.