Android: reproducible signed build (keystore and Bazaar RSA key read from outside the repo), Gradle wrapper, build-apk.sh
First time the project has been built: debug and release both produce an APK. Release refuses to build without keystore or RSA key. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
33
android/build-apk.sh
Executable file
33
android/build-apk.sh
Executable file
@@ -0,0 +1,33 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# یک دستور برای ساختِ APKِ امضاشده: ./build-apk.sh
|
||||
#
|
||||
# چیزی را حدس نمیزند: JDK، Android SDK، keystore یا کلیدِ RSA نبود، با پیامِ روشن میایستد.
|
||||
# تنظیمات از ~/.tadrisino/android.properties (یا $TADRISINO_ANDROID_CONFIG) میآید، نه از ریپو.
|
||||
# بعد از build، امضا را با apksigner میسنجد و اثرانگشتِ گواهی را چاپ میکند تا با نسخهی قبلی بخوانید:
|
||||
# گواهیِ متفاوت یعنی بازار آپدیت را نمیپذیرد.
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
CONFIG="${TADRISINO_ANDROID_CONFIG:-$HOME/.tadrisino/android.properties}"
|
||||
export ANDROID_HOME="${ANDROID_HOME:-$HOME/Library/Android/sdk}"
|
||||
if [ -z "${JAVA_HOME:-}" ] && [ -d /opt/homebrew/opt/openjdk@17 ]; then export JAVA_HOME=/opt/homebrew/opt/openjdk@17; fi
|
||||
|
||||
fail() { printf '✖ %s\n' "$1" >&2; exit 1; }
|
||||
[ -n "${JAVA_HOME:-}" ] && [ -x "$JAVA_HOME/bin/java" ] || fail "JDK 17 پیدا نشد (JAVA_HOME). نصب: brew install openjdk@17"
|
||||
[ -d "$ANDROID_HOME/platforms/android-34" ] || fail "Android SDK (platforms;android-34) در $ANDROID_HOME نیست."
|
||||
[ -f "$CONFIG" ] || fail "فایلِ تنظیمات نیست: $CONFIG (README.md ← «تنظیماتِ بیرون از ریپو»)."
|
||||
[ "$(stat -f %Lp "$CONFIG" 2>/dev/null || stat -c %a "$CONFIG")" = "600" ] || fail "دسترسیِ $CONFIG باید ۶۰۰ باشد: chmod 600 \"$CONFIG\""
|
||||
[ -x ./gradlew ] || fail "gradlew نیست (gradle wrapper در ریپو کامیت میشود)."
|
||||
|
||||
./gradlew --no-daemon assembleRelease
|
||||
|
||||
APK="app/build/outputs/apk/release/app-release.apk"
|
||||
[ -f "$APK" ] || fail "APK ساخته نشد: $APK"
|
||||
APKSIGNER="$(ls -d "$ANDROID_HOME"/build-tools/*/apksigner | sort -V | tail -1)"
|
||||
"$APKSIGNER" verify --print-certs "$APK" | grep -E "certificate (DN|SHA-256)"
|
||||
CODE="$(grep -E '^\s*versionCode' app/build.gradle.kts | grep -oE '[0-9]+')"
|
||||
NAME="$(grep -E '^\s*versionName' app/build.gradle.kts | grep -oE '"[^"]+"' | tr -d '"')"
|
||||
OUT="build-out/Tadrisino-$NAME-$CODE.apk"
|
||||
mkdir -p build-out && cp "$APK" "$OUT"
|
||||
printf '✔ %s (versionCode %s)\n اثرانگشتِ گواهی بالا باید با APKِ قبلیِ منتشرشده یکی باشد.\n' "$OUT" "$CODE"
|
||||
Reference in New Issue
Block a user