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