Rename app ID to com.bookbridge.app, restore Android build, add CI and release signing - #28
Open
DCT-Berinyuy wants to merge 4 commits into
Open
DCT-Berinyuy wants to merge 4 commits into
DCT-Berinyuy wants to merge 4 commits into
Conversation
Flutter's scaffold placeholder `com.example.*` is rejected by Google Play and unsuitable for the App Store. Replace it with the production identifier `com.bookbridge.app` across every platform target. - android: applicationId + namespace, and move MainActivity.kt to the matching package path (com/bookbridge/app) - android: google-services.json package_name, which the Google Services Gradle plugin requires to match applicationId - ios/macos: PRODUCT_BUNDLE_IDENTIFIER for app and test targets - dart: firebase_options.dart iosBundleId, which was also inconsistent with the iOS project (com.example.book_bridge vs com.example.bookBridge) - linux/windows: APPLICATION_ID and company/copyright metadata This also resolves the pre-existing Android/iOS identifier mismatch, so all platforms now share a single identifier. Note: the Firebase Android/iOS apps must be re-registered under the new identifier and google-services.json regenerated before shipping; the existing mobilesdk_app_id is still bound server-side to the old package. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
No Android build could complete. Three independent, pre-existing issues blocked it; each surfaced only after the previous one was fixed. - AGP 8.7.0 -> 8.13.2. AGP had been downgraded from 8.11.1 in a0026fa, below the 8.11.1 minimum enforced by Flutter 3.47. 8.13.2 is the latest 8.x and avoids the separate AGP 9 migration (new DSL, built-in Kotlin). - Restore `ndkVersion = flutter.ndkVersion`. It was commented out in 0e28706, and the `:jni` plugin failed with "NDK not configured". Flutter 3.47 requires NDK 28.2.13676358. - font_awesome_flutter ^10.12.0 -> ^11.0.0. 10.x subclasses IconData, which is a final class in Flutter 3.47, so Dart compilation failed. 11.0.0 wraps it in FaIconData instead: FaIcon call sites take FaIconData, and plain Icon call sites use `.data`, so rendering is unchanged. - gradle.properties: add `android.builtInKotlin=false` and `android.newDsl=false`. Flutter's migrator inserts these before every build. They have no effect on AGP 8 and prepare for AGP 9. Verified: `flutter build apk --debug` succeeds. aapt2 reports package com.bookbridge.app and launchable activity com.bookbridge.app.MainActivity, and the dex contains no com.example.book_bridge references. `flutter analyze` shows only the 3 pre-existing issues. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
The Android build was broken for six months without anyone noticing, because no CI job built it and nothing pinned the toolchain. This closes those gaps. - Replace the dead dart.yml with flutter.yml. The old workflow only triggered on `main` (work happens on `dev`) and ran `dart analyze` / `dart test`, which cannot pass on a Flutter app. The new job runs on PRs and pushes to dev/main and does: pub get --enforce-lockfile, analyze (fatal on errors), test, `flutter build apk --debug`, and asserts the APK's application ID is com.bookbridge.app. - Pin Flutter 3.47.4 and NDK 28.2.13676358 in CI. The unpinned SDK is what silently broke the build (AGP/NDK minimums, final IconData). - Commit pubspec.lock. It was ignored by a blanket `*.lock` rule, but applications should commit their lockfile so every machine and CI resolve identical versions. It is scoped to the root only. - Remove `org.gradle.java.home=/opt/android-studio/jbr`, a machine-local path that breaks every other machine and CI runner. Flutter already finds Android Studio's bundled JDK and passes it to Gradle. Verified locally: actionlint passes; `flutter pub get --enforce-lockfile` succeeds; `flutter test` passes (9/9); `flutter build apk --debug` succeeds on a fresh Gradle daemon without the java.home override. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Release builds read the upload keystore from android/key.properties, which is gitignored. An incomplete file fails the build and names the missing keys. Without the file, release builds fall back to debug keys and print a warning, so local `flutter run --release` keeps working. Adds android/key.properties.example and README steps for generating, backing up, and registering the upload key. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
3 tasks
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Four commits. Each can be reviewed on its own.
1. Rename app identifier
com.example.*→com.bookbridge.appFlutter's scaffold placeholder
com.example.*is rejected by Google Play and unsuitable for the App Store. It's also expensive to change after first publish: the package name is permanent on Play, and Firebase/OAuth bindings key on it.applicationId+namespacecom.example.book_bridgecom.bookbridge.appMainActivity.ktpackage + pathcom/example/book_bridge/com/bookbridge/app/google-services.jsonpackage_namecom.example.book_bridgecom.bookbridge.appPRODUCT_BUNDLE_IDENTIFIER(app + tests)com.example.bookBridgecom.bookbridge.appfirebase_options.dartiosBundleIdcom.example.book_bridgecom.bookbridge.appAPPLICATION_ID, Windows / macOS metadatacom.example…com.bookbridge.app/ BookBridgeLatent bug fixed:
firebase_options.dartdeclaredcom.example.book_bridgewhile the iOS project usedcom.example.bookBridge. They never matched.2. Restore a working Android build
No Android build could complete before this, independent of the rename. There were three pre-existing blockers, and each surfaced only after the previous one was fixed:
:jniplugin: "NDK not configured"ndkVersioncommented out in 0e28706; Flutter 3.47 needs NDK 28.2.13676358ndkVersion = flutter.ndkVersionIconDatais a final classfont_awesome_flutter10.x subclasses itFaIconsites takeFaIconData; plainIconsites use.data, so rendering is unchangedIt also adds two
gradle.propertiesflags (android.builtInKotlin=false,android.newDsl=false). Flutter's migrator inserts these before every build. They have no effect on AGP 8.3. Android CI and reproducible builds
The build was broken for six months without anyone noticing, because nothing built it and nothing pinned the toolchain.
dart.ymlonly triggered onmainand randart analyze/dart test, which can't pass on a Flutter appflutter.yml, which runs on PRs and pushes todev/main:pub get --enforce-lockfile→ analyze → test →build apk --debug→ checks the APK's application ID iscom.bookbridge.apppubspec.lockignored by a blanket*.lockruleorg.gradle.java.home=/opt/android-studio/jbr, a path that exists on one machine only4. Release signing config
Release builds read the upload keystore from
android/key.properties, which is gitignored along with*.jksand*.keystore. The key never enters the repo.key.propertiescompletekey.propertiespresent but missing fieldskey.propertiesflutter run --releasestill works, and prints a warning on release builds onlyAdds
android/key.properties.exampleand a README "Release builds" section covering keystore generation, backup, and SHA-1 registration.Generate the upload keystore and back it up in at least two durable places outside your laptop, and share it with a second maintainer. Enable Play App Signing when you create the app. That makes a lost upload key recoverable through a reset request. Without it, a lost key means a new listing.
Firebase is still bound to the old package server-side (
mobilesdk_app_id 1:243422993063:android:97feef…). Push notifications and Google Sign-In will fail in release builds until:com.bookbridge.appin thebookbridge-c12faFirebase projectflutterfire configureis re-run to regenerategoogle-services.json,GoogleService-Info.plistandfirebase_options.dartTest plan
APK package: com.bookbridge.appflutter build apk --debugfrom the exact committed state, on a fresh Gradle daemon with nojava.homeoverrideaapt2 dump badging:package: name='com.bookbridge.app',launchable-activity: com.bookbridge.app.MainActivityLcom/bookbridge/app/MainActivity;and nocom/example/book_bridgereferencesflutter pub get --enforce-lockfilepasses;actionlintpasses on the new workflowflutter analyze: only the 3 pre-existing issuesflutter build appbundle --releaseandbuild apk --releaseare both signed by the test cert (apksigner/keytool -printcertSHA-256 matches the keystore)key.properties: the build fails withmissing: storePassword, keyPasswordkey.properties: the release is debug-signed and prints the warning; debug builds print no warningNotes for reviewers
sdkmanagerdelegated to the newandroidCLI, which stalled with zero bytes downloaded. A direct download fromdl.google.com, checked against the SHA-1 in Google'srepository2-3.xml, worked. On GitHub runnerssdkmanagerworks fine.--fatal-warningsonce they're fixed.dev.