在Android aar中包含带有Java源代码的jar文件

5
我有一个gradle任务,需要创建一个jar文件,其中包含Java的源文件,以便在Android aar库中包含这些文件作为JNI到C++库的Javadoc。我无法弄清楚如何仅“包括”jar文件而不编译其中的文件。似乎jar文件中的Java文件已被编译,这对我没有帮助——我只想“包括”它们,以便开发人员可以使用该aar包。创建的jar文件包含所有源代码,并位于输出aar内的其libs目录中,但其没有内容。我该如何将Java源添加到我的aar中?
"Jar creation" 请按照以下方式创建Jar文件,并将其放置于模块的build/libs文件夹中。
task generateMySources(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}

artifacts {
    archives generateMySources
}

preBuild.dependsOn(":myModule:generateMySources")

dependencies {
    // The jar is included but it is empty inside the aar.
    compile files('build/libs/myModule-sources.jar')
}

输出的jar包中包含以下内容:
.
├── com
│   └── my
│       └── app
│           └── jni
│               ├── File1.java
│               ├── File2.java
│               ├── File3.java
│               └── File4.java
└── META-INF
    └── MANIFEST.MF // Contains "Manifest-Version: 1.0" only.

这个 Jar 文件存在于 aar 文件中的 libs 目录下,但现在它是空的。


使用Notepad++打开损坏的jar文件会显示PK ENO ACK NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL NUL,而使用记事本则会显示PK 。在Linux shell中执行less命令会显示PK^E^F^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@。因此这些输出可能并不是很有用。 - Krøllebølle
创建 .jar 的 Gradle 代码是什么? - David Rawson
1
我添加了用于创建Jar的Gradle代码。Jar归档文件变为空,而不是损坏(我做错了什么)。 - Krøllebølle
2个回答

6

我能想到的唯一方法是在生成 .aar 文件后,像下面这样将您的源代码添加到文件中:

task generateMySources(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs
}
task addMySourcesToAar(type: Jar) {
    archiveName "myModuleWithSources.aar"
    destinationDir file("build")
    from zipTree("build/outputs/aar/myModule-release.aar")
    from fileTree("build").include("libs/myModule-sources.jar")
}
afterEvaluate { project ->
    project.tasks.preBuild.dependsOn generateMySources
    project.addMySourcesToAar.dependsOn build
}
artifacts {
    archives addMySourcesToAar.archivePath
}

并运行

./gradlew myModule:addMySourcesToAar

我没有像你那样向依赖项中添加任何内容


谢谢,这绝对有效。至于我的问题的一部分:我想在Android Studio中使用这个jar作为源代码。如果将其放在aar内的“libs”目录中,是否可能实现?我现在意识到这可能不是正确的方法。将jar文件放在外部并在Android Studio中选择它作为源代码是可行的,但只能选择jar和zip文件作为源,而不能选择aar文件。 - Krøllebølle
我不确定你是否可以像你描述的那样在Android Studio中使用jar作为源代码。我不确定你具体在做什么,但如果我正在开发aar,我会期望有些人只想使用库中的功能,他们会需要包含类的jar文件,而其他人则需要源代码以进行更改。我不认为用户会同时需要两者。因此,我会分发单独的构件,一个是源代码,另一个是aar。 - dweebo
最终我选择将带有源代码的jar包单独分发。这似乎是Android Studio的预期操作方式。如果我从aar中打开反编译后的源代码,可以在右上角点击“附加源码”,并选择jar包。这似乎是正确的做法,但我无法找到任何文档来说明如何将其包含在aar中。 - Krøllebølle

3

对于正在使用Gradle Kotlin DSL的用户:

tasks.register<Jar>(name = "sourceJar") {
    from(android.sourceSets["main"].java.srcDirs)
    classifier = "sources"
}

publishing {
    publications {
        create<MavenPublication>(name = "Maven") {
            run {
                groupId = "groupId"
                artifactId = "module-name"
                version = "1.0"
                artifact("$buildDir/outputs/aar/module-name-release.aar")
                artifact(tasks["sourceJar"])
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接