classes.jar.md 2.9 KB

#安卓

本质是什么?

classes.jar 本质上是一个 JAR(Java Archive)文件,它包含了:

  1. 编译后的字节码(所有 .class 文件)

  2. 资源文件(可选)

  3. 元数据(MANIFEST.MF 等)

产生场景和位置:

1. Android Library Module(AAR 包内)

my-library.aar
├── classes.jar       ← 库的编译代码
├── res/              ← 资源文件
├── AndroidManifest.xml
└── R.txt             ← 资源索引

2. Android App Module(APK 包内)

app-debug.apk
├── classes.dex       ← 由 classes.jar 转换而来
├── res/
├── lib/              ← native 库
└── AndroidManifest.xml

3. Gradle 构建过程中

app/build/intermediates/
├── compile_library_classes_jar/
│   └── release/
│       └── classes.jar ← 编译后的类文件
├── bundle_libs/
│   └── jars/ ← 所有依赖的 classes.jar
└── packaged_res/

在 Unity 中的重要性:

对于 Unity 开发者,classes.jar 特别重要是因为:

1. Android 插件开发

# Unity 会自动处理 plugins/android/libs 下的 jars
Assets/
└── Plugins/
    └── Android/
        ├── libs/
        │   ├── classes.jar     ← 你的 Java 代码
        │   └── other-lib.jar   ← 第三方依赖
        ├── res/
        └── AndroidManifest.xml

2. Gradle 依赖管理

// Unity 生成的 build.gradle
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation files('libs/classes.jar')  // 直接引用
}

3. 与 Unity 的交互

classes.jar 中的代码可以通过 JNI 与 Unity 的 C# 代码交互:

// 在 classes.jar 中的 Java 代码
public class UnityBridge {
    public static void showToast(String message) {
        // 调用 Unity 的 C# 方法
        UnityPlayer.UnitySendMessage("MainCamera", "OnJavaMessage", message);
    }
}

常见操作:

1. 查看 jar 内容

jar tf classes.jar          # 列出内容
javap -c MyClass.class      # 反汇编字节码

2. 解压和重新打包

# 解压
jar xf classes.jar

# 重新打包  
jar cf new-classes.jar *.class

3. 在 Unity 中调试

// C# 中调用 Java 代码
AndroidJavaClass javaClass = new AndroidJavaClass("com.example.MyClass");
javaClass.CallStatic("showToast", "Hello from Unity!");

注意事项:

  1. 混淆问题:发布版本可能会被 ProGuard/R8 混淆

  2. 版本冲突:多个 jars 可能有重复的类

  3. 依赖管理:需要处理传递性依赖

总结classes.jar 是 Android 开发中的核心中间产物,包含了所有的编译后 Java 字节码,在 Unity 的 Android 插件开发和中起着桥梁作用。