Compare commits

..

8 Commits

Author SHA1 Message Date
zarzet 9ca0e8cf5c v1.5.0-hotfix6: Use sign-android-release action 2026-01-02 04:29:55 +07:00
zarzet 37b8682faa v1.5.0-hotfix5: Use key.properties per Flutter docs 2026-01-02 04:27:02 +07:00
zarzet 6563f0f2b3 Remove APK from tracking 2026-01-02 04:17:44 +07:00
zarzet 562fd4d7bb v1.5.0-hotfix4: Create keystore.properties in workflow 2026-01-02 04:17:24 +07:00
zarzet 7aa3e77df1 Remove APK 2026-01-02 04:10:07 +07:00
zarzet 4caa803eb2 v1.5.0-hotfix3: Decode keystore in workflow 2026-01-02 04:09:49 +07:00
zarzet 6d5c9d0f91 Remove accidentally committed APK 2026-01-02 03:52:00 +07:00
zarzet 1b2ad4cdd5 v1.5.0-hotfix2: Fix CI signing config 2026-01-02 03:51:41 +07:00
6 changed files with 39 additions and 35 deletions
+16 -8
View File
@@ -86,21 +86,29 @@ jobs:
- name: Generate app icons
run: dart run flutter_launcher_icons
- name: Build APK (Release)
- name: Build APK (Release - unsigned)
run: flutter build apk --release --split-per-abi
- name: Sign APKs
uses: r0adkll/sign-android-release@v1
id: sign_arm64
with:
releaseDirectory: build/app/outputs/flutter-apk
signingKeyBase64: ${{ secrets.KEYSTORE_BASE64 }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEYSTORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
BUILD_TOOLS_VERSION: "34.0.0"
- name: Rename APKs
run: |
VERSION=${{ needs.get-version.outputs.version }}
cd build/app/outputs/flutter-apk
mv app-arm64-v8a-release.apk SpotiFLAC-${VERSION}-arm64.apk || true
mv app-armeabi-v7a-release.apk SpotiFLAC-${VERSION}-arm32.apk || true
mv app-release.apk SpotiFLAC-${VERSION}-universal.apk || true
# Signed files have -signed suffix
mv app-arm64-v8a-release-signed.apk SpotiFLAC-${VERSION}-arm64.apk || mv app-arm64-v8a-release.apk SpotiFLAC-${VERSION}-arm64.apk || true
mv app-armeabi-v7a-release-signed.apk SpotiFLAC-${VERSION}-arm32.apk || mv app-armeabi-v7a-release.apk SpotiFLAC-${VERSION}-arm32.apk || true
mv app-release-signed.apk SpotiFLAC-${VERSION}-universal.apk || mv app-release.apk SpotiFLAC-${VERSION}-universal.apk || true
ls -la
- name: Upload APK artifact
+1
View File
@@ -43,6 +43,7 @@ android/*.iml
android/keystore.properties
android/*.jks
android/*.keystore
android/app/ci-keystore.jks
# iOS
ios/Frameworks/
+10
View File
@@ -1,5 +1,15 @@
# Changelog
## [1.5.0-hotfix3] - 2026-01-02
### Fixed
- **App Signing**: Decode keystore in workflow before Gradle evaluation
## [1.5.0-hotfix2] - 2026-01-02
### Fixed
- **App Signing**: Fixed CI/CD signing configuration
## [1.5.0-hotfix] - 2026-01-02
### Important Notice
+9 -24
View File
@@ -5,8 +5,8 @@ plugins {
id("dev.flutter.flutter-gradle-plugin")
}
// Load keystore properties from file if exists
val keystorePropertiesFile = rootProject.file("keystore.properties")
// Load keystore properties for local builds
val keystorePropertiesFile = rootProject.file("key.properties")
val keystoreProperties = java.util.Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(java.io.FileInputStream(keystorePropertiesFile))
@@ -30,25 +30,12 @@ android {
}
signingConfigs {
create("release") {
if (keystorePropertiesFile.exists()) {
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
if (keystorePropertiesFile.exists()) {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
} else if (System.getenv("KEYSTORE_BASE64") != null) {
// CI/CD: decode keystore from base64 environment variable
val keystoreFile = file("${project.buildDir}/keystore.jks")
if (!keystoreFile.exists()) {
keystoreFile.parentFile.mkdirs()
keystoreFile.writeBytes(
java.util.Base64.getDecoder().decode(System.getenv("KEYSTORE_BASE64"))
)
}
storeFile = keystoreFile
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
}
@@ -61,8 +48,6 @@ android {
versionName = flutter.versionName
multiDexEnabled = true
// Only include arm64-v8a for smaller APK (most modern devices)
// Remove this line if you need to support older 32-bit devices
ndk {
abiFilters += listOf("arm64-v8a", "armeabi-v7a")
}
@@ -70,13 +55,13 @@ android {
buildTypes {
release {
// Use release signing config if available, otherwise fall back to debug
signingConfig = if (signingConfigs.findByName("release")?.storeFile != null) {
// For local builds: use release signing if key.properties exists
// For CI builds: APK is signed by GitHub Action after build
signingConfig = if (keystorePropertiesFile.exists()) {
signingConfigs.getByName("release")
} else {
signingConfigs.getByName("debug")
}
// Enable code shrinking and resource shrinking
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
+2 -2
View File
@@ -1,8 +1,8 @@
/// App version and info constants
/// Update version here only - all other files will reference this
class AppInfo {
static const String version = '1.5.0-hotfix';
static const String buildNumber = '15';
static const String version = '1.5.0-hotfix6';
static const String buildNumber = '20';
static const String fullVersion = '$version+$buildNumber';
static const String appName = 'SpotiFLAC';
+1 -1
View File
@@ -1,7 +1,7 @@
name: spotiflac_android
description: Download Spotify tracks in FLAC from Tidal, Qobuz & Amazon Music
publish_to: 'none'
version: 1.5.0+15
version: 1.5.0+20
environment:
sdk: ^3.10.0