Как экспортировать библиотеку в Jar в Android Studio?

84

Я загрузил несколько исходных файлов библиотеки и хотел бы экспортировать их как файл Jar с помощью Android Studio. Есть ли способ экспортировать в файл jar с помощью студии Android?

редактировать:

Библиотека, которую я хочу экспортировать как jar, - это библиотека Android. Он называется StandOut и может быть загружен с GitHub. https://github.com/pingpongboss/StandOut

Шалфей Пурпре
источник
Расскажите подробнее о библиотеке, которую вы хотите экспортировать
gamag
Я отредактировал свой вопрос с подробностями библиотеки Android.
Sage Pourpre

Ответы:

85

Невозможно экспортировать библиотеку Android в виде файла jar. Однако его можно экспортировать как aarфайл. Aarfiles - это новый двоичный формат для библиотек Android. Информация о них есть в Google I / O, видео о новой системе сборки .

Сначала создайте библиотеку в 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
также наличие android-библиотеки в зависимости от другой android-библиотеки может нарушить работу.
Loïc Faure-Lacroix
Будет ли папка res включена в файл aar?
Bagusflyer
см. ответ @ Wallmart_Hobo ниже, это возможно, и я могу подтвердить, что экспортированная банка отлично работает в проекте приложения для Android eclipse.
Pellet
2
Я нашел свой файл aar, включенный в эту ссылку: lib \ build \ output \ aar
Саймон
См. Этот stackoverflow.com/questions/19034466/…
TeeTracker
44

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

Вот что я сделал:

1. Репозиторий библиотеки Checkout

Возможно, это была библиотека Volley.

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файлы из нового андроида проекта в моей библиотеке корня проекта. Вы должны найти файл скомпилированной библиотеки myCompiledLibrary.jarв build\libsкаталоге.

Надеюсь, кому-то это пригодится.

Редактировать:

Предостережение

Хотя это работает, вы столкнетесь с исключением дублирующейся библиотеки при компиляции проекта с несколькими модулями, когда более одного модуля (включая модуль приложения) зависит от одного и того же jarфайла (например, модули имеют собственный каталог библиотеки, на который есть ссылка в build.gradleданном модуле) .

В случае, если вам нужно использовать одну библиотеку более чем в одном модуле, я бы рекомендовал использовать этот подход: сборка Android gradle и библиотека поддержки.

7hny
источник
Я обнаружил, что нет возможности включить res в банку. Это возможно?
Bagusflyer
7
В последних версиях Android studio требуется одно изменение: строка должна читать `from ('build / intermediate / bundles / release /')`
Грег Эннис
@GregEnnis ya, но в моем случае он создает банку с моим именем mobule, и фактическая банка находится внутри этой банки. Я извлек созданную банку с именем моего модуля, например имя_модуля.jar.
pyus13
6
@bagusflyer, Если вам нужна resпапка, то файл AAR именно такой - файл JAR с resподдержкой папок.
Мартин Конечны
как применить proguard для создания этой банки?
Амрут Бидри
37

Начиная с Android Studio V1.0 файл jar доступен по следующей ссылке на проект:

версия отладки: "ваше_приложение" \ build \ intermediate \ bundles \ debug \ classes.jar

версия выпуска: "ваше_приложение" \ build \ intermediate \ 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. после выбора соответствующего варианта сборки нажмите зеленый значок «play». он запустит команду gradle фоновой сборки, которая создаст файл. Для файла JAR в CMD вам нужно будет запустить gradlew buildDebug или Release или любой другой вариант, который у вас есть. После этого JAR будет доступен по следующему адресу: your_app "\ build \ intermediate \ bundles \" falvor "\ classes.jar, вы можете видеть все свои команды сборки, используя" gradlew tasks "
Ави Левин
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, а также javadoc jar в build/libs/папке.

РЕДАКТИРОВАТЬ: с инструментами Android Gradle 1.10. + Получение каталога Android SDK отличается от предыдущего. Вы должны изменить следующее (спасибо Vishal!):

android.sdkDirectory 

вместо

android.plugin.sdkDirectory
Андрей
источник
Отличный ответ, это отлично сработало для меня. Вы также можете добавить цель gradle в студии Android для запуска задачи jarDebug, которая создаст используемую банку (я тестировал это в проекте 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) Как только вы увидите сообщение об успешной сборке в окне запуска, с помощью обычного файлового проводника перейдите к экспортированной банке, используя путь: C: \ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release, вы должны увидеть в этом каталоге ваш файл jar.

Удачи :)

RMDev
источник
1
Шаг 2 имеет решающее значение. Больше никто об этом не упоминает. Спасибо, у меня это сработало!
pookie
9

Вот еще один, немного другой ответ с некоторыми улучшениями.

Этот код берет .jar прямо из .aar. Лично мне это дает немного больше уверенности в том, что биты, отправленные через .jar, такие же, как и отправленные через .aar. Это также означает, что если вы используете ProGuard, выходной jar-файл будет обфусцирован по желанию.

Я также добавил суперзадачу makeJar, которая делает jar-файлы для всех вариантов сборки.

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 Project здесь .

Дэвид
источник
4

Мы можем экспортировать файл jar для проекта библиотеки Android без файлов ресурсов от студии Android. Это тоже требование, с которым я недавно столкнулся.

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.

Надеюсь, что это будет полезно для вас.

Удачи @.@

Луна

Луна Конг
источник