From 93461176038991280e56fad79d77360eb7467184 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Sat, 24 Jan 2026 10:33:06 +0100 Subject: [PATCH] Aggiunge integrazione Capacitor per build APK Android --- .gitignore | 10 ++++++ Dockerfile | 70 +++++++++++++++++++++++++++++++++++++ build-apk.sh | 37 ++++++++++++++++++++ capacitor.config.json | 9 +++++ generate-icons.sh | 42 ++++++++++++++++++++++ package.json | 10 +++++- src/components/HomePage.vue | 3 ++ vite.config.js | 2 +- 8 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 Dockerfile create mode 100755 build-apk.sh create mode 100644 capacitor.config.json create mode 100755 generate-icons.sh diff --git a/.gitignore b/.gitignore index 61db1b3..bea7a5e 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,13 @@ dist-ssr *.njsproj *.sln *.sw? + +# Capacitor +android/ +ios/ +.capacitor/ + +# Build output +output/ +*.apk +*.aab \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..709a501 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,70 @@ +# Dockerfile per build APK Android con Capacitor +FROM ubuntu:22.04 + +# Evita prompt interattivi +ENV DEBIAN_FRONTEND=noninteractive + +# Installa dipendenze base +RUN apt-get update && apt-get install -y \ + curl \ + git \ + unzip \ + wget \ + openjdk-17-jdk \ + build-essential \ + && rm -rf /var/lib/apt/lists/* + +# Installa Node.js 18.x (LTS compatibile con Vite) +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ + && apt-get install -y nodejs + +# Installa Gradle 8.5 +ENV GRADLE_VERSION=8.5 +RUN wget https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip -P /tmp \ + && unzip -d /opt/gradle /tmp/gradle-${GRADLE_VERSION}-bin.zip \ + && ln -s /opt/gradle/gradle-${GRADLE_VERSION}/bin/gradle /usr/bin/gradle \ + && rm /tmp/gradle-${GRADLE_VERSION}-bin.zip + +# Installa Android SDK +ENV ANDROID_SDK_ROOT=/opt/android-sdk +ENV ANDROID_HOME=${ANDROID_SDK_ROOT} +ENV PATH=${PATH}:${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/platform-tools + +RUN mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools \ + && wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -P /tmp \ + && unzip -d ${ANDROID_SDK_ROOT}/cmdline-tools /tmp/commandlinetools-linux-9477386_latest.zip \ + && mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest \ + && rm /tmp/commandlinetools-linux-9477386_latest.zip + +# Accetta licenze Android SDK +RUN yes | sdkmanager --licenses || true + +# Installa componenti Android necessari +RUN sdkmanager "platform-tools" \ + "platforms;android-34" \ + "build-tools;34.0.0" \ + "extras;google;google_play_services" \ + "extras;android;m2repository" \ + "extras;google;m2repository" + +# Imposta JAVA_HOME in base all'architettura +RUN ARCH=$(dpkg --print-architecture) && \ + echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-${ARCH}" >> /etc/profile && \ + ln -sf /usr/lib/jvm/java-17-openjdk-${ARCH} /usr/lib/jvm/default-java + +ENV JAVA_HOME=/usr/lib/jvm/default-java + +# Directory di lavoro +WORKDIR /app + +# Copia package files per cache layer +COPY package*.json ./ + +# Installa dipendenze npm +RUN npm ci --legacy-peer-deps || npm install --legacy-peer-deps + +# Copia il resto del progetto +COPY . . + +# Build script +CMD ["bash", "-c", "npm run build && npx cap add android && npx cap sync && cd android && ./gradlew assembleDebug --no-daemon && mkdir -p /app/output && cp app/build/outputs/apk/debug/app-debug.apk /app/output/segnapunti-debug.apk && echo '\n✅ APK generato: /app/output/segnapunti-debug.apk'"] diff --git a/build-apk.sh b/build-apk.sh new file mode 100755 index 0000000..b5462c5 --- /dev/null +++ b/build-apk.sh @@ -0,0 +1,37 @@ +#!/bin/bash +set -e + +echo "=========================================" +echo " Building APK for Segnapunti Android " +echo "=========================================" +echo "" + +# Rileva architettura +ARCH=$(uname -m) +echo "Architettura rilevata: $ARCH" + +# Crea directory output se non esiste +mkdir -p output + +echo "Building Docker image..." +docker build --platform linux/$(uname -m) -t segnapunti-android-builder . + +echo "" +echo "Building APK inside Docker container..." +docker run --rm \ + -v "$(pwd)/output:/app/output" \ + segnapunti-android-builder + +echo "" +echo "=========================================" +echo "Build completed successfully!" +echo "=========================================" +echo "" +echo "APK location: $(pwd)/output/segnapunti-debug.apk" +echo "" +echo "Per installare su dispositivo Android:" +echo " adb install output/segnapunti-debug.apk" +echo "" +echo "Oppure trasferisci il file sul dispositivo" +echo "e installalo manualmente." +echo "" diff --git a/capacitor.config.json b/capacitor.config.json new file mode 100644 index 0000000..1b13245 --- /dev/null +++ b/capacitor.config.json @@ -0,0 +1,9 @@ +{ + "appId": "com.antoniana.segnapunti", + "appName": "Segnapunti", + "webDir": "dist", + "bundledWebRuntime": false, + "server": { + "androidScheme": "https" + } +} \ No newline at end of file diff --git a/generate-icons.sh b/generate-icons.sh new file mode 100755 index 0000000..d347ab9 --- /dev/null +++ b/generate-icons.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# Script per generare automaticamente le icone Android da segnap-512x512.png + +SOURCE="./public/segnap-512x512.png" +BASE_DIR="./android/app/src/main/res" + +# Verifica che ImageMagick sia installato +if ! command -v convert &> /dev/null; then + echo "Errore: ImageMagick non è installato." + echo "Installa con: sudo apt-get install imagemagick" + exit 1 +fi + +# Verifica che il file sorgente esista +if [ ! -f "$SOURCE" ]; then + echo "Errore: File sorgente $SOURCE non trovato" + exit 1 +fi + +# Verifica che la directory android esista +if [ ! -d "./android" ]; then + echo "Errore: Directory android/ non trovata." + echo "Esegui prima: npx cap add android" + exit 1 +fi + +echo "Generazione icone Android da $SOURCE..." + +# Crea le directory se non esistono e genera le icone +for size in "mdpi:48" "hdpi:72" "xhdpi:96" "xxhdpi:144" "xxxhdpi:192"; do + density="${size%:*}" + pixels="${size#*:}" + dir="$BASE_DIR/mipmap-$density" + + mkdir -p "$dir" + convert "$SOURCE" -resize ${pixels}x${pixels} "$dir/ic_launcher.png" + echo " ✓ Creata icona $density (${pixels}x${pixels})" +done + +echo "Icone generate con successo!" +echo "" +echo "Prossimo passo: npx cap sync" diff --git a/package.json b/package.json index 94f6c30..2953b08 100644 --- a/package.json +++ b/package.json @@ -6,14 +6,22 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "cap:sync": "npm run build && cap sync", + "cap:open": "cap open android", + "android:build:debug": "cd android && ./gradlew assembleDebug", + "docker:build": "./build-apk.sh" }, "dependencies": { + "@capacitor/android": "^6.0.0", + "@capacitor/app": "^6.0.0", + "@capacitor/core": "^6.0.0", "nosleep.js": "^0.12.0", "vue": "^3.2.47", "wave-ui": "^3.3.0" }, "devDependencies": { + "@capacitor/cli": "^6.0.0", "@vitejs/plugin-vue": "^4.1.0", "vite": "^4.3.9", "vite-plugin-pwa": "^0.16.0" diff --git a/src/components/HomePage.vue b/src/components/HomePage.vue index 277b61d..9bccbcd 100644 --- a/src/components/HomePage.vue +++ b/src/components/HomePage.vue @@ -1,5 +1,8 @@