diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f5b7c13f7..f3d560fc2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,11 +34,11 @@ jobs: - name: gradle wrapper run: gradle wrapper - - name: Build with Gradle - run: ./gradlew build + - name: Build for Debug with Gradle + run: ./gradlew assembleDebug - name: Run tests - run: ./gradlew test + run: ./gradlew testDebugUnitTest # TODO ADD COMPOSE TESTS STEP diff --git a/.gitignore b/.gitignore index 3e5251c7d..7f1d0cfdd 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ local.properties # Secrets google-services.json +*.keystore +!debug.keystore +keystore.properties diff --git a/README.md b/README.md index 2a8176146..6100e0a20 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,16 @@ Bitkit Android Native app. ## Localization See repo: https://github.com/synonymdev/bitkit-transifex-sync + +## Build for Release + +Setup the signing config: +- Add the keystore file to root, eg. `./release.keystore` +- Add `keystore.properties` to root of the project (see `keystore.properties.template`) + +Run: +```sh +./gradlew assembleRelease +``` + +APK is generated in `app/build/outputs/apk/release/` diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c939f2d8f..82cb5335b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,4 +1,6 @@ import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag +import java.io.FileInputStream +import java.util.Properties plugins { alias(libs.plugins.android.application) @@ -10,15 +12,34 @@ plugins { alias(libs.plugins.google.services) alias(libs.plugins.room) } + +// https://developer.android.com/studio/publish/app-signing#secure-key +// Init keystoreProperties variable from keystore.properties file +val keystoreProperties by lazy { + val keystorePropertiesFile = rootProject.file("keystore.properties") + val keystoreProperties = Properties() + + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(FileInputStream(keystorePropertiesFile)) + } else { + keystoreProperties["storeFile"] = System.getenv("KEYSTORE_FILE") ?: "" + keystoreProperties["storePassword"] = System.getenv("KEYSTORE_PASSWORD") ?: "" + keystoreProperties["keyAlias"] = System.getenv("KEY_ALIAS") ?: "" + keystoreProperties["keyPassword"] = System.getenv("KEY_PASSWORD") ?: "" + } + + keystoreProperties +} + android { namespace = "to.bitkit" compileSdk = 35 defaultConfig { - applicationId = "to.bitkit" + applicationId = "to.bitkit.dev" minSdk = 28 targetSdk = 35 versionCode = 1 - versionName = "1.0" + versionName = "0.0.1" resourceConfigurations += listOf( "en", // Default (English) "ar", // Arabic @@ -49,18 +70,29 @@ android { keyAlias = "androiddebugkey" keyPassword = "android" } + create("release") { + val keystoreFile = keystoreProperties.getProperty("storeFile").takeIf { it.isNotBlank() } + ?.let { rootProject.file(it) } + storeFile = if (keystoreFile?.exists() == true) keystoreFile else null + // storeFile = rootProject.file(keystoreProperties.getProperty("storeFile")) + storePassword = keystoreProperties.getProperty("storePassword") + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + } } buildTypes { debug { signingConfig = signingConfigs.getByName("debug") - applicationIdSuffix = ".dev" + // applicationIdSuffix = ".dev" } release { isMinifyEnabled = false + isShrinkResources = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + signingConfig = signingConfigs.getByName("release") } } compileOptions { diff --git a/keystore.properties.template b/keystore.properties.template new file mode 100644 index 000000000..ac3fbed83 --- /dev/null +++ b/keystore.properties.template @@ -0,0 +1,4 @@ +storeFile=app/debug.keystore +storePassword=android +keyPassword=android +keyAlias=androiddebugkey