Renames the app (label, texts, User-Agent, PRODID, APK) and uses the new launcher icon pack (ldpi to xhdpi, master in art/) instead of drawing one at build time. Reminders show a white calendar glyph in the status bar (stat_notify, 18-48 px) instead of the system's colour alarm clock, which didn't fit the Gingerbread bar. The package name, database and signing key stay, so it installs over GingerCal and keeps its data. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
92 lines
3.9 KiB
Bash
Executable File
92 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# Builds CalendarLite.apk for Android 2.3 (API 10) without Gradle.
|
|
#
|
|
# Needs: JDK 11+ (javac, keytool), python3, and three tools:
|
|
# D8 command that runs d8 (Android SDK build-tools; default "d8" on PATH)
|
|
# APKTOOL path to apktool.jar (https://apktool.org; bundles aapt and smali)
|
|
# APKSIGNER path to apksigner.jar (Android SDK build-tools/<ver>/lib/apksigner.jar)
|
|
# Optional:
|
|
# ANDROID_JAR a real platforms/android-10/android.jar; otherwise ./stubs is used to compile
|
|
# KEYSTORE signing keystore (created on first build; keep it so updates install over)
|
|
set -eu
|
|
cd "$(dirname "$0")"
|
|
OUT=build
|
|
D8=${D8:-d8}
|
|
APKTOOL=${APKTOOL:?set APKTOOL=/path/to/apktool.jar}
|
|
APKSIGNER=${APKSIGNER:?set APKSIGNER=/path/to/apksigner.jar}
|
|
KS=${KEYSTORE:-gingercal.keystore}
|
|
BC_SRC=${BC_SRC:-$HOME/android-toolchain/bcsrc} # Bouncy Castle renamed to com.minamp.bc (Minamp's tools/setup_toolchain.sh)
|
|
VERSION_CODE=$(sed -n 's/.*android:versionCode="\([0-9]*\)".*/\1/p' AndroidManifest.xml)
|
|
VERSION_NAME=$(sed -n 's/.*android:versionName="\([^"]*\)".*/\1/p' AndroidManifest.xml)
|
|
|
|
rm -rf "$OUT"
|
|
mkdir -p "$OUT/stubs" "$OUT/classes" "$OUT/dex" "$OUT/apk/res"
|
|
|
|
# 0. every interface string must have its Galician translation
|
|
python3 tools/check_i18n.py .
|
|
|
|
# 1. compile
|
|
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 -nowarn -cp "$CP" -sourcepath "src:android:$BC_SRC" \
|
|
-d "$OUT/classes" $(find src android -name '*.java')
|
|
python3 tools/strip_method_params.py $(find "$OUT/classes" -name '*.class')
|
|
|
|
# 2. dex (format 035 for Dalvik), then disassemble so smali re-assembles a clean dex
|
|
$D8 --min-api 9 --release --output "$OUT/dex" $(find "$OUT/classes" -name '*.class') >"$OUT/d8.log" 2>&1 \
|
|
|| { cat "$OUT/d8.log"; exit 1; }
|
|
mkdir -p "$OUT/tools"
|
|
javac -nowarn -cp "$APKTOOL" -d "$OUT/tools" tools/Disassemble.java
|
|
java -cp "$APKTOOL:$OUT/tools" Disassemble "$OUT/dex/classes.dex" "$OUT/apk/smali" 8
|
|
|
|
# 3. resources + manifest, compiled by real aapt (v1, the tool of the Gingerbread era)
|
|
cp AndroidManifest.xml "$OUT/apk/"
|
|
cp -r res/* "$OUT/apk/res/" # launcher icon (ldpi..xhdpi) and the status-bar reminder icon
|
|
cp -r assets "$OUT/apk/" # Mozilla root certificates for the bundled TLS
|
|
cat > "$OUT/apk/apktool.yml" <<EOF
|
|
version: 2.9.3
|
|
apkFileName: CalendarLite.apk
|
|
isFrameworkApk: false
|
|
usesFramework:
|
|
ids:
|
|
- 1
|
|
tag: null
|
|
sdkInfo:
|
|
minSdkVersion: 8
|
|
targetSdkVersion: 10
|
|
packageInfo:
|
|
forcedPackageId: 127
|
|
renameManifestPackage: null
|
|
versionInfo:
|
|
versionCode: $VERSION_CODE
|
|
versionName: $VERSION_NAME
|
|
resourcesAreCompressed: false
|
|
sharedLibrary: false
|
|
sparseResources: false
|
|
doNotCompress:
|
|
- resources.arsc
|
|
- png
|
|
EOF
|
|
java -jar "$APKTOOL" -q b --use-aapt1 -api 8 -f -o "$OUT/unsigned.apk" "$OUT/apk"
|
|
|
|
# 4. sign. Android < 4.3 needs a plain v1 (JAR) signature with SHA-1 and no PKCS#7 signed
|
|
# attributes; apksigner picks exactly that for --min-sdk-version 8. (jarsigner does not.)
|
|
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=Calendar Lite" 2>/dev/null
|
|
fi
|
|
java -jar "$APKSIGNER" sign --ks "$KS" --ks-key-alias gingercal --ks-pass pass:android --key-pass pass:android \
|
|
--min-sdk-version 8 --v1-signing-enabled true --v2-signing-enabled false --v3-signing-enabled false \
|
|
--v4-signing-enabled false --out "$OUT/signed.apk" "$OUT/unsigned.apk"
|
|
python3 tools/zipalign.py "$OUT/signed.apk" CalendarLite.apk
|
|
|
|
# 5. refuse to ship anything Android 2.3 would reject
|
|
java -jar "$APKSIGNER" verify --min-sdk-version 8 --max-sdk-version 10 CalendarLite.apk
|
|
python3 tools/check_dex.py CalendarLite.apk
|
|
ls -l CalendarLite.apk
|