在Android aar中包含jar文件和Java源代码

在Android aar中包含jar文件和Java源代码,java,android,gradle,android-gradle-plugin,Java,Android,Gradle,Android Gradle Plugin,我有一个gradle任务来创建一个jar文件,其中包含要包含在androidaar库包中的Java源文件。这些文件将用作JNI的JavaDoc,并被绑定到AAR包中的C++库。 我不可能知道如何包含jar文件而不在其中编译文件。jar文件中的Java文件似乎是编译的,这对我没有帮助——我只想包含它们,以便使用aar包的开发人员可以使用它们 创建的jar文件具有所有源代码,并且位于其libs目录中的输出aar中,但它没有内容 如何将Java源代码添加到aar Jar创建 Jar按如下方式创建,并最

我有一个gradle任务来创建一个jar文件,其中包含要包含在androidaar库包中的Java源文件。这些文件将用作JNI的JavaDoc,并被绑定到AAR包中的C++库。 我不可能知道如何包含jar文件而不在其中编译文件。jar文件中的Java文件似乎是编译的,这对我没有帮助——我只想包含它们,以便使用aar包的开发人员可以使用它们

创建的jar文件具有所有源代码,并且位于其
libs
目录中的输出aar中,但它没有内容

如何将Java源代码添加到aar

Jar创建

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
目录中,但现在它是空的。

我唯一能想到的就是在.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

我没有像您那样为使用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"])
            }
        }
    }
}
tasks.register(name=“sourceJar”){
from(android.sourceset[“main”].java.srcDirs)
分类器=“源”
}
出版{
出版物{
创建(name=“Maven”){
跑{
groupId=“groupId”
artifactId=“模块名称”
version=“1.0”
工件($buildDir/outputs/aar/module name release.aar)
工件(任务[“sourceJar”])
}
}
}
}

用记事本打开损坏的罐子会得到
PK
ENO
ACK
NUL
NUL
NUL
NUL
NUL
NUL
NUL
NUL
NUL
NUL
NUL
NUL
,而记事本给出的是
PK
。在Linux shell中执行
less
会得到
PK^E^F^^^@^^^@^^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
。所以可能不是很有用的输出。创建.jar的gradle代码是什么?我添加了创建jar的gradle代码。Jar归档文件变为空,没有损坏(我做错了什么)。谢谢,这确实有效。至于我问题的一部分:我想在Android Studio中将这个jar用作源代码。当它位于aar中的
libs
目录中时,这是否可能?我现在意识到这可能不是正确的方法。外部使用jar文件并在Android Studio中选择它作为源代码是可行的,但只能选择jar和zip文件作为源代码,而不能选择aar文件。我不知道您是否可以像您所描述的那样在Android Studio中使用jar作为源代码。我不确定你到底在做什么,但是如果我开发一个aar,我希望有些人希望jar带有类,如果他们只是想使用你库中的功能,而其他人如果想更改它,他们会想要源代码。我认为用户不会同时想要这两个。所以我会分发不同的工件,一个是源代码,另一个是aar,最后我把jar和源代码分开分发。这似乎是Android Studio所期望的。如果我从aar打开反编译的源代码,可以单击右上角的
attachsources
,然后选择jar。似乎这是一种“正确”的方法,我在任何地方都找不到任何文档将其包含在aar中。