import subprocess import os import shutil import glob import sys import io if sys.platform == 'win32': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') pacific_dir = r"c:\Users\Carlos\dev\almeira-web\pacifictrans-app" backend_public = r"c:\Users\Carlos\dev\almeira-web\transporte-cali-buenaventura\backend\public" android_dir = os.path.join(pacific_dir, "android") jbr_dir = r"C:\Program Files\Android\Android Studio\jbr" release_dir = os.path.join(pacific_dir, "release") os.makedirs(release_dir, exist_ok=True) print("=" * 70) print("🚀 COMPILADOR NATIVO PACIFICTRANS GO ANDROID") print("=" * 70) print("[1/5] Limpiando APKs residuales para evitar bloating recursivo...") patterns = [ os.path.join(pacific_dir, "public", "*.apk"), os.path.join(android_dir, "app", "src", "main", "assets", "public", "*.apk"), os.path.join(android_dir, "app", "build", "intermediates", "assets", "debug", "mergeDebugAssets", "public", "*.apk") ] for pat in patterns: for f in glob.glob(pat): try: os.remove(f) print(f" -> Eliminado: {f}") except Exception as e: print(f" [Warn]: {e}") print("[2/5] Sincronizando assets locales web al proyecto Android nativo...") res_sync = subprocess.run(["cmd.exe", "/c", "npx.cmd", "cap", "sync", "android"], cwd=pacific_dir, capture_output=True, text=True) if res_sync.returncode != 0: print("[ERROR] Fallo en npx cap sync android:") print(res_sync.stderr or res_sync.stdout) sys.exit(1) print(" -> Assets web y 8 plugins nativos sincronizados correctamente.") # Doble chequeo en assets assets_public = os.path.join(android_dir, "app", "src", "main", "assets", "public") if os.path.exists(assets_public): for f in os.listdir(assets_public): if f.endswith(".apk"): os.remove(os.path.join(assets_public, f)) print(f" -> Removido remanente: {f}") print("[3/5] Compilando APK nativo con Gradle (Java JBR 17)...") env = os.environ.copy() env["JAVA_HOME"] = jbr_dir res_gradle = subprocess.run( ["cmd.exe", "/c", "gradlew.bat", "assembleDebug"], cwd=android_dir, env=env, capture_output=True, text=True ) if res_gradle.returncode != 0: print("[ERROR] Fallo en compilación Gradle:") print(res_gradle.stderr[-1500:] if res_gradle.stderr else res_gradle.stdout[-1500:]) sys.exit(1) print(" -> Gradle assembleDebug finalizado con éxito.") print("[4/5] Localizando binario APK generado...") possible_apks = [ os.path.join(android_dir, "app", "build", "outputs", "apk", "debug", "PacifictransGo.apk"), os.path.join(android_dir, "app", "build", "outputs", "apk", "debug", "app-debug.apk") ] src_apk = None for p in possible_apks: if os.path.exists(p): src_apk = p break if not src_apk: print("[ERROR] No se encontró el APK de salida en build/outputs/apk/debug") sys.exit(1) size_mb = os.path.getsize(src_apk) / (1024 * 1024) print(f" -> APK generado: {src_apk} ({size_mb:.2f} MB)") print("[5/5] Distribuyendo APK nativo en rutas locales oficiales...") destinations = [ os.path.join(release_dir, "PacifictransGo.apk"), os.path.join(pacific_dir, "public", "PacifictransGo.apk"), os.path.join(backend_public, "PacifictransGo.apk"), r"c:\Users\Carlos\dev\almeira-web\PacifictransGo.apk" ] for dst in destinations: shutil.copy2(src_apk, dst) print(f" -> Copiado a: {dst}") print("\n" + "=" * 70) print(f"✅ [ÉXITO TOTAL] APLICACIÓN ANDROID NATIVA 100% GENERADA") print(f"📦 Tamaño final optimizado: {size_mb:.2f} MB") print(f"📍 Ruta local principal: {destinations[0]}") print("=" * 70)