diff --git a/tauri_app/Dockerfile.apk b/tauri_app/Dockerfile.apk index 66f0fdd..8f5c37d 100644 --- a/tauri_app/Dockerfile.apk +++ b/tauri_app/Dockerfile.apk @@ -60,6 +60,11 @@ RUN sed -i 's/\r$//' tauri_app/docker/*.sh \ ENV ANDROID_AGP_LOCAL_REPO=/opt/android-agp-maven ENV GRADLE_USER_HOME=/root/.gradle +ENV ANDROID_COMPILE_SDK=35 + +RUN if [ ! -d "${ANDROID_HOME}" ] && [ -d /opt/android-sdk-linux ]; then ln -s /opt/android-sdk-linux "${ANDROID_HOME}"; fi \ + && ln -sfn android-35 "${ANDROID_HOME}/platforms/android-36" \ + && test -e "${ANDROID_HOME}/platforms/android-36" RUN /workspace/tauri_app/docker/prefetch-android-agp.sh \ && /workspace/tauri_app/docker/verify-offline-agp.sh diff --git a/tauri_app/docker/patch-android-sdk.sh b/tauri_app/docker/patch-android-sdk.sh index 3c47a25..ccaf494 100644 --- a/tauri_app/docker/patch-android-sdk.sh +++ b/tauri_app/docker/patch-android-sdk.sh @@ -5,6 +5,7 @@ set -euo pipefail ANDROID_GEN="${1:-/workspace/tauri_app/src-tauri/gen/android}" ANDROID_HOME="${ANDROID_HOME:-/opt/android-sdk}" ANDROID_SDK_ROOT="${ANDROID_SDK_ROOT:-${ANDROID_HOME}}" +GRADLE_USER_HOME="${GRADLE_USER_HOME:-/root/.gradle}" if [ ! -d "${ANDROID_GEN}" ]; then echo "Android project not found: ${ANDROID_GEN}" >&2 @@ -33,10 +34,43 @@ if [ -z "${SDK_LEVEL}" ]; then exit 1 fi -APP_BUILD="${ANDROID_GEN}/app/build.gradle.kts" -if [ -f "${APP_BUILD}" ]; then - sed -i -E "s/compileSdk = [0-9]+/compileSdk = ${SDK_LEVEL}/g" "${APP_BUILD}" - sed -i -E "s/targetSdk = [0-9]+/targetSdk = ${SDK_LEVEL}/g" "${APP_BUILD}" +export ANDROID_COMPILE_SDK="${SDK_LEVEL}" + +PLATFORM_DIR="${ANDROID_HOME}/platforms" +# Tauri 2.x templates/plugins request android-36 while the SDK image ships android-35. +for requested in 36 35 34; do + if [ ! -e "${PLATFORM_DIR}/android-${requested}" ] && [ -d "${PLATFORM_DIR}/android-${SDK_LEVEL}" ]; then + ln -sfn "android-${SDK_LEVEL}" "${PLATFORM_DIR}/android-${requested}" + echo "==> Platform symlink: android-${requested} -> android-${SDK_LEVEL}" + fi +done + +while IFS= read -r -d '' gradle_file; do + sed -i -E "s/compileSdk = [0-9]+/compileSdk = ${SDK_LEVEL}/g" "${gradle_file}" + sed -i -E "s/targetSdk = [0-9]+/targetSdk = ${SDK_LEVEL}/g" "${gradle_file}" + sed -i -E "s/compileSdkVersion = [0-9]+/compileSdkVersion = ${SDK_LEVEL}/g" "${gradle_file}" + sed -i -E "s/compileSdkVersion [0-9]+/compileSdkVersion ${SDK_LEVEL}/g" "${gradle_file}" + sed -i -E "s/targetSdkVersion = [0-9]+/targetSdkVersion = ${SDK_LEVEL}/g" "${gradle_file}" + sed -i -E "s/targetSdkVersion [0-9]+/targetSdkVersion ${SDK_LEVEL}/g" "${gradle_file}" +done < <(find "${ANDROID_GEN}" \( -name 'build.gradle.kts' -o -name 'build.gradle' \) -print0 2>/dev/null || true) + +ROOT_BUILD="${ANDROID_GEN}/build.gradle.kts" +if [ -f "${ROOT_BUILD}" ] && ! grep -q 'forceOfflineAndroidSdk' "${ROOT_BUILD}"; then + cat >> "${ROOT_BUILD}" <> "${GRADLE_PROPS}" +else + sed -i "s/^android.compileSdk=.*/android.compileSdk=${SDK_LEVEL}/" "${GRADLE_PROPS}" +fi + cat > "${ANDROID_GEN}/local.properties" < "${GRADLE_USER_HOME}/init.d/force-android-sdk.gradle" < + project.afterEvaluate { + def androidExt = project.extensions.findByName('android') + if (androidExt == null) { + return + } + try { + androidExt.compileSdk = offlineCompileSdk + } catch (ignored) { + try { + androidExt.compileSdkVersion offlineCompileSdk + } catch (ignored2) { + // ignore non-Android projects + } + } + try { + if (androidExt.metaClass.hasProperty(androidExt, 'defaultConfig') && androidExt.defaultConfig != null) { + androidExt.defaultConfig.targetSdk = offlineCompileSdk + } + } catch (ignored) { + try { + androidExt.defaultConfig.targetSdkVersion offlineCompileSdk + } catch (ignored2) { + // ignore library modules without targetSdk + } + } + } +} +EOF + echo "==> Android SDK patched: compileSdk/targetSdk=${SDK_LEVEL}, sdk.dir=${ANDROID_HOME}, sdkDownload=false"