diff --git a/BUGS_TODO.md b/BUGS_TODO.md index 30f98c4..aa4c5e9 100644 --- a/BUGS_TODO.md +++ b/BUGS_TODO.md @@ -2,10 +2,8 @@ ## Bugs -- The generated `gradlew` wrapper just forwards to the system `gradle` package. That is convenient in Termux, but it means builds are not pinned to a project-specific Gradle wrapper version. -- The generated app pins Android Gradle Plugin `8.5.2` without pinning a compatible Gradle wrapper version. That can break when the installed Gradle package changes or is incompatible with that plugin version. -- The CLI is now split into a dispatcher plus per-command scripts under `lib/commands/`, which improves readability but adds more files to maintain. +No known bugs at the moment. ## TODO -- Consider generating a real Gradle wrapper for new projects instead of relying on `gradle` from Termux. +- Consider vendoring wrapper files so `android-builder new` does not need a system `gradle` binary at generation time. diff --git a/README.md b/README.md index 57be1f7..f1f0b7d 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,16 @@ The CLI is now split into smaller scripts for readability and maintenance: - Gradle settings and properties - a single `app` module +- a real Gradle wrapper for the generated project - a minimal `MainActivity` - a simple default theme and string resources +The template defaults are controlled in one place through environment variables: + +- `ANDROID_BUILDER_GRADLE_VERSION` defaults to `8.7` +- `ANDROID_BUILDER_AGP_VERSION` defaults to `8.5.2` +- `ANDROID_BUILDER_GRADLE_DISTRIBUTION_SHA256` defaults to the official checksum for `gradle-8.7-bin.zip` + ## Notes - The project is designed around Termux. diff --git a/lib/common.sh b/lib/common.sh index 4f1e588..bb6c8a8 100644 --- a/lib/common.sh +++ b/lib/common.sh @@ -5,6 +5,9 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" AB_HOME="${ANDROID_BUILDER_HOME:-$HOME/android-builder}" SDK="$HOME/android-sdk" PLATFORM="${ANDROID_BUILDER_PLATFORM:-android-33}" +GRADLE_VERSION="${ANDROID_BUILDER_GRADLE_VERSION:-8.7}" +AGP_VERSION="${ANDROID_BUILDER_AGP_VERSION:-8.5.2}" +GRADLE_DISTRIBUTION_SHA256="${ANDROID_BUILDER_GRADLE_DISTRIBUTION_SHA256:-544c35d6bd849ae8a5ed0bcea39ba677dc40f49df7d1835561582da2009b961d}" ensure_termux() { if [ -z "${PREFIX:-}" ] || [ ! -d "/data/data/com.termux/files/usr" ]; then @@ -13,6 +16,24 @@ ensure_termux() { fi } +require_gradle() { + if ! command -v gradle >/dev/null 2>&1; then + echo "Error: gradle is required to generate the project wrapper." + echo "Run: android-builder setup" + exit 1 + fi +} + +set_gradle_wrapper_sha256() { + WRAPPER_PROPERTIES="$1" + + if grep -q '^distributionSha256Sum=' "$WRAPPER_PROPERTIES"; then + sed -i "s/^distributionSha256Sum=.*/distributionSha256Sum=$GRADLE_DISTRIBUTION_SHA256/" "$WRAPPER_PROPERTIES" + else + printf '\ndistributionSha256Sum=%s\n' "$GRADLE_DISTRIBUTION_SHA256" >> "$WRAPPER_PROPERTIES" + fi +} + get_project_name() { if [ -f settings.gradle ]; then DETECTED_NAME="$(grep -E '^rootProject.name[[:space:]]*=' settings.gradle \ @@ -38,6 +59,8 @@ get_apk_path() { } create_base_project() { + require_gradle + NAME="$1" MESSAGE="$2" PACKAGE="com.example.$(echo "$NAME" | tr '[:upper:]' '[:lower:]' | tr -cd 'a-z0-9')" @@ -71,7 +94,7 @@ EOF2 cat > "$NAME/app/build.gradle" < "$NAME/gradlew" <<'EOF2' -#!/data/data/com.termux/files/usr/bin/bash -set -e -exec gradle "$@" -EOF2 - - chmod +x "$NAME/gradlew" + (cd "$NAME" && gradle wrapper --gradle-version "$GRADLE_VERSION" --distribution-type bin) + set_gradle_wrapper_sha256 "$NAME/gradle/wrapper/gradle-wrapper.properties" echo "Created project: $NAME" echo @@ -170,4 +188,5 @@ EOF2 echo " cd $NAME" echo " android-builder build" echo " android-builder export" + echo " ./gradlew assembleDebug" }