#!/data/data/com.termux/files/usr/bin/bash set -e AB_HOME="${ANDROID_BUILDER_HOME:-$HOME/android-builder}" SDK="$HOME/android-sdk" PLATFORM="${ANDROID_BUILDER_PLATFORM:-android-33}" get_project_name() { if [ -f settings.gradle ]; then DETECTED_NAME="$(grep -E '^rootProject.name[[:space:]]*=' settings.gradle \ | sed -E 's/.*=[[:space:]]*["'\'']?([^"'\'' ]+)["'\'']?.*/\1/' \ | head -n 1)" [ -n "$DETECTED_NAME" ] && echo "$DETECTED_NAME" && return fi basename "$PWD" } get_build_type() { echo "${ANDROID_BUILDER_BUILD_TYPE:-debug}" } get_apk_path() { case "$(get_build_type)" in debug) echo "app/build/outputs/apk/debug/app-debug.apk" ;; release) echo "app/build/outputs/apk/release/app-release.apk" ;; *) return 1 ;; esac } setup() { echo "==> Installing packages" pkg update -y pkg install -y git curl wget unzip zip nano \ openjdk-21 gradle aapt2 apksigner d8 dx android-tools echo "==> Configuring Java" JAVA_BIN="$(command -v java)" JAVA_HOME_DETECTED="$(dirname "$(dirname "$(readlink -f "$JAVA_BIN")")")" export JAVA_HOME="$JAVA_HOME_DETECTED" export PATH="$JAVA_HOME/bin:$PATH" touch "$HOME/.bashrc" grep -q 'ANDROID_BUILDER_JAVA_HOME' "$HOME/.bashrc" || cat >> "$HOME/.bashrc" < Installing Android SDK cmdline-tools" mkdir -p "$SDK/cmdline-tools" cd "$SDK/cmdline-tools" if [ ! -d latest ]; then wget https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O cmdline-tools.zip unzip -q cmdline-tools.zip mv cmdline-tools latest rm cmdline-tools.zip fi export ANDROID_HOME="$SDK" export ANDROID_SDK_ROOT="$SDK" export PATH="$SDK/cmdline-tools/latest/bin:$PATH" grep -q 'ANDROID_HOME' "$HOME/.bashrc" || cat >> "$HOME/.bashrc" <<'EOF2' # AndroidBuilder SDK environment export ANDROID_HOME=$HOME/android-sdk export ANDROID_SDK_ROOT=$ANDROID_HOME export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH EOF2 echo "==> Accepting Android SDK licenses" mkdir -p "$SDK/licenses" cat > "$SDK/licenses/android-sdk-license" <<'EOF2' 24333f8a63b6825ea9c5514f83c2829b004d1fee d56f5187479451eabf01fb78af6dfcb131a6481e 8933bad161af4178b1185d1a37fbf41ea5269c55 EOF2 echo "==> Installing SDK platform: $PLATFORM" sdkmanager "platforms;$PLATFORM" echo "==> Writing Gradle config" mkdir -p "$HOME/.gradle" cat > "$HOME/.gradle/gradle.properties" < "$NAME/settings.gradle" < "$NAME/build.gradle" <<'EOF2' // Root build file intentionally minimal. EOF2 cat > "$NAME/gradle.properties" < "$NAME/local.properties" < "$NAME/app/build.gradle" < "$NAME/app/src/main/AndroidManifest.xml" <<'EOF2' EOF2 cat > "$NAME/app/src/main/res/values/strings.xml" < $NAME EOF2 cat > "$NAME/app/src/main/res/values/styles.xml" <<'EOF2' EOF2 cat > "$NAME/app/src/main/java/$PACKAGE_PATH/MainActivity.java" < "$NAME/gradlew" <<'EOF2' #!/data/data/com.termux/files/usr/bin/bash set -e exec gradle "$@" EOF2 chmod +x "$NAME/gradlew" echo "Created project: $NAME" echo echo "Next:" echo " cd $NAME" echo " android-builder build" echo " android-builder export" } build() { test -f local.properties || echo "sdk.dir=$SDK" > local.properties if [ -f ./gradlew ]; then chmod +x ./gradlew ./gradlew assembleDebug else gradle assembleDebug fi } export_apk() { APK="$(get_apk_path)" BUILD_TYPE="$(get_build_type)" if [ ! -f "$APK" ]; then echo "No $BUILD_TYPE APK found." echo echo "Run:" echo " android-builder build" exit 1 fi if [ ! -d "$HOME/storage" ]; then echo "==> Termux storage has not been configured." echo "==> Requesting storage permission..." echo termux-setup-storage echo echo "Please grant storage permission, then run:" echo " android-builder export" exit 0 fi EXPORT_DIR="$HOME/storage/documents" mkdir -p "$EXPORT_DIR" PROJECT_NAME="$(get_project_name)" DEST="$EXPORT_DIR/${PROJECT_NAME}.apk" echo "==> Exporting APK..." cp -f "$APK" "$DEST" sync SIZE="$(du -h "$DEST" | cut -f1)" echo echo "✓ Export complete!" echo echo "Project:" echo " $PROJECT_NAME" echo echo "Build:" echo " $BUILD_TYPE" echo echo "Size:" echo " $SIZE" echo echo "Location:" echo " $DEST" echo echo "Open your file manager, browse to Documents," echo "then tap ${PROJECT_NAME}.apk to install or share it." } help() { echo "AndroidBuilder" echo echo "Usage:" echo " android-builder setup" echo " android-builder doctor" echo " android-builder new MyApp" echo " android-builder new MyApp --template empty" echo " android-builder build" echo " android-builder export" } COMMAND="$1" shift || true case "$COMMAND" in setup) setup "$@" ;; doctor) doctor "$@" ;; new) new_project "$@" ;; build) build "$@" ;; export) export_apk "$@" ;; help|-h|--help|"") help ;; *) echo "Unknown command: $COMMAND" echo "Run: android-builder help" exit 1 ;; esac