#!/usr/bin/env bash # Build Paw Play without Gradle. Android 35 platform + build-tools 35's d8.jar. set -euo pipefail ROOT=$(cd -- "$(dirname -- "$0")" && pwd) TOOLCHAIN=${TOOLCHAIN:-$HOME/android-toolchain} ANDROID_JAR=${ANDROID_JAR:-$TOOLCHAIN/android-35/android.jar} RESOURCE_JAR=${RESOURCE_JAR:-$TOOLCHAIN/android-34/android.jar} D8_JAR=${D8_JAR:-$TOOLCHAIN/android-15/lib/d8.jar} AAPT2=${AAPT2:-aapt2} KEYSTORE=${KEYSTORE:-$ROOT/keystore/catplay.jks} STOREPASS=${STOREPASS:-catplay-local} KEYPASS=${KEYPASS:-catplay-local} export STOREPASS KEYPASS ALIAS=${ALIAS:-catplay} BUILD_DIR=${BUILD_DIR:-$ROOT/build} APK_OUT=${APK_OUT:-$ROOT/猫爪游乐场.apk} if [[ ${RELEASE_BUILD:-0} == 1 && ! -f "$KEYSTORE" ]]; then echo "release build requires the existing signing keystore: $KEYSTORE" >&2 exit 1 fi for f in "$ANDROID_JAR" "$RESOURCE_JAR" "$D8_JAR"; do [[ -f "$f" ]] || { echo "missing toolchain file: $f" >&2; exit 1; } done if [[ ! -f "$KEYSTORE" ]]; then mkdir -p "$(dirname "$KEYSTORE")" keytool -genkeypair -v \ -keystore "$KEYSTORE" -storetype PKCS12 \ -alias "$ALIAS" -keyalg RSA -keysize 2048 -validity 10000 \ -storepass:env STOREPASS -keypass:env KEYPASS \ -dname "CN=PawPlay, OU=Local, O=PawPlay, L=Local, ST=Local, C=CN" >/dev/null fi rm -rf "$BUILD_DIR" mkdir -p "$BUILD_DIR/gen" "$BUILD_DIR/classes" "$BUILD_DIR/dex" "$AAPT2" compile --dir "$ROOT/res" -o "$BUILD_DIR/res.zip" "$AAPT2" link -o "$BUILD_DIR/unsigned.apk" \ -I "$RESOURCE_JAR" \ --manifest "$ROOT/AndroidManifest.xml" \ --java "$BUILD_DIR/gen" \ "$BUILD_DIR/res.zip" SRC=$(find "$ROOT/src" -name '*.java' -print) javac -source 8 -target 8 -Xlint:-options -encoding UTF-8 \ -cp "$ANDROID_JAR" -d "$BUILD_DIR/classes" \ $SRC "$BUILD_DIR/gen/com/local/pawplay/R.java" jar cf "$BUILD_DIR/classes.jar" -C "$BUILD_DIR/classes" . java -cp "$D8_JAR" com.android.tools.r8.D8 \ --min-api 26 --lib "$ANDROID_JAR" \ --output "$BUILD_DIR/dex" "$BUILD_DIR/classes.jar" python3 - "$BUILD_DIR" <<'PY' import sys, pathlib, zipfile p = pathlib.Path(sys.argv[1]) with zipfile.ZipFile(p / 'unsigned.apk', 'a', compression=zipfile.ZIP_DEFLATED) as z: z.write(p / 'dex/classes.dex', 'classes.dex') PY rm -f "$APK_OUT" apksigner sign \ --ks "$KEYSTORE" --ks-key-alias "$ALIAS" \ --ks-pass env:STOREPASS --key-pass env:KEYPASS \ --out "$APK_OUT" "$BUILD_DIR/unsigned.apk" apksigner verify --verbose "$APK_OUT" | sed -n '1,12p' echo "Built: $APK_OUT" ls -lh "$APK_OUT"