62 lines
2.4 KiB
Bash
Executable File
62 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Офлайн-сборка APK arc-shot напрямую через Android build-tools (без Gradle/AGP).
|
||
# Использует только локальный SDK + android.jar. Требует: javac (JDK 17+), Android SDK.
|
||
set -euo pipefail
|
||
|
||
cd "$(dirname "$0")"
|
||
|
||
SDK="${ANDROID_SDK_ROOT:-${ANDROID_HOME:-$HOME/Library/Android/sdk}}"
|
||
BT_VER="${BT_VER:-35.0.1}"
|
||
PLATFORM="${PLATFORM:-android-34}"
|
||
MIN_SDK="${MIN_SDK:-24}"
|
||
TARGET_SDK="${TARGET_SDK:-34}"
|
||
|
||
BT="$SDK/build-tools/$BT_VER"
|
||
ANDROID_JAR="$SDK/platforms/$PLATFORM/android.jar"
|
||
|
||
[ -d "$BT" ] || { echo "build-tools $BT_VER not found at $BT"; exit 1; }
|
||
[ -f "$ANDROID_JAR" ] || { echo "android.jar not found at $ANDROID_JAR"; exit 1; }
|
||
|
||
OUT="build"
|
||
rm -rf "$OUT"
|
||
mkdir -p "$OUT/classes" "$OUT/dex"
|
||
|
||
echo "[1/6] javac"
|
||
find src/main/java -name '*.java' > "$OUT/sources.txt"
|
||
javac --release 17 -classpath "$ANDROID_JAR" -d "$OUT/classes" @"$OUT/sources.txt"
|
||
|
||
echo "[2/6] d8 -> classes.dex"
|
||
CLASSES=$(find "$OUT/classes" -name '*.class')
|
||
"$BT/d8" --min-api "$MIN_SDK" --lib "$ANDROID_JAR" --output "$OUT/dex" $CLASSES
|
||
|
||
echo "[3/6] aapt2 link"
|
||
"$BT/aapt2" link \
|
||
-o "$OUT/app-unsigned.apk" \
|
||
-I "$ANDROID_JAR" \
|
||
--manifest src/main/AndroidManifest.xml \
|
||
--min-sdk-version "$MIN_SDK" \
|
||
--target-sdk-version "$TARGET_SDK"
|
||
|
||
echo "[4/6] add classes.dex"
|
||
cp "$OUT/dex/classes.dex" "$OUT/classes.dex"
|
||
( cd "$OUT" && zip -j -q app-unsigned.apk classes.dex )
|
||
|
||
echo "[5/6] zipalign"
|
||
"$BT/zipalign" -f -p 4 "$OUT/app-unsigned.apk" "$OUT/app-aligned.apk"
|
||
|
||
echo "[6/6] sign"
|
||
# Keystore держим ВНЕ build/ — иначе rm -rf build стирает ключ и подпись меняется
|
||
# каждую пересборку (INSTALL_FAILED_UPDATE_INCOMPATIBLE при обновлении на устройстве).
|
||
KS="debug.keystore"
|
||
if [ ! -f "$KS" ]; then
|
||
keytool -genkeypair -keystore "$KS" -storepass android -keypass android \
|
||
-alias androiddebugkey -keyalg RSA -keysize 2048 -validity 10000 \
|
||
-dname "CN=Android Debug,O=Android,C=US" >/dev/null 2>&1
|
||
fi
|
||
"$BT/apksigner" sign \
|
||
--ks "$KS" --ks-pass pass:android --ks-key-alias androiddebugkey --key-pass pass:android \
|
||
--out "$OUT/arc-shot.apk" "$OUT/app-aligned.apk"
|
||
|
||
echo "OK -> $OUT/arc-shot.apk"
|
||
"$BT/aapt2" dump badging "$OUT/arc-shot.apk" 2>/dev/null | grep -E "package:|launchable-activity:|uses-permission: name='android.permission.(MANAGE_EXTERNAL_STORAGE|FOREGROUND_SERVICE)'" || true
|