在Android aar中包含jar文件和Java源代码
我有一个gradle任务来创建一个jar文件,其中包含要包含在androidaar库包中的Java源文件。这些文件将用作JNI的JavaDoc,并被绑定到AAR包中的C++库。 我不可能知道如何包含jar文件而不在其中编译文件。jar文件中的Java文件似乎是编译的,这对我没有帮助——我只想包含它们,以便使用aar包的开发人员可以使用它们 创建的jar文件具有所有源代码,并且位于其在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按如下方式创建,并最
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
ACKNUL
NUL
NUL
NUL
NULNUL
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中。