#!/bin/zsh # 编译 ViewPanel:注入器(C,无 UI 依赖)+ 面板(纯 Java / Scene2D 反射) set -e HERE="$(cd "$(dirname "$0")" && pwd)" cd "$HERE" # 找一个 JDK(编辑器运行时是 OpenJDK;本机现成的是 /tmp 下的 Temurin 17) if [[ -z "$JAVA_HOME" ]]; then for candidate in /tmp/jdk-17.0.20.1+1/Contents/Home /tmp/jdk*/Contents/Home; do [[ -x "$candidate/bin/javac" ]] && JAVA_HOME="$candidate" && break done fi if [[ -z "$JAVA_HOME" || ! -x "$JAVA_HOME/bin/javac" ]]; then echo "找不到 JDK:请设置 JAVA_HOME" >&2 exit 1 fi mkdir -p build/classes echo "== 编译 Java 侧(javac $("$JAVA_HOME/bin/javac" -version 2>&1))" find src -name '*.class' -delete 2>/dev/null || true "$JAVA_HOME/bin/javac" --release 8 -encoding UTF-8 -d build/classes $(find src -name '*.java') # 保名类清单:这套运行时把 libGDX 基类混淆了,但 ui/* 和 editor/* 保名。 # 旧版本的明文载荷里能直接列出这些类名,用它们做静态字段扫描的候选。 UPDATES="$HOME/Library/Application Support/Spine/updates" if [[ -f "$UPDATES/3.8.99" ]]; then unzip -l "$UPDATES/3.8.99" 2>/dev/null \ | awk '{print $4}' | grep -E '\.class$' | grep -E '^(com|org)/' \ | sed 's#/#.#g; s#\.class$##' | sort -u > build/kept-classes.txt echo "保名类清单: $(wc -l < build/kept-classes.txt) 个" fi echo "== 编译注入器" # 编译成通用二进制:3.8.99 的编辑器是 x86_64 的 Spine_x86(Rosetta), # 只带 arm64 的 dylib 被继承到那个进程会直接 dyld 报错。 clang -dynamiclib -O2 -Wall -Wextra -Wno-unused-parameter \ -arch arm64 -arch x86_64 \ -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" \ -o build/inject.dylib \ native/inject.c echo "== 产物" ls -la build/inject.dylib find build/classes -name '*.class' | sed 's/^/ /'