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 <noreply@anthropic.com>
This commit is contained in:
alexpolo1
2026-02-28 23:28:39 +01:00
parent 0c26c836d6
commit 4f7421ace9
3 changed files with 42 additions and 3 deletions

View File

@@ -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

1
.gitignore vendored
View File

@@ -15,3 +15,4 @@ local.properties
*.bin
*.task
*.tflite
pixel10.keystore

View File

@@ -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
}
}
}