almeira-web/scripts/build_pacifictrans_apk.py

109 lines
3.7 KiB
Python

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)