我现在还记得第一次想在 Android Studio 里打出 Jar 包时的场景:菜单、右键、Build 入口翻了个遍,愣是找不到一个叫“Make Jar”的按钮。后来才明白,Android Studio 默认只给 Android Module 产出 AAR 包,想拿 Jar 得自己动手配 Gradle Task。这篇文章就把这条路完整走一遍,内容包括在 Android Studio 里新建 Java Library、配置 Gradle 打包 Jar 的完整写法、第三方依赖怎么处理、如何用 AAR 中间产物取巧,以及打包后测试、混淆、反编译验证的整套经验。适合想把工具类或 SDK 逻辑抽出来分享给其他项目使用的开发者,也适合刚接触 Gradle 自定义任务的 Android 新手。
1. 先搞清需求:Android 里“Jar 包”到底能干嘛
1.1 Jar 和 AAR,一字之差差在哪
很多人第一次打 Jar 失败,就是因为没想明白 Android 项目的产物到底是什么。Jar 本质上是 Java 字节码和资源文件的压缩包,里面装的是 .class 文件,最多再带一些配置文件、META-INF 目录。它不关心 Android 的资源系统,也没有办法表达 AndroidManifest.xml 里的组件声明。而 AAR 是 Android 专属的库打包格式,重点在于它能携带四样东西:编译后的代码、res 资源目录、AndroidManifest.xml、还有 JNI 的 so 文件。
我见过不少人在工具类模块里写了 R.string 引用,然后试图打成 Jar 扔给别的项目,结果对方一运行就崩或者找不到资源,这就是典型的选择错误。AAR 之所以成为 Android 默认的依赖格式,就是因为 Android 构建系统把资源和代码的绑定关系处理得足够复杂,Jar 这种纯 Java 时代的产物根本装不下。
1.2 什么情况下选 Jar,什么情况下选 AAR
实际项目里我建议按这个标准判断:如果你的模块里不涉及 res、assets、Manifest 配置、so 库,也完全不引用 R 类,代码纯粹是业务逻辑、算法、网络封装、Json 解析这类纯 Java/Kotlin 内容,那 Jar 完全够用,而且比 AAR 更轻、更容易被非 Android 项目复用。反过来说,只要你用到了 res 目录下的任何东西,包括布局、图片、字符串、颜色,或者需要在 Manifest 里注册 Activity、Service、Provider,又或者包含 libs/*.so,那就老老实实出 AAR,别跟自己过不去。
一个很容易踩坑的场景是:代码里只用了 android.util.Log 和 android.text.TextUtils 这类 Android SDK 类,就以为自己写的是“纯 Java”。严格意义上,一旦引用了 android.* 下的 API,这个 Jar 在普通 Java 虚拟机里是跑不起来的,只能在 Android App 里跑。所以打 Jar 的时候要么接受“只能给 Android 用”这个限制,要么尽量把 Android 依赖从核心逻辑里剥离开。
1.3 我为什么一开始走了弯路
我第一次接手这类需求时,直接在 App Module 里写代码,然后跑到 build 目录里到处找 classes.jar。找是找到了,但那个 Jar 是中间产物,包含了 Activity、资源引用、各种依赖,拿去做依赖库用非常奇怪。后来才悟到一件事:打 Jar 应该在独立的 Java Library 模块里做,而不是在你正在开发的 App 模块里做。App 模块天生面向“组装”,它的构建目标是生成 APK;IntelliJ 的 IDEA 项目能一键导 Jar,本质也是因为它默认创建的是纯 Java Module。这句话我希望读者在第一遍读这篇文章时就记住,后面所有步骤都建立在这个认识上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 正路:新建 Java Library 模块,用 Gradle 打 Jar
2.1 为什么不建议在 App 模块里直接打 Jar
在 App 模块下打 Jar 不是完全不行,但会遇到三件麻烦事。第一,App 模块的源码里通常会引用资源、依赖第三方 SDK,编译后的 class 数量巨大,你没法轻松区分哪些是你自己的代码,哪些是依赖的代码,打出来的 Jar 体积和内容都不可控。第二,App 模块使用 com.android.application 插件,这个插件的任务图非常复杂,直接对它自定义 Jar 任务很容易和现有的 bundle、assemble 任务产生耦合,某些 AGP 版本里甚至会重复执行或找不到输出。第三,App 模块的 BuildConfig、资源 R 类、Manifest 生成的类都会被混进来,接收方如果用这个 Jar,会拿到一堆不该有的类。
Java Library 模块用的插件是 java-library,或者老一点写法里的 java 插件,它不参与 APK 构建,打出来的就是一个纯粹的 Jar 任务,干净、好控制、可复现。这也是我推荐的正路。
2.2 创建 Java Library 的实操步骤
在 Android Studio 里操作其实很简单,File > New > New Module > Java Library 或 Java or Kotlin Library(不同版本菜单名称略有差异),给它起个名字,比如 mylib。创建完成后,模块的 build.gradle 大概是这个样子的:
