GingerCal 1.1: apksigner v1 signing so Android 2.3 installs it; add Pangolin VPS setup notes
This commit is contained in:
1 parent
01f49852ab
commit
f44ecf4871
10 files changed
+267
-246
No files matched your search
@@ -1,46 +1,87 @@
|
||||
#!/bin/sh
|
||||
# Builds GingerCal.apk for Android 2.3 (API 10) without Gradle or aapt.
|
||||
# Builds GingerCal.apk for Android 2.3 (API 10) without Gradle.
|
||||
#
|
||||
# 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)
|
||||
# Needs: JDK 11+ (javac, keytool), python3 with Pillow (icon), 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}
|
||||
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"
|
||||
mkdir -p "$OUT/stubs" "$OUT/classes" "$OUT/dex" "$OUT/apk/res/drawable" "$OUT/apk/res/drawable-ldpi"
|
||||
|
||||
# 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 -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)
|
||||
# 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
|
||||
|
||||
python3 tools/mkicon.py "$OUT/icon.png"
|
||||
python3 tools/mkapk.py AndroidManifest.xml "$OUT/dex/classes.dex" "$OUT/icon.png" "$OUT/unsigned.apk"
|
||||
# 3. resources + manifest, compiled by real aapt (v1, the tool of the Gingerbread era)
|
||||
cp AndroidManifest.xml "$OUT/apk/"
|
||||
cp -r res/values "$OUT/apk/res/"
|
||||
python3 tools/mkicon.py "$OUT/apk/res/drawable/icon.png" 48
|
||||
python3 tools/mkicon.py "$OUT/apk/res/drawable-ldpi/icon.png" 36
|
||||
cat > "$OUT/apk/apktool.yml" <<EOF
|
||||
version: 2.9.3
|
||||
apkFileName: GingerCal.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=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
|
||||
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" GingerCal.apk
|
||||
|
||||
# 5. refuse to ship anything Android 2.3 would reject
|
||||
java -jar "$APKSIGNER" verify --min-sdk-version 8 --max-sdk-version 10 GingerCal.apk
|
||||
python3 tools/check_dex.py GingerCal.apk
|
||||
ls -l GingerCal.apk
|
||||
Reference in new issue
Block a user