如何将库导出到Android Studio中的Jar?


84

我已经下载了一些库资源,并希望使用Android Studio将其导出为Jar文件。有没有一种方法可以使用Android Studio导出到jar文件?

编辑:

我想导出为jar的库是一个Android库。它称为“ StandOut”,可以从GitHub下载。 https://github.com/pingpongboss/StandOut


请提供您要导出的库的更多详细信息
-gamag,

我用Android库的详细信息编辑了问题。
Sage Pourpre

Answers:


85

无法将Android库导出为jar文件。但是,可以将其导出为aar文件。Aar文件是Android库的新二进制格式。在Google I / O(新构建系统视频)中有关于它们的信息。

首先,在Android Studio中构建库,或者通过gradle build从库根目录发出的命令行来构建库。

这将导致<yourlibroot>/libs/build/yourlib.aar文件。

此aar文件是您的库的二进制表示形式,可以将其添加到您的项目中,而不是作为依赖项项目添加到库中。

要将aar文件添加为依赖项,您必须将其发布到maven中心或本地maven存储库中,然后在项目文件中引用aargradle.build文件。

但是,此步骤有些复杂。我在这里找到了一个很好的解释:

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


2
也有依赖其他android-library的android-library可能会破坏事情。
卢瓦克福雷-拉克鲁瓦

res文件夹是否将包含在aar文件中?
Bagusflyer 2014年

参见下面的@Wallmart_Hobo的答案,这是可能的,我可以确认导出的jar在eclipse android应用程序项目中工作正常。
Pellet 2014年

2
我发现我的aar文件包含在此链接中:lib \ build \ outputs \ aar
Simon


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从项目根目录运行命令。

我的情况下,我必须将新的android项目中的文件gradlew.batgradle文件复制到我的库项目根目录中。您应该myCompiledLibrary.jarbuild\libs目录中找到已编译的库文件。

我希望有人觉得这有用。

编辑:

警告

尽管此方法有效,但是在编译具有多个模块的项目时会遇到重复的库异常,其中多个模块(包括应用程序模块)依赖于同一jar文件(例如,模块具有自己的库目录,该目录在build.gradle给定模块中引用) 。

如果您需要在一个以上的模块中使用单个库,我建议您使用以下方法: Android gradle构建和支持库


我发现没有办法将res包含在jar中。那可能吗?
Bagusflyer 2014年

7
在Android Studio的最新版本中,需要进行一次更改:行应改为`from('build / intermediates / bundles / release /')`
Greg Ennis 2014年

@GregEnnis是的,但就我而言,它是用我的名字创建一个jar,实际的jar位于该jar中。我提取了创建的jar,其模块名称为module_name.jar。
pyus13

6
@bagusflyer,如果您要res文件夹,则AAR文件正好是-具有文件res夹支持的JAR文件。
Martin Konecny 2014年

如何使用proguard生成此jar?
Amrut Bidri

37

从Android Studio V1.0开始,jar文件可在以下项目链接中找到:

调试版本:“ your_app” \ build \ intermediates \ bundles \ debug \ classes.jar

发布版本:“您的应用” \ build \ intermediates \ bundles \ release \ classes.jar

该JAR文件是在构建过程中创建的。在Android Studio GUI中,它是从Build-> Make Project,在CMD行中是“ gradlew build”。


3
你应得到所有我的互联网络为这个答案
m02ph3u5

1
在Build Variants中找到它,我们必须选择Build Variant作为“发布”。但是现在在发布文件夹中不存在classes.jar!
Aparajith Sairam 2015年

1
@AparajithSairam您是如何构建JAR,命令行或gui的?
阿维·莱文

1
@AparajithSairam,我在GUI中找到了一些东西,但仅与APK文件构建相关。选择相关的构建变体后,按绿色的“播放”图标。它将运行一个后台程序集gradle命令来创建文件。对于CMD中的JAR文件,您将必须运行gradlew assembleDebug或Release或任何您喜欢的版本。之后,可以在以下位置使用JAR:your_app“ \ build \ intermediates \ bundles \” falvor“ \ classes.jar,您可以使用“ gradlew任务”查看所有的汇编命令
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和一个Javadoc jar生成到该build/libs/文件夹中。

编辑:使用android gradle工具1.10。+获得android SDK目录不同于以前。您必须更改以下内容(感谢Vishal!):

android.sdkDirectory 

代替

android.plugin.sdkDirectory

很好的答案,这对我来说非常合适。您还可以在android studio中添加gradle目标以运行jarDebug任务,该任务将创建可用的jar(我已经在eclipse项目中对此进行了测试,并且效果也不错)。
Pellet 2014年

8
为什么“新”的Android构建系统使这种丑陋:(。
马丁Konecny的

到目前为止,这是唯一可行的答案。非常感谢@Walmart_Hobo
Drew

生成JAR文件的绝佳解决方案!是否可以包括资源?
盖坦2014年

12

我可以使用此教程在Android Studio中导出jar文件:https : //www.youtube.com/watch?v= 1i4I-Nph-Cw“如何从Android Studio导出Jar”

我更新了答案,以包括在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)一旦在运行窗口中看到生成成功的消息,使用普通文件浏览器使用以下路径转到导出的jar:C:\ Users \ name \ AndroidStudioProjects \ ProjectName \ app \ release, 您应该在此目录中看到jar文件。

祝好运 :)


1
步骤2很关键。没有人提到这一点。谢谢,这对我有用!
pookie

9

这是另一个略有不同的答案,但有一些增强功能。

此代码从.aar中直接删除.jar。就个人而言,这使我更有信心,通过.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

我们可以导出Android库项目的jar文件,而无需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

如果幸运的话,您会在dir下看到libs为build / libs /。

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

如果您在以下命令行中遇到“套接字超时异常”的问题,

在此处输入图片说明

您可以按照以下步骤打开右侧的Gradle窗口,然后在Android Studio上单击“ makeJar”,如下所示:

在此处输入图片说明

在此处输入图片说明

然后转到build / libs目录,您将看到您的jar文件。

希望对您有帮助。

祝好运 @。@

露娜

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.