commit 96ba423a793ef845baa28c707d6051a0401cd4aa
parent 64e6838fdbfe8d8fb1a43362426c4ff145e3e75a
Author: Nilotpal Gupta <nilotpalgupta0701@gmail.com>
Date: Tue, 2 Dec 2025 18:28:18 +0530
added app release related configs
Diffstat:
6 files changed, 112 insertions(+), 6 deletions(-)
diff --git a/.env b/.env
@@ -1 +1 @@
-SERVER_URL = https://locustlike-trieciously-rudolph.ngrok-free.dev
-\ No newline at end of file
+SERVER_URL = https://locustlike-trieciously-rudolph.ngrok-free.dev
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
@@ -0,0 +1,70 @@
+name: Release Android Build
+
+on:
+ push:
+ tags:
+ - "v*" # Triggers the workflow on tags like v1.0.0, v1.0.1, etc.
+
+jobs:
+ build:
+ name: Build APK and Release
+ runs-on: ubuntu-latest
+
+ steps:
+ # 1. Checkout Code (with LFS for your ONNX models)
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ lfs: true
+
+ # 2. Setup Java (Required for Android Build)
+ - name: Setup Java
+ uses: actions/setup-java@v4
+ with:
+ distribution: 'temurin'
+ java-version: '17'
+
+ # 3. Setup Flutter
+ - name: Setup Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ channel: 'stable'
+ flutter-version: '3.38.x'
+
+ # 4. Create .env file from Secrets
+ - name: Create .env file
+ run: echo "${{ secrets.ENV_FILE_CONTENT }}" > .env
+
+ # 5. Decode Keystore (For Signing)
+ - name: Decode Keystore
+ run: |
+ echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > android/app/upload-keystore.jks
+
+ echo "storePassword=${{ secrets.KEYSTORE_PASSWORD }}" >> android/key.properties
+ echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/key.properties
+ echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/key.properties
+ echo "storeFile=upload-keystore.jks" >> android/key.properties
+
+ # 6. Setup Python 3.11 (Matches your local version)
+ - name: Setup Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.11'
+
+ # 7. Install Dependencies
+ - name: Install dependencies
+ run: flutter pub get
+
+ # 8. Build APK
+ # split-per-abi is optional, but --release is mandatory.
+ # Removing split-per-abi creates one "fat" APK compatible with all devices.
+ - name: Build Release APK
+ run: flutter build apk --release
+
+ # 9. Create GitHub Release
+ - name: Create Release
+ uses: softprops/action-gh-release@v2
+ if: startsWith(github.ref, 'refs/tags/')
+ with:
+ files: build/app/outputs/flutter-apk/app-release.apk
+ generate_release_notes: true
diff --git a/android/.gitignore b/android/.gitignore
@@ -9,6 +9,6 @@ GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/to/reference-keystore
-key.properties
+# key.properties
**/*.keystore
**/*.jks
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
@@ -1,3 +1,6 @@
+import java.util.Properties
+import java.io.FileInputStream
+
buildscript {
repositories {
google()
@@ -18,6 +21,13 @@ plugins {
id("dev.flutter.flutter-gradle-plugin")
}
+// 1. Load the key.properties file generated by CI (or your local file)
+val keystoreProperties = Properties()
+val keystorePropertiesFile = rootProject.file("key.properties")
+if (keystorePropertiesFile.exists()) {
+ keystoreProperties.load(FileInputStream(keystorePropertiesFile))
+}
+
android {
namespace = "com.example.adobe"
compileSdk = flutter.compileSdkVersion
@@ -50,11 +60,24 @@ android {
}
}
+ signingConfigs {
+ create("release") {
+ keyAlias = keystoreProperties["keyAlias"] as String?
+ keyPassword = keystoreProperties["keyPassword"] as String?
+ storeFile = keystoreProperties["storeFile"]?.let { file(it) }
+ storePassword = keystoreProperties["storePassword"] as String?
+ }
+ }
+
buildTypes {
release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig = signingConfigs.getByName("debug")
+ // Signing with the relsease keys, so `flutter run --release` works.
+ signingConfig = signingConfigs.getByName("release")
+
+ // Optional: Enable shrinking for smaller APKs (recommended for release)
+ isMinifyEnabled = true
+ isShrinkResources = true
+ proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
}
@@ -64,6 +87,14 @@ chaquopy {
version = "3.8"
val isWindows = System.getProperty("os.name").lowercase().contains("windows")
val pythonFile = if (isWindows) file("../../python_env/Scripts/python.exe") else file("../../python_env/bin/python")
+
+ if (pythonFile.exists()) {
+ buildPython(pythonFile.absolutePath)
+ } else {
+ println("Local python env not found. Using system 'python'.")
+ buildPython("python")
+ }
+
buildPython(pythonFile.absolutePath)
pip {
install("pillow")
diff --git a/android/key.properties b/android/key.properties
@@ -0,0 +1,4 @@
+storePassword=interiit
+keyPassword=interiit
+keyAlias=upload
+storeFile=upload-keystore.jks
diff --git a/key.txt b/key.txt
@@ -0,0 +1 @@
+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
+\ No newline at end of file