#!/data/data/com.termux/files/usr/bin/bash # Gradle-free debug build for Termux on the phone itself: native aapt2/javac/apksigner, # plus d8 and android.jar borrowed from the Android SDK in the proot Ubuntu container. # Release/F-Droid builds use Gradle instead (./gradlew assembleRelease). set -euo pipefail cd "$(dirname "$0")" SDK=${ANDROID_SDK:-$PREFIX/var/lib/proot-distro/containers/ubuntu/rootfs/root/android-sdk} ANDROID_JAR=$SDK/platforms/android-36/android.jar D8_JAR=$SDK/build-tools/36.1.0/lib/d8.jar KEYSTORE=$HOME/.android/debug.keystore MAIN=app/src/main OUT=build/termux # Single source of truth for ids and versions is app/build.gradle. gradle_value() { sed -n "s/^ *$1 *\"\{0,1\}\([^\"]*\)\"\{0,1\} *$/\1/p" app/build.gradle | head -1; } APP_ID=$(gradle_value applicationId) VERSION_CODE=$(gradle_value versionCode) VERSION_NAME=$(gradle_value versionName) MIN_SDK=$(gradle_value minSdk) TARGET_SDK=$(gradle_value targetSdk) SHIZUKU=$(sed -n 's/.*def shizuku = "\(.*\)"/\1/p' app/build.gradle) rm -rf "$OUT" && mkdir -p "$OUT"/{gen,classes,dex,libs} # Shizuku client: classes.jar out of each AAR from Maven Central, cached between builds. CACHE=build/maven-cache/$SHIZUKU && mkdir -p "$CACHE" for a in api provider aidl shared; do jar=$CACHE/$a.jar if [ ! -f "$jar" ]; then curl -sfL -o "$CACHE/$a.aar" \ "https://repo1.maven.org/maven2/dev/rikka/shizuku/$a/$SHIZUKU/$a-$SHIZUKU.aar" unzip -p "$CACHE/$a.aar" classes.jar > "$jar" fi cp "$jar" "$OUT/libs/" done # Gradle injects the package from `namespace`; aapt2 needs it in the manifest itself. sed "s| $OUT/AndroidManifest.xml aapt2 compile --dir $MAIN/res -o $OUT/res.zip aapt2 link -I "$ANDROID_JAR" --manifest $OUT/AndroidManifest.xml \ --min-sdk-version "$MIN_SDK" --target-sdk-version "$TARGET_SDK" \ --version-code "$VERSION_CODE" --version-name "$VERSION_NAME" \ --java $OUT/gen -o $OUT/unsigned.apk $OUT/res.zip LIBS=$(ls $OUT/libs/*.jar | paste -sd:) javac -source 17 -target 17 -nowarn -classpath "$ANDROID_JAR:$LIBS" -d $OUT/classes \ $(find $MAIN/java $OUT/gen -name '*.java') java -cp "$D8_JAR" com.android.tools.r8.D8 --release --min-api "$MIN_SDK" \ --lib "$ANDROID_JAR" --output $OUT/dex $(find $OUT/classes -name '*.class') $OUT/libs/*.jar javac -d $OUT tools/ZipAlign.java java -cp $OUT ZipAlign $OUT/unsigned.apk $OUT/aligned.apk $OUT/dex/classes.dex apksigner sign --ks "$KEYSTORE" --ks-pass pass:android --key-pass pass:android \ --out GrayPause.apk $OUT/aligned.apk apksigner verify GrayPause.apk echo "Built $(pwd)/GrayPause.apk ($APP_ID $VERSION_NAME)"