Android Studio에서 Jar로 라이브러리를 내보내는 방법은 무엇입니까?


84

일부 라이브러리 소스를 다운로드했으며 Android Studio를 사용하여 Jar 파일로 내보내고 싶습니다. Android Studio를 사용하여 jar 파일로 내보내는 방법이 있습니까?

편집하다:

jar로 내보내려는 라이브러리는 Android 라이브러리입니다. "StandOut"이라고하며 GitHub에서 다운로드 할 수 있습니다. https://github.com/pingpongboss/StandOut


내보낼 라이브러리에 대한 자세한 내용을 입력하십시오
gamag

Android 라이브러리의 세부 정보로 내 질문을 편집했습니다.
Sage Pourpre 2013 년

답변:


85

Android 라이브러리를 jar 파일로 내보낼 수 없습니다. 그러나 aar파일 로 내보낼 수 있습니다. Aar파일은 Android 라이브러리의 새로운 바이너리 형식입니다. Google I / O, New Build System 동영상에 이에 대한 정보가 있습니다 .

먼저 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-library에 의존하는 android-library가 있으면 문제가 발생할 수 있습니다.
Loïc Faure-Lacroix

res 폴더가 aar 파일에 포함됩니까?
Bagusflyer 2014 년

아래 @Wallmart_Hobo의 답변을 참조하십시오. 가능하며 내 보낸 항아리가 Eclipse Android 앱 프로젝트에서 제대로 작동하는지 확인할 수 있습니다.
Pellet

2
이 링크에 포함 된 aar 파일을 찾았습니다. lib \ build \ outputs \ aar
Simon


44

.jar이 솔루션의 접근 방식을 사용하여 컴파일 된 파일에 라이브러리 소스 코드를 빌드 할 수있었습니다 . https://stackoverflow.com/a/19037807/1002054

내가 한 일의 분석은 다음과 같습니다.

1. 체크 아웃 라이브러리 저장소

아마도 그것은 Volley 도서관이었다

2. Android Studio에서 라이브러리를 가져옵니다.

Android Studio 0.3.7을 사용했습니다. 이 단계에서 몇 가지 문제가 발생했습니다. 즉, gradleVolley 라이브러리 소스 코드를 가져 오기 전에 새 Android 프로젝트에서 폴더 를 복사해야했습니다 . 사용하는 소스 코드에 따라 다를 수 있습니다.

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.batgradle내 라이브러리 프로젝트 루트에 새로운 안드로이드 프로젝트에서 파일을. 디렉토리 myCompiledLibrary.jar에서 컴파일 된 라이브러리 파일 을 찾아야합니다 build\libs.

누군가 이것이 유용하다고 생각하기를 바랍니다.

편집하다:

경고

작동하지만 여러 모듈이있는 프로젝트를 컴파일하는 동안 중복 라이브러리 예외가 발생합니다. 여기서 둘 이상의 모듈 (애플리케이션 모듈 포함)이 동일한 jar파일 에 의존 합니다 (예 : 모듈에는 build.gradle주어진 모듈 에서 참조되는 자체 라이브러리 디렉토리가 있음 ) .

하나 이상의 모듈에서 단일 라이브러리를 사용해야하는 경우 Android gradle 빌드 및 지원 라이브러리와 같은 접근 방식을 사용하는 것이 좋습니다.


항아리 안에 입술을 넣을 방법이 없다는 것을 알았습니다. 가능합니까?
Bagusflyer 2014 년

7
안드로이드 스튜디오의 최신 버전에서 하나의 변화가 필요합니다 라인 ( '빌드 / 중간 / 번들 / 해제 /')`에서`읽어야합니다
그렉 에니스

@GregEnnis ya, 그러나 내 경우에는 내 mobule 이름으로 항아리를 만들고 실제 항아리는 그 항아리 안에 있습니다. module_name.jar과 같은 모듈 이름으로 생성 된 jar를 추출했습니다.
pyus13 2014-07-25

6
@bagusflyer, res폴더 를 원한다면 AAR 파일은 res폴더를 지원 하는 JAR 파일입니다 .
Martin Konecny

이 항아리를 생성하기 위해 proguard를 적용하는 방법?
Amrut Bidri

37

Android Studio V1.0부터 jar 파일은 다음 프로젝트 링크에서 사용할 수 있습니다.

디버그 버전 : "your_app"\ build \ intermediates \ bundles \ debug \ classes.jar

릴리스 버전 : "your_app"\ build \ intermediates \ bundles \ release \ classes.jar

JAR 파일은 빌드 절차에서 생성됩니다. Android Studio GUI에서는 Build-> Make Project에서 가져오고 CMD 줄에서 "gradlew build"입니다.


3
그대는이 대답을 내 모든 internets를 받아야한다
m02ph3u5

1
Build Variants에서 Build Variant를 'release'로 선택해야합니다. 그러나 이제 classes.jar는 릴리스 폴더에 없습니다!
Aparajith Sairam 2015-06-18

1
@AparajithSairam JAR, 명령 줄 또는 GUI를 어떻게 구축 했습니까?
Avi Levin

1
@AparajithSairam, GUI에서 뭔가를 찾았지만 APK 파일 빌드에만 관련이 있습니다. 관련 빌드 변형을 선택한 후 녹색 "재생"아이콘을 누릅니다. 파일을 생성하는 백그라운드 어셈블리 gradle 명령을 실행합니다. CMD의 JAR 파일의 경우 gradlew assembleDebug 또는 Release 또는 어떤 플레이버를 사용하든 실행해야합니다. JAR 파일은 다음 위치에 사용할 수있을 것이라고 후 : your_app "\ 빌드 \ 중간 \ 번들 \"gradlew 작업 ""당신이 사용하는 모든 어셈블리 명령을 볼 수 있습니다 classes.jar \ "falvor
아비 레빈을

1
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 jarReleaseJar와 javadoc jar가 build/libs/폴더에 빌드됩니다 .

편집 : 안드로이드 gradle 도구 1.10. +를 사용하면 안드로이드 SDK 디렉토리를 얻는 것이 이전과 다릅니다. 다음을 변경해야합니다 (Vishal에게 감사합니다!).

android.sdkDirectory 

대신에

android.plugin.sdkDirectory

훌륭한 대답, 이것은 나를 위해 완벽하게 작동했습니다. 사용 가능한 jar를 생성하는 jarDebug 작업을 실행하기 위해 android studio에 gradle 대상을 추가 할 수도 있습니다 (이클립스 프로젝트에서 테스트했으며 잘 작동합니다).
Pellet

8
"새로운"Android 빌드 시스템이 왜 이렇게 못 생겼습니까?
마틴 코네 크니

지금까지 그것이 효과가 있었던 유일한 대답입니다. @Walmart_Hobo 정말 감사합니다
드류

JAR 파일을 생성하는 훌륭한 솔루션! 리소스도 포함 할 수 있습니까?
Gaëtan

12

이 튜토리얼을 사용하여 Android Studio에서 jar 파일을 내보낼 수있었습니다. https://www.youtube.com/watch?v=1i4I-Nph-Cw "How To Export Jar From Android Studio"

Android Studio에서 JAR을 내보내는 모든 단계를 포함하도록 답변을 업데이트했습니다.

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로 이동 합니다.이 디렉토리에 jar 파일이 표시됩니다.

행운을 빕니다 :)


1
2 단계는 매우 중요합니다. 아무도 이것을 언급하지 않습니다. 감사합니다. 이것은 저에게 효과적이었습니다!
pookie

9

여기에 몇 가지 개선 사항이있는 약간 다른 답변이 있습니다.

이 코드는 .aar에서 .jar을 바로 가져옵니다. 개인적으로 .jar를 통해 배송되는 비트가 .aar를 통해 배송 된 비트와 동일하다는 사실을 좀 더 확신 할 수 있습니다. 이것은 또한 ProGuard를 사용하는 경우 출력 jar가 원하는대로 난독 화된다는 것을 의미합니다.

또한 모든 빌드 변형에 대한 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 파일의 이름을 지정하는 데 사용하는 올바른 변수와 매개 변수를 결정하는 데 어려움을 겪었습니다. 드디어 안드로이드 오픈 소스 프로젝트에서 그들을 발견 여기에 .


4

Android 스튜디오에서 리소스 파일없이 Android 라이브러리 프로젝트 용 jar 파일을 내보낼 수 있습니다. 최근에 만난 것도 요구 사항입니다.

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 /로 표시됩니다.

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

아래와 같이 명령 줄에서 "Socket timeout exception"문제를 만난 경우,

여기에 이미지 설명 입력

다음 단계에 따라 오른쪽에있는 Gradle 창을 열고 Android 스튜디오에서 "makeJar"를 클릭합니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

그런 다음 build / libs dir로 이동하면 jar 파일이 표시됩니다.

도움이 되길 바랍니다.

행운을 빕니다 @.@

루나

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.