#安卓
classes.jar 本质上是一个 JAR(Java Archive)文件,它包含了:
编译后的字节码(所有 .class 文件)
资源文件(可选)
元数据(MANIFEST.MF 等)
my-library.aar
├── classes.jar ← 库的编译代码
├── res/ ← 资源文件
├── AndroidManifest.xml
└── R.txt ← 资源索引
app-debug.apk
├── classes.dex ← 由 classes.jar 转换而来
├── res/
├── lib/ ← native 库
└── AndroidManifest.xml
app/build/intermediates/
├── compile_library_classes_jar/
│ └── release/
│ └── classes.jar ← 编译后的类文件
├── bundle_libs/
│ └── jars/ ← 所有依赖的 classes.jar
└── packaged_res/
对于 Unity 开发者,classes.jar 特别重要是因为:
# Unity 会自动处理 plugins/android/libs 下的 jars
Assets/
└── Plugins/
└── Android/
├── libs/
│ ├── classes.jar ← 你的 Java 代码
│ └── other-lib.jar ← 第三方依赖
├── res/
└── AndroidManifest.xml
// Unity 生成的 build.gradle
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/classes.jar') // 直接引用
}
classes.jar 中的代码可以通过 JNI 与 Unity 的 C# 代码交互:
// 在 classes.jar 中的 Java 代码
public class UnityBridge {
public static void showToast(String message) {
// 调用 Unity 的 C# 方法
UnityPlayer.UnitySendMessage("MainCamera", "OnJavaMessage", message);
}
}
jar tf classes.jar # 列出内容
javap -c MyClass.class # 反汇编字节码
# 解压
jar xf classes.jar
# 重新打包
jar cf new-classes.jar *.class
// C# 中调用 Java 代码
AndroidJavaClass javaClass = new AndroidJavaClass("com.example.MyClass");
javaClass.CallStatic("showToast", "Hello from Unity!");
混淆问题:发布版本可能会被 ProGuard/R8 混淆
版本冲突:多个 jars 可能有重复的类
依赖管理:需要处理传递性依赖
总结:classes.jar 是 Android 开发中的核心中间产物,包含了所有的编译后 Java 字节码,在 Unity 的 Android 插件开发和中起着桥梁作用。