Files
calendar-lite/build.sh
T
2026-10-15 16:35:05 +02:00

47 lines
1.9 KiB
Bash
Executable File

#!/bin/sh
# Builds GingerCal.apk for Android 2.3 (API 10) without Gradle or aapt.
#
# Needs: JDK 11+ (javac, keytool, jarsigner), python3 with Pillow (icon), and d8.
# D8 command that runs d8 (default: "d8" from Android SDK build-tools on PATH)
# ANDROID_JAR optional: a real platforms/android-10/android.jar; otherwise ./stubs is used
# KEYSTORE optional: signing keystore (created on first build; keep it to allow upgrades)
set -eu
cd "$(dirname "$0")"
OUT=build
D8=${D8:-d8}
KS=${KEYSTORE:-gingercal.keystore}
rm -rf "$OUT"
mkdir -p "$OUT/stubs" "$OUT/classes" "$OUT/dex"
if [ -n "${ANDROID_JAR:-}" ]; then
CP="$ANDROID_JAR"
else
javac -nowarn -Xlint:none --release 8 -d "$OUT/stubs" $(find stubs -name "*.java") 2>/dev/null
CP="$OUT/stubs"
fi
# Java 8 bytecode, Java 6-era APIs only (Android 2.3 runs a Harmony class library).
javac --release 8 -encoding UTF-8 -Xlint:-options -cp "$CP" -d "$OUT/classes" $(find src android -name '*.java')
python3 tools/strip_method_params.py $(find "$OUT/classes" -name '*.class')
# dex format 035 for Dalvik
# (d8 warns about library classes it can't see; harmless since nothing needs desugaring)
$D8 --min-api 9 --release --output "$OUT/dex" $(find "$OUT/classes" -name '*.class') >"$OUT/d8.log" 2>&1 \
|| { cat "$OUT/d8.log"; exit 1; }
python3 tools/mkicon.py "$OUT/icon.png"
python3 tools/mkapk.py AndroidManifest.xml "$OUT/dex/classes.dex" "$OUT/icon.png" "$OUT/unsigned.apk"
if [ ! -f "$KS" ]; then
keytool -genkeypair -keystore "$KS" -storetype PKCS12 -storepass android -keypass android \
-alias gingercal -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 10000 -dname "CN=GingerCal" 2>/dev/null
fi
cp "$OUT/unsigned.apk" "$OUT/signed.apk"
# Android < 4.3 only verifies SHA-1 JAR signatures.
jarsigner -keystore "$KS" -storepass android -digestalg SHA1 -sigalg SHA1withRSA \
"$OUT/signed.apk" gingercal >/dev/null
python3 tools/zipalign.py "$OUT/signed.apk" GingerCal.apk
ls -l GingerCal.apk