From 4f7421ace92fc415dd742192c2ebfdec660ffa04 Mon Sep 17 00:00:00 2001 From: alexpolo1 Date: Sat, 28 Feb 2026 23:28:39 +0100 Subject: [PATCH] Add consistent APK signing so updates install without uninstalling - Generate pixel10.keystore and store as KEYSTORE_BASE64 GitHub secret - Release workflow decodes keystore and signs every APK with same key - build.gradle.kts: signingConfig reads from env (CI) or local keystore - Bump versionCode 8 / versionName 1.8.0 Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/release.yml | 11 ++++++++++- .gitignore | 1 + app/build.gradle.kts | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d813c99..35dc31e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,16 @@ jobs: key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} restore-keys: gradle- - - name: Build debug APK + - name: Decode signing keystore + run: | + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > "$RUNNER_TEMP/pixel10.keystore" + + - name: Build signed debug APK + env: + KEYSTORE_PATH: ${{ runner.temp }}/pixel10.keystore + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} run: ./gradlew assembleDebug --no-daemon - name: Rename APK with version tag diff --git a/.gitignore b/.gitignore index dc81b83..6493a8f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ local.properties *.bin *.task *.tflite +pixel10.keystore diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b08e25a..6cfc920 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -11,8 +11,27 @@ android { applicationId = "com.pixel10.ai" minSdk = 31 targetSdk = 35 - versionCode = 7 - versionName = "1.7.0" + versionCode = 8 + versionName = "1.8.0" + } + + val keystoreFile = rootProject.file("pixel10.keystore") + val keystoreEnv = System.getenv("KEYSTORE_PATH") + + signingConfigs { + create("release") { + if (keystoreEnv != null) { + storeFile = file(keystoreEnv) + storePassword = System.getenv("KEYSTORE_PASSWORD") + keyAlias = System.getenv("KEY_ALIAS") + keyPassword = System.getenv("KEY_PASSWORD") + } else if (keystoreFile.exists()) { + storeFile = keystoreFile + storePassword = "pixel10ai" + keyAlias = "pixel10" + keyPassword = "pixel10ai" + } + } } buildTypes { @@ -22,6 +41,16 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + val releaseSigning = signingConfigs.getByName("release") + if (releaseSigning.storeFile != null) { + signingConfig = releaseSigning + } + } + debug { + val releaseSigning = signingConfigs.getByName("release") + if (releaseSigning.storeFile != null) { + signingConfig = releaseSigning + } } }