Version: 2.9.1 | Platform: Android (Flutter) Academic Year: 2026–2027, 1st Semester
| Tool | Version | Notes |
|---|---|---|
| Flutter | 3.x (stable) | flutter --version to check |
| Dart | Included with Flutter | |
| Android Studio | Latest | For Android SDK + emulator |
| Android SDK | API 33+ | Target: API 36 |
| Java | 17 (JDK) | Required by Gradle |
| Git | Any | For cloning |
git clone https://github.com/Zushikina-kun/smartspend-app.git
cd smartspend-app
The app requires Firebase. The google-services.json file is not included in the repo (contains API keys — see SECURITY.md).
A template with placeholder values is at android/app/google-services.json.example.
To set up your own:
com.lucidframe.smartspend_app)google-services.jsonandroid/app/google-services.jsonFirebase services used:
Note for the original dev team: If you need the original
google-services.json, get it from Brix or download it fresh from the Firebase Console. The copy that was previously committed has been removed from tracking — seeSECURITY.md.
The Groq API key is stored in lib/services/app_config.dart which is excluded from git.
Create the file:
# Copy the example file
cp lib/services/app_config.dart.example lib/services/app_config.dart
Then open lib/services/app_config.dart and fill in your Groq key:
static const groqApiKey = "gsk_YOUR_KEY_HERE";
Get a free Groq key at: https://console.groq.com
The key used in development has a 60 req/day cap enforced in-app. For production, rotate the key and consider a server-side proxy.
flutter pub get
flutter run
flutter run
While running, press r in the terminal for hot reload, R for hot restart.
The app uses a proper release keystore so APK updates install over previous versions without uninstalling, and Google Sign-In works correctly.
Files needed (NOT in git — you must have these locally):
android/app/smartspend-release.jks — the keystore fileandroid/key.properties — passwords and aliasandroid/key.properties format:
storePassword=SmartSpend2026!
keyPassword=SmartSpend2026!
keyAlias=smartspend
storeFile=smartspend-release.jks
If you’re setting up on a new machine:
smartspend-release.jks from Brix (keep it safe — losing it means you can never update the app on existing installs)android/key.properties with the content aboveflutter build apk --release --split-per-abi ...SHA-1 fingerprints registered in Firebase:
9E:2E:EE:E5:0A:9D:80:66:4E:79:DF:22:8E:B9:79:8A:E0:C7:F2:2840:B2:1D:58:7A:95:93:55:6D:A2:B0:5A:22:43:D4:1B:D0:C0:D6:624D:1C:67:D4:78:7A:30:20:6D:5B:D5:97:6E:F6:EF:87:3D:91:12:E8All are registered in Firebase Console → Project Settings → Android app → SHA certificate fingerprints. This is required for Google Sign-In to work.
If Google Sign-In fails on a new machine:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass androidgoogle-services.json and replace android/app/google-services.jsonApp Check note: App Check is in debug/monitoring mode for sideloaded APKs (academic builds). Before submitting to Google Play Store, switch App Check to
PlayIntegrityProviderenforcement inmain.dartand register the release SHA-256 fingerprint in Firebase Console.
flutter build apk --release --split-per-abi --shrink --obfuscate --split-debug-info=build/debug-info
Output — 3 APKs, one per CPU architecture:
build/app/outputs/flutter-apk/
├── app-armeabi-v7a-release.apk (~36.9 MB) ← older/32-bit phones (Android 5+)
├── app-arm64-v8a-release.apk (~44.6 MB) ← modern 64-bit phones ← primary
└── app-x86_64-release.apk (~47.5 MB) ← emulators / x86 devices
Which APK to install:
| Device | APK |
|——–|—–|
| Modern phones (2018+, Snapdragon 6xx/8xx, Dimensity, Helio G/A) | app-arm64-v8a-release.apk |
| Older phones (pre-2018, 32-bit, Android 5–7) | app-armeabi-v7a-release.apk |
| Android Studio emulator | app-x86_64-release.apk |
| Not sure | Try arm64-v8a first — if it says “App not installed”, use armeabi-v7a |
| Flag | Effect |
|——|——–|
| --target-platform android-arm64 | Only build for 64-bit ARM (modern phones) |
| --split-per-abi | Separate APK per CPU arch — smaller than fat APK |
| --shrink | R8 code + resource shrinking via ProGuard |
| --obfuscate | Renames classes/methods — reduces DEX size, harder to reverse |
| --split-debug-info=build/debug-info | Required with --obfuscate; saves symbol maps for crash decoding |
Keep the
build/debug-info/folder if you need to decode Crashlytics stack traces.
flutter build apk --release --split-per-abi
# Via ADB
adb install build/app/outputs/flutter-apk/app-arm64-v8a-release.apk
# Or transfer the file to the phone and open it
smartspend-app/
├── lib/
│ ├── main.dart # App entry point
│ ├── models/ # Data models (Expense, Budget, UserProfile)
│ ├── screens/ # All UI screens (31 screens)
│ ├── services/ # Business logic & data layer (23 services)
│ └── widgets/ # Reusable widgets
├── android/
│ └── app/
│ └── google-services.json # ← YOU MUST ADD THIS (not in repo)
├── lib/services/app_config.dart # ← YOU MUST CREATE THIS (not in repo)
├── pubspec.yaml # Dependencies
├── DOCUMENTATION.md # Full technical docs
├── HOWTORUN.md # This file
└── SECURITY.md # Security policy and credential info
google-services.json not foundYou need to add the Firebase config file. See step 2 above.
app_config.dart not foundYou need to create the API key file. See step 3 above.
flutter pub get failsMake sure you’re on Flutter stable channel:
flutter channel stable
flutter upgrade
flutter pub get
Make sure Java 17 is installed and set as JAVA_HOME:
java -version # should show 17.x
Developer Mode warning on WindowsFlutter on Windows requires Developer Mode for symlinks:
Settings → System → For developers → Developer Mode → ON
Check that google-services.json matches the package name com.lucidframe.smartspend (or whatever is in android/app/build.gradle).
Check that the SHA-1 fingerprint of your debug keystore is registered in Firebase. Your debug SHA-1:
4D:1C:67:D4:78:7A:30:20:6D:5B:D5:97:6E:F6:EF:87:3D:91:12:E8
If running on a different machine, generate your own:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
Then add the SHA-1 in Firebase Console → Project Settings → Android app → Add fingerprint, download the updated google-services.json, and rebuild.
Primary test device: Poco X6 Pro (Android 16, HyperOS 2)
app-arm64-v8a-release.apkbiometricOnly: false in local_auth| Package | Purpose |
|---|---|
sqflite |
Local SQLite database |
firebase_auth |
Authentication |
cloud_firestore |
Cloud sync |
firebase_crashlytics |
Crash reporting |
firebase_app_check |
API abuse protection |
google_sign_in |
Google OAuth |
local_auth |
PIN + biometric lock |
google_mlkit_text_recognition |
OCR for receipts |
google_mlkit_barcode_scanning |
Barcode/QR detection |
mobile_scanner |
Live camera barcode scanning |
fl_chart |
Charts (pie, bar, line) |
speech_to_text |
Voice input |
flutter_local_notifications |
Push notifications |
share_plus |
Backup export via share sheet |
file_picker |
Backup restore file picker |
shake |
Shake-to-undo gesture |
http |
Groq API + exchange rate calls |
| *Smart Spend — Lucid Frame | Lorma Colleges CCSE, BSIT | 2026–2027 (1st Semester)* |