【问题标题】:Build a jar file that contains its dependencies classes with android-plugin使用 android-plugin 构建一个包含其依赖类的 jar 文件
【发布时间】:2015-05-17 19:47:32
【问题描述】:

我正在编写一个安卓 SDK。我正在使用 gradle 和 android studio。

传奇:

  • X.jar - 第三方 jar 文件。
  • Y.jar - 我最终的 android SDK jar 文件,依赖于 X.jar。
  • someApp - 一个使用/依赖于 Y.jar 的 Android 应用。

问题:

someApp 无法识别 X.jar 中的类

我已经(几乎一天)搜索了生成带有 X.jar 类的 Y.jar 的方法(而不仅仅是在其中包含 X.jar 文件),但不幸的是我失败了。我发现的许多解决方案都不够清楚或不适合我的情况。

非常感谢您的帮助和指导。

这是我的相关代码sn-p(基于此answer):

我的 SDK 项目的 build.gradle 代码 - 创建 Y.jar:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            java {
                srcDir 'src/main/java'
            }
            resources {
                srcDir 'src/../libs'
            }
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:21.0.3'
    compile files('libs/X.jar')
}

task clearJar(type: Delete) {
    delete 'build/outputs/Y.jar'
}

task makeJar(type: Copy) {

    from('build/intermediates/bundles/release/')
    into('build/outputs/')
    include('classes.jar')
    rename ('classes.jar', 'Y.jar')
}

makeJar.dependsOn(clearJar, build)

运行 'gradlew makeJar' 在 build/outputs 目录中生成 Y.jar。

【问题讨论】:

  • 作为切线,您不需要单独创建clearJar 任务。 Gradle 将自动创建任务cleanMakeJar,这将删除makeJar 任务的输出。此外,让makeJar 依赖于clearJar 效率非常低,因为它将否定 Gradle 仅在输入或输出发生更改时才执行任务的尝试(请参阅gradle.org/docs/current/userguide/…
  • 你为什么使用'src/../libs' 而不是仅仅使用libs
  • @Jolta 你说的一切都是正确的。但仍然没有回答我的问题:(
  • 好吧,我没有那个答案,所以我尽我所能......

标签: android jar android-studio sdk gradle


【解决方案1】:

好吧,对于那些有类似问题的人,我在这里添加一个快速的“解决方法”,帮助我解决我的问题。

** 这可能不是“官方”方式,但它对我有用。

我最终做的是:

  1. 从 X.jar 中提取所有文件。这样做之后,我有了这个文件层次结构: com\X\sdk。
  2. 将“com”文件夹放入“libs”文件夹中。

注意:确保你有这样的资源减速:

sourceSets {
    main.java.srcDir 'src/main/java'
    main.resources.srcDir 'libs'
}

就是这样。我剩下要做的就是调用“gradlew makeJar”,现在我的 Y.jar 也包含 X.jar 类。

如果有人有更好的解决方案,请分享:)

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 2014-01-08
    • 1970-01-01
    • 2011-06-24
    • 2015-08-27
    • 2012-04-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多