From 84ccbea56a21bdedca634d12bcf8bc1f308da87b Mon Sep 17 00:00:00 2001 From: "soroush.asadi" Date: Thu, 4 Jun 2026 15:22:34 +0330 Subject: [PATCH] Build Android APK via Myket maven mirror (verified) - Myket mirror serves maven2 layout at root https://maven.myket.ir (proxies Maven Central + Google/AGP); android/build.gradle uses it - gradle-mirror.init.gradle template injects the mirror into all modules and pins build-tools 36 + Java 17 (this env lacks build-tools 35 / JDK 21) - ANDROID.md updated with the exact working build command - Produces app-debug.apk (~4.5 MB) Co-Authored-By: Claude Opus 4.8 --- ANDROID.md | 29 ++++++++--- android/build.gradle | 2 + android/gradle-mirror.init.gradle.example | 60 +++++++++++------------ 3 files changed, 52 insertions(+), 39 deletions(-) diff --git a/ANDROID.md b/ANDROID.md index 74302b8..6aa896a 100644 --- a/ANDROID.md +++ b/ANDROID.md @@ -23,20 +23,33 @@ npm run android:open > Point the app at the live server at build time: > `NEXT_PUBLIC_USE_SERVER=1 NEXT_PUBLIC_SERVER_URL=https://api.example.com npm run cap:sync` -## ⚠️ Maven mirror required (Iran) +## ⚠️ Maven mirror (Iran) — VERIFIED WORKING -Gradle pulls the Android Gradle Plugin from **dl.google.com** and **Maven Central**, -which are blocked in Iran — exactly like nuget.org. Provide a Maven/Gradle mirror -(your Nexus `maven-public` group that proxies Maven Central **and** Google's -android repo), then build with the init script: +Gradle pulls the Android Gradle Plugin from **dl.google.com** + **Maven Central**, +blocked in Iran. The **Myket** mirror proxies both — at the **root** (no `/maven2`): + +``` +https://maven.myket.ir +``` + +Copy `android/gradle-mirror.init.gradle.example` → `android/gradle-mirror.init.gradle`, +then build with the init script. (The `gradlew.bat` wrapper has a CLASSPATH quirk on +this setup, so invoke the wrapper jar with `java` directly): ```bash cd android -gradlew.bat assembleDebug --init-script gradle-mirror.init.gradle +java -classpath gradle\wrapper\gradle-wrapper.jar org.gradle.wrapper.GradleWrapperMain \ + assembleDebug --init-script gradle-mirror.init.gradle --no-daemon +# → app/build/outputs/apk/debug/app-debug.apk (≈4.5 MB) ``` -Copy `android/gradle-mirror.init.gradle.example` → `android/gradle-mirror.init.gradle` -and set your mirror URL(s). (Kept out of git; machine-specific.) +The init script also pins **build-tools 36.0.0** and **Java 17** compatibility, +which are the versions installed here (Capacitor 8 defaults to build-tools 35 / JDK 21). +On a CI box with JDK 21 + build-tools 35 you can drop those overrides. + +> For Nexus instead of Myket directly: create a **maven2 (proxy)** repo with +> Remote storage URL `https://maven.myket.ir`, add it to a **maven2 (group)**, +> and point `MIRROR` at the group URL. ## Release (Cafe Bazaar / Myket) 1. Generate a keystore: `keytool -genkey -v -keystore bargevasat.keystore -alias bargevasat -keyalg RSA -keysize 2048 -validity 10000` diff --git a/android/build.gradle b/android/build.gradle index f8f0e43..7dbde02 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -3,6 +3,7 @@ buildscript { repositories { + maven { url 'https://maven.myket.ir' } google() mavenCentral() } @@ -19,6 +20,7 @@ apply from: "variables.gradle" allprojects { repositories { + maven { url 'https://maven.myket.ir' } google() mavenCentral() } diff --git a/android/gradle-mirror.init.gradle.example b/android/gradle-mirror.init.gradle.example index eb5ec42..9df873d 100644 --- a/android/gradle-mirror.init.gradle.example +++ b/android/gradle-mirror.init.gradle.example @@ -1,42 +1,40 @@ -// Route Gradle (Android Gradle Plugin + deps) through a Maven mirror — for -// networks where dl.google.com / repo.maven.apache.org are blocked (Iran). +// Build APK behind Iran's network using the Myket maven mirror. // -// 1) copy this file to: android/gradle-mirror.init.gradle -// 2) set MIRROR (and GOOGLE if your Nexus exposes Google's repo separately) -// 3) build: gradlew.bat assembleDebug --init-script gradle-mirror.init.gradle - -// A Nexus "maven group" that proxies Maven Central AND Google's android repo: -def MIRROR = "https://mirror.soroushasadi.com/repository/maven-public/" -// If Google's repo is a separate proxy, set it here (else leave = MIRROR): -def GOOGLE = MIRROR +// copy to: android/gradle-mirror.init.gradle (git-ignored) +// build: java -classpath gradle\wrapper\gradle-wrapper.jar \ +// org.gradle.wrapper.GradleWrapperMain assembleDebug \ +// --init-script gradle-mirror.init.gradle --no-daemon +// +// NOTE: the mirror serves the maven2 layout at the ROOT (no /maven2 suffix). +def MIRROR = "https://maven.myket.ir" settingsEvaluated { settings -> - settings.pluginManagement { - repositories { - maven { url GOOGLE } - maven { url MIRROR } - } - } + settings.pluginManagement.repositories { maven { url MIRROR } } try { - settings.dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) - repositories { - maven { url GOOGLE } - maven { url MIRROR } - } - } + settings.dependencyResolutionManagement.repositories { maven { url MIRROR } } } catch (ignored) { } } allprojects { - buildscript { - repositories { - maven { url GOOGLE } - maven { url MIRROR } + buildscript { repositories { maven { url MIRROR } } } + repositories { maven { url MIRROR } } + + // Environment workarounds (only needed when the exact SDK build-tools / JDK + // that Capacitor 8 expects aren't present — e.g. JDK 17 instead of 21, and + // build-tools 36 instead of 35). Remove on a CI with JDK 21 + build-tools 35. + afterEvaluate { p -> + if (p.plugins.hasPlugin('com.android.application') || p.plugins.hasPlugin('com.android.library')) { + p.android { + buildToolsVersion '36.0.0' + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + } + } + p.tasks.withType(JavaCompile).configureEach { + sourceCompatibility = '17' + targetCompatibility = '17' } } - repositories { - maven { url GOOGLE } - maven { url MIRROR } - } }