Android Studio 模块编译打包出jar¶
更新日期: 2025-08-28
- 2025-08-28 增加kts打包的例子
- 2025-07-10 高版本agp打包后,低版本使用jar包会报错
- 2025-05-22 更新
- 2023-11-23 合并jar的方法
- 2023-10-17 创建文档
开发环境
- Android Studio Jellyfish | 2023.3.1 Patch 1
- Android Studio Electric Eel | 2022.1.1 Patch 2
Android Studio 模块打包出jar¶
除了打包成aar,Android Studio也可以打包出jar。
需要我们在gradle中新增一个打jar包任务(task)
以下是模块完整的gradle
gradle相关方法说明
1、Task 类型:(type: Copy) 表示继承 Copy 这个类
2、from 和 into 是复制文件使用的方法
执行这个gradle任务即可看到效果。
使用 Android Studio Meerkat | 2024.3.1 Patch 1¶
版本信息如下:
Android Studio Meerkat | 2024.3.1 Patch 1
Build #AI-243.24978.46.2431.13208083, built on March 13, 2025
Runtime version: 21.0.5+-13047016-b750.29 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Toolkit: sun.lwawt.macosx.LWCToolkit
这个版本的as使用的Runtime version: 21.0.5
,它编译出来的字节码不能被用老版本gradle的app直接使用。
比如有个app工程使用jar包。
这个工程项目级别的gradle,指定了agp版本7.4.2
项目的gradle版本是7.5
gradle/wrapper/gradle-wrapper.properties
文件
使用gradle-8打包的jar,在项目编译时就会报D8错误
{"kind":"error","text":"java.lang.NullPointerException: Cannot invoke \"String.length()\" because \"<parameter1>\" is null","sources":[{"file":"E:\\transformed\\jetified-你的lib.jar"}],"tool":"D8"}
如果一定要用gradle-8以及对应agp来打包,需要做如下修改
from的路径是 build/intermediates/aar_main_jar/release/syncReleaseLibJars
参考: https://stackoverflow.com/questions/16763090/how-to-export-library-to-jar-in-android-studio
负责打包基础库的工程,不要升级as、gradle到最新版本
Mac上可以同时安装2个版本的Android Studio。安装后一个as时选择保留两者即可。
执行gradle任务¶
可以在Android Studio右边的Gradle栏目里找到makeJar这个任务。
一般在 libName -> Tasks -> other -> makeJar
执行过一次后,在顶部任务栏中能找到这个任务
合并jar包¶
再makeJar基础上,再添加一个任务。把模块里的第三方jar包合并进去。
上面用了过时的属性 destinationDir archiveName
kts makeJar 例子¶
在模块的 build.gradle.kts 文件中,添加打包jar的方法。和上文类似,任务类型是Copy
,并且依赖于build
工程配置为:
- gradle-8.6-bin
- agp = "8.4.0"
方法代码如下:
// 打包成jar 但是不带其他依赖
tasks.register<Copy>("makeJar") {
dependsOn("build")
// 1. 删除已存在的 JAR 文件
// 使用 delete() 函数可以安全地删除文件或目录
delete("build/libs/rustfisher-SDK.jar")
// 2. 设置要拷贝的文件
// from() 函数用于指定源文件或目录
from(file("build/intermediates/aar_main_jar/release/syncReleaseLibJars"))
// 3. 设置 JAR 包的输出目录
// into() 函数用于指定目标目录
into(file("build/libs/"))
// 4. 设置过滤和重命名
// include() 和 rename() 方法用于过滤和重命名文件
include("classes.jar")
rename { fileName ->
// 使用 lambda 表达式来处理重命名逻辑
if (fileName == "classes.jar") {
"rustfisher-SDK.jar"
} else {
fileName // 如果文件名不匹配,则保持不变
}
}
}
参考¶
本站说明
一起在知识的海洋里呛水吧。广告内容与本站无关。如果喜欢本站内容,欢迎投喂作者,谢谢支持服务器。如有疑问和建议,欢迎在下方评论~