# Come si compila Quanto Basta

Fino al 2026-08-31 l'app era girata solo dentro Expo Go, che è un contenitore
con i moduli nativi già compilati da qualcun altro. Questa è la procedura per
compilarla davvero, provata e funzionante su tutte e due i sistemi.

Le cartelle `ios/` e `android/` **non stanno nel repository** (sono in
`.gitignore`): le rigenera il prebuild ogni volta che servono, a partire da
`app.json`. Se le si modifica a mano, il prebuild successivo butta via tutto.

## iOS

```bash
npx expo prebuild --platform ios --no-install
cd ios && pod install
xcodebuild -workspace QuantoBasta.xcworkspace -scheme QuantoBasta \
  -configuration Release -sdk iphonesimulator \
  -destination 'platform=iOS Simulator,id=<UDID>' \
  -derivedDataPath ./build build
```

Poi si installa e si avvia:

```bash
xcrun simctl install <UDID> ios/build/Build/Products/Release-iphonesimulator/QuantoBasta.app
xcrun simctl launch <UDID> com.paoloalby.quantobasta
```

In Release il JavaScript finisce dentro il pacchetto: l'app parte da sola,
senza Metro, ed è l'unico modo di vederla come sarà davvero.

**Serve CocoaPods**, e la gemma di sistema non va: il Ruby di macOS è il 2.6 e
CocoaPods vuole almeno il 2.7. Si installa con `brew install cocoapods`.

Pesa 66 MB.

## Android

**La trappola del JDK, ed è quella che fa perdere un'ora.** Android Studio si
porta dentro un JDK 25, e con quello la build fallisce così:

```
Execution failed for task ':expo-modules-core:configureCMakeDebug[arm64-v8a]'.
> WARNING: A restricted method in java.lang.System has been called
```

Non è un avvertimento, è l'errore: dal JDK 24 in poi le chiamate a
`System.load` fuori dai moduli consentiti sono bloccate, e il plugin CMake le
usa. **Serve il JDK 17.** Sta in `~/.jdks/jdk-17.0.20.1+1`, scaricato da
Adoptium senza installarlo di sistema — l'installatore con `.pkg` chiede la
password di amministratore, il tar.gz no:

```bash
mkdir -p ~/.jdks && cd ~/.jdks
curl -sL -o t17.tar.gz "https://api.adoptium.net/v3/binary/latest/17/ga/mac/aarch64/jdk/hotspot/normal/eclipse"
tar xzf t17.tar.gz && rm t17.tar.gz
```

L'ambiente, da esportare prima di ogni comando:

```bash
export JAVA_HOME="$HOME/.jdks/jdk-17.0.20.1+1/Contents/Home"
export ANDROID_HOME=/opt/homebrew/share/android-commandlinetools
export PATH="$JAVA_HOME/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
```

L'SDK si prende dagli strumenti da riga di comando — `brew install --cask
android-commandlinetools` — senza passare dall'assistente grafico di Android
Studio:

```bash
yes | sdkmanager --licenses
sdkmanager "platform-tools" "platforms;android-36" "build-tools;36.0.0" \
  "emulator" "system-images;android-36;google_apis;arm64-v8a"
```

Il progetto deve sapere dov'è l'SDK: `android/local.properties` con
`sdk.dir=/opt/homebrew/share/android-commandlinetools`. Lo si riscrive dopo
ogni prebuild, perché la cartella `android/` viene rigenerata.

Emulatore e build:

```bash
avdmanager create avd -n QuantoBasta_Pixel -k "system-images;android-36;google_apis;arm64-v8a"
emulator -avd QuantoBasta_Pixel -no-snapshot-save -no-boot-anim &
cd android && ./gradlew assembleDebug
adb install -r app/build/outputs/apk/debug/app-debug.apk
adb reverse tcp:8081 tcp:8081     # perché l'APK di debug prende il JS da Metro
adb shell am start -n com.paoloalby.quantobasta/.MainActivity
```

La prima build ci mette otto minuti. L'APK di debug pesa 162 MB, ma è gonfio
apposta: dentro ci sono i simboli e tutte le architetture. Quello che finirà
sul Play Store sarà una frazione.

## Cosa ha dimostrato la prima compilazione

Cose che dentro Expo Go non si potevano sapere, e che adesso sono verificate:
il database si apre, il carattere Caveat entra nel pacchetto e si vede,
l'icona «q.b.» è quella giusta sulla schermata del telefono, e sparisce il
pulsante flottante di Expo Go che copriva l'angolo in alto a destra
nascondendo un comando.

Su Android, con l'emulatore in inglese, si è vista per la prima volta **la
traduzione inglese a schermo**: «Recipe scaler», «Your recipe book is empty»,
«Paste the ingredients here, one per line». Fino a lì era esistita solo nei
test.

## Cosa resta, e non è stato provato

La build **firmata** per gli store: sia l'archivio iOS sia l'AAB Android
vogliono un certificato, e i certificati vogliono gli account. È il pezzo che
comincia quando Paolo apre gli account.

La fotocamera, la condivisione e l'importazione di un archivio non sono state
provate sull'app compilata. Sono i tre moduli nativi che restano senza
collaudo.
