Files

72 lines
2.5 KiB
Bash
Executable File

#!/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"