Add :nostore build scripts that disable Firebase for one Android or iOS build without changing the Firebase-on default.

This commit is contained in:
Jose Olarte III
2026-10-13 15:53:04 -04:00
parent 59f503d90a
commit 4ef0a51c6a
4 changed files with 26 additions and 7 deletions
+2 -2
View File
@@ -7,9 +7,9 @@
`android/app/google-services.json` is required when Firebase is enabled. It does not decide the switch: a missing file fails the build, and a file on disk is ignored when Firebase is explicitly disabled. `android/app/google-services.json` is required when Firebase is enabled. It does not decide the switch: a missing file fails the build, and a file on disk is ignored when Firebase is explicitly disabled.
- **Default (local, test, production, Play Store)**: `./gradlew assembleRelease` or `./gradlew bundleRelease` — do not pass `-PfirebaseEnabled`. - **Default (local, test, production, Play Store)**: `./gradlew assembleRelease` or `./gradlew bundleRelease` — do not pass `-PfirebaseEnabled`.
- **Opt out (F-Droid / FOSS)**: `./gradlew assembleRelease -PfirebaseEnabled=false`. npm scripts honor `FIREBASE_ENABLED=false`, which forwards that property. - **Opt out (F-Droid / FOSS)**: `./gradlew assembleRelease -PfirebaseEnabled=false`, or an npm `:nostore` script such as `npm run build:android:test:nostore:run`. Those set `FIREBASE_ENABLED=false`, which forwards `-PfirebaseEnabled=false`. `:nostore` disables Firebase only; it does not remove every Play Services dependency.
iOS builds bundle `ios/App/App/GoogleService-Info.plist` by default (`ios/App/scripts/bundle-firebase-config.sh`, run from `scripts/build-ios.sh` and as an Xcode build phase). Opt out with `FIREBASE_ENABLED=false` (the build script forwards that to xcodebuild) or the Xcode build setting `FIREBASE_ENABLED=NO`. A missing plist fails an enabled build; the file's presence does not enable Firebase on its own. iOS builds bundle `ios/App/App/GoogleService-Info.plist` by default (`ios/App/scripts/bundle-firebase-config.sh`, run from `scripts/build-ios.sh` and as an Xcode build phase). Opt out with `FIREBASE_ENABLED=false` (the build script forwards that to both the build and archive `xcodebuild` invocations), `npm run build:ios:prod:nostore`, or the Xcode build setting `FIREBASE_ENABLED=NO`. A missing plist fails an enabled build; the file's presence does not enable Firebase on its own.
The guard is in `android/app/build.gradle`. Do NOT activate Firebase from file presence alone — that was the bug that broke FOSS distribution in June 2026. The guard is in `android/app/build.gradle`. Do NOT activate Firebase from file presence alone — that was the bug that broke FOSS distribution in June 2026.
+8 -1
View File
@@ -1074,6 +1074,9 @@ npm run build:ios:prod # Production build (builds for production en
npm run build:ios:test:run # Test build with auto-run (builds then runs on simulator) npm run build:ios:test:run # Test build with auto-run (builds then runs on simulator)
npm run build:ios:prod:run # Production build with auto-run (builds then runs on simulator) npm run build:ios:prod:run # Production build with auto-run (builds then runs on simulator)
# Firebase off (`:nostore` sets FIREBASE_ENABLED=false, forwarded to xcodebuild as FIREBASE_ENABLED=NO)
npm run build:ios:prod:nostore # Same as prod, without Firebase
# Debug and release builds # Debug and release builds
npm run build:ios:debug # Debug build (builds debug app bundle) npm run build:ios:debug # Debug build (builds debug app bundle)
npm run build:ios:debug:run # Debug build with auto-run (builds then runs on simulator) npm run build:ios:debug:run # Debug build with auto-run (builds then runs on simulator)
@@ -1337,6 +1340,10 @@ npm run build:android:test:run # Test build with auto-run (builds then run
npm run build:android:prod:run # Production build with auto-run (builds then runs on emulator) npm run build:android:prod:run # Production build with auto-run (builds then runs on emulator)
# Auto-run targets the one connected device; with none or several it prompts, or exits 9 without a terminal # Auto-run targets the one connected device; with none or several it prompts, or exits 9 without a terminal
# Firebase off (`:nostore` sets FIREBASE_ENABLED=false, which passes -PfirebaseEnabled=false)
npm run build:android:test:nostore:run # Same as test:run, without Firebase
npm run build:android:prod:nostore # Same as prod, without Firebase
# Debug and release builds # Debug and release builds
npm run build:android:debug # Debug build (builds debug APK) npm run build:android:debug # Debug build (builds debug APK)
npm run build:android:debug:run # Debug build with auto-run (builds then runs on emulator) npm run build:android:debug:run # Debug build with auto-run (builds then runs on emulator)
@@ -1476,7 +1483,7 @@ To create a signed `aab` release:
./gradlew bundleRelease -Dlint.baselines.continue=true ./gradlew bundleRelease -Dlint.baselines.continue=true
``` ```
Firebase is on by default (`firebaseEnabled=true` in `android/gradle.properties`). Do not pass `-PfirebaseEnabled` for a normal release. F-Droid and other builds that must omit Firebase use `-PfirebaseEnabled=false`. Firebase is on by default (`firebaseEnabled=true` in `android/gradle.properties`). Do not pass `-PfirebaseEnabled` for a normal release. F-Droid and other builds that must omit Firebase use `-PfirebaseEnabled=false`, or an npm `:nostore` script (`FIREBASE_ENABLED=false`). `:nostore` only disables Firebase. It does not remove other store-linked dependencies, such as the ML Kit barcode scanner's Play Services library, and it does not by itself make the app run on every device outside the Play Store.
... and find your `aab` file at app/build/outputs/bundle/release ... and find your `aab` file at app/build/outputs/bundle/release
+6 -4
View File
@@ -10,9 +10,11 @@ The app is designed to work on Android devices with and without Google Play Serv
When Firebase is on, `android/app/google-services.json` must exist, be non-empty, and contain `mobilesdk_app_id`. Otherwise configuration fails with an error that names that path. When Firebase is off, the file is ignored even if it is on disk. When Firebase is on, `android/app/google-services.json` must exist, be non-empty, and contain `mobilesdk_app_id`. Otherwise configuration fails with an error that names that path. When Firebase is off, the file is ignored even if it is on disk.
`scripts/build-android.sh` forwards an opt-out: `FIREBASE_ENABLED=false` adds `-PfirebaseEnabled=false` to its Gradle commands. npm scripts do not pass `-PfirebaseEnabled`; they rely on the default. `scripts/build-android.sh` forwards an opt-out: `FIREBASE_ENABLED=false` adds `-PfirebaseEnabled=false` to its Gradle commands. Default npm scripts leave Firebase on. A `:nostore` script sets `FIREBASE_ENABLED=false` and reuses that script (`npm run build:android:test:nostore:run`).
iOS uses the same default. `ios/App/scripts/bundle-firebase-config.sh` copies `ios/App/App/GoogleService-Info.plist` into the app and the share extension. `scripts/build-ios.sh` runs it with `--check` before a device build, and both Xcode targets run it as a build phase. `FIREBASE_ENABLED=false` skips the plist. A missing or empty plist fails the build when Firebase is on. iOS uses the same default. `ios/App/scripts/bundle-firebase-config.sh` copies `ios/App/App/GoogleService-Info.plist` into the app and the share extension. `scripts/build-ios.sh` runs it with `--check` before a device build, and both Xcode targets run it as a build phase. The build and archive `xcodebuild` commands both receive `FIREBASE_ENABLED`. `FIREBASE_ENABLED=false` becomes `FIREBASE_ENABLED=NO` and skips the plist. A `:nostore` script sets that variable (`npm run build:ios:prod:nostore`). A missing or empty plist fails the build when Firebase is on.
`:nostore` disables Firebase only. It does not strip other store-linked dependencies (the ML Kit barcode scanner still pulls in Play Services) and does not guarantee the build will run on every device outside the Play Store.
## Build commands ## Build commands
@@ -21,8 +23,8 @@ iOS uses the same default. `ios/App/scripts/bundle-firebase-config.sh` copies `i
| Local / test / production APK or AAB | `./gradlew assembleRelease` or `bundleRelease` | on | | Local / test / production APK or AAB | `./gradlew assembleRelease` or `bundleRelease` | on |
| Play Store with FCM | `./gradlew bundleRelease` | on | | Play Store with FCM | `./gradlew bundleRelease` | on |
| iOS (Xcode or `scripts/build-ios.sh`) | default | on | | iOS (Xcode or `scripts/build-ios.sh`) | default | on |
| F-Droid / FOSS Android | `./gradlew assembleRelease -PfirebaseEnabled=false` | off | | F-Droid / FOSS Android | `./gradlew assembleRelease -PfirebaseEnabled=false` or `npm run build:android:test:nostore` | off |
| iOS without Firebase | `FIREBASE_ENABLED=false` | off | | iOS without Firebase | `FIREBASE_ENABLED=false` or `npm run build:ios:prod:nostore` | off |
## Behavior on non-GMS devices ## Behavior on non-GMS devices
+10
View File
@@ -26,8 +26,11 @@
"build:android:deploy": "./scripts/build-android.sh --deploy", "build:android:deploy": "./scripts/build-android.sh --deploy",
"build:android:dev": "./scripts/build-android.sh --dev", "build:android:dev": "./scripts/build-android.sh --dev",
"build:android:dev:custom": "./scripts/build-android.sh --dev --api-ip", "build:android:dev:custom": "./scripts/build-android.sh --dev --api-ip",
"build:android:dev:nostore": "FIREBASE_ENABLED=false npm run build:android:dev",
"build:android:dev:run:custom": "./scripts/build-android.sh --dev --api-ip --auto-run", "build:android:dev:run:custom": "./scripts/build-android.sh --dev --api-ip --auto-run",
"build:android:prod": "./scripts/build-android.sh --prod", "build:android:prod": "./scripts/build-android.sh --prod",
"build:android:prod:nostore": "FIREBASE_ENABLED=false npm run build:android:prod",
"build:android:prod:nostore:run": "FIREBASE_ENABLED=false npm run build:android:prod:run",
"build:android:prod:run": "./scripts/build-android.sh --prod --auto-run", "build:android:prod:run": "./scripts/build-android.sh --prod --auto-run",
"build:android:release": "./scripts/build-android.sh --release", "build:android:release": "./scripts/build-android.sh --release",
"build:android:release:run": "./scripts/build-android.sh --release --auto-run", "build:android:release:run": "./scripts/build-android.sh --release --auto-run",
@@ -35,6 +38,8 @@
"build:android:sync": "./scripts/build-android.sh --sync", "build:android:sync": "./scripts/build-android.sh --sync",
"build:android:test": "./scripts/build-android.sh --test", "build:android:test": "./scripts/build-android.sh --test",
"build:android:test:custom": "./scripts/build-android.sh --test --api-ip", "build:android:test:custom": "./scripts/build-android.sh --test --api-ip",
"build:android:test:nostore": "FIREBASE_ENABLED=false npm run build:android:test",
"build:android:test:nostore:run": "FIREBASE_ENABLED=false npm run build:android:test:run",
"build:android:test:run": "./scripts/build-android.sh --test --auto-run", "build:android:test:run": "./scripts/build-android.sh --test --auto-run",
"build:android:test:run:custom": "./scripts/build-android.sh --test --api-ip --auto-run", "build:android:test:run:custom": "./scripts/build-android.sh --test --api-ip --auto-run",
"build:capacitor": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode capacitor --config vite.config.capacitor.mts", "build:capacitor": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode capacitor --config vite.config.capacitor.mts",
@@ -78,9 +83,12 @@
"build:ios:deploy": "./scripts/build-ios.sh --deploy", "build:ios:deploy": "./scripts/build-ios.sh --deploy",
"build:ios:dev": "./scripts/build-ios.sh --dev", "build:ios:dev": "./scripts/build-ios.sh --dev",
"build:ios:dev:custom": "./scripts/build-ios.sh --dev --api-ip", "build:ios:dev:custom": "./scripts/build-ios.sh --dev --api-ip",
"build:ios:dev:nostore": "FIREBASE_ENABLED=false npm run build:ios:dev",
"build:ios:dev:run:custom": "./scripts/build-ios.sh --dev --api-ip --auto-run", "build:ios:dev:run:custom": "./scripts/build-ios.sh --dev --api-ip --auto-run",
"build:ios:ipa": "./scripts/build-ios.sh --ipa", "build:ios:ipa": "./scripts/build-ios.sh --ipa",
"build:ios:prod": "./scripts/build-ios.sh --prod", "build:ios:prod": "./scripts/build-ios.sh --prod",
"build:ios:prod:nostore": "FIREBASE_ENABLED=false npm run build:ios:prod",
"build:ios:prod:nostore:run": "FIREBASE_ENABLED=false npm run build:ios:prod:run",
"build:ios:prod:run": "./scripts/build-ios.sh --prod --auto-run", "build:ios:prod:run": "./scripts/build-ios.sh --prod --auto-run",
"build:ios:release": "./scripts/build-ios.sh --release", "build:ios:release": "./scripts/build-ios.sh --release",
"build:ios:release:run": "./scripts/build-ios.sh --release --auto-run", "build:ios:release:run": "./scripts/build-ios.sh --release --auto-run",
@@ -88,6 +96,8 @@
"build:ios:sync": "./scripts/build-ios.sh --sync", "build:ios:sync": "./scripts/build-ios.sh --sync",
"build:ios:test": "./scripts/build-ios.sh --test", "build:ios:test": "./scripts/build-ios.sh --test",
"build:ios:test:custom": "./scripts/build-ios.sh --test --api-ip", "build:ios:test:custom": "./scripts/build-ios.sh --test --api-ip",
"build:ios:test:nostore": "FIREBASE_ENABLED=false npm run build:ios:test",
"build:ios:test:nostore:run": "FIREBASE_ENABLED=false npm run build:ios:test:run",
"build:ios:test:run": "./scripts/build-ios.sh --test --auto-run", "build:ios:test:run": "./scripts/build-ios.sh --test --auto-run",
"build:ios:test:run:custom": "./scripts/build-ios.sh --test --api-ip --auto-run", "build:ios:test:run:custom": "./scripts/build-ios.sh --test --api-ip --auto-run",
"build:native": "npm run build:capacitor:sync && bash -c 'source scripts/common.sh && ensure_ios_capacitor_asset_directories' && npx capacitor-assets generate --ios --android --assetPath resources", "build:native": "npm run build:capacitor:sync && bash -c 'source scripts/common.sh && ensure_ios_capacitor_asset_directories' && npx capacitor-assets generate --ios --android --assetPath resources",