Skip to content

Commit

Permalink
Feature/release setup (Android) (#151)
Browse files Browse the repository at this point in the history
* - bump android apps versions

* - release configuration for android apps, including naming, versioning and proguard settings for each app

* - updated ci config
  • Loading branch information
rodvar authored Jan 10, 2025
1 parent 78d16d6 commit ad6ae5a
Show file tree
Hide file tree
Showing 9 changed files with 393 additions and 6 deletions.
12 changes: 11 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,18 @@ jobs:
# sudo xcode-select -s /Applications/Xcode_15.0.app

# TODO: restore androidNode once dependant bisq2 jars get published in a public maven repo
# Create a fake local.properties file
- name: Create fake local.properties
run: |
echo "KEYSTORE_PATH=/path/to/keystore" > local.properties
echo "KEYSTORE_PASSWORD=yourKeystorePassword" >> local.properties
echo "KEY_ALIAS=yourKeyAlias" >> local.properties
echo "CLI_KEY_ALIAS=yourCliKeyAlias" >> local.properties
echo "KEY_PASSWORD=yourKeyPassword" >> local.properties
echo "CLI_KEY_PASSWORD=yourCliKeyPassword" >> local.properties
- name: Build project
run: ./gradlew clean build -x androidNode:build --info
run: ./gradlew clean assembleDebug -x androidNode:assembleDebug --info

- name: Run all project tests
run: ./gradlew test -x androidNode:test
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ replay_pid*
xcuserdata
local.properties

# for release
credentials

## iOS - we currently have this tracked by the repo
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
Expand Down
37 changes: 36 additions & 1 deletion androidClient/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.util.*

plugins {
alias(libs.plugins.kotlinMultiplatform)
Expand Down Expand Up @@ -46,10 +47,22 @@ kotlin {
}
}

val localProperties = Properties()
localProperties.load(File(rootDir, "local.properties").inputStream())

android {
namespace = "network.bisq.mobile.client"
compileSdk = libs.versions.android.compileSdk.get().toInt()

signingConfigs {
create("release") {
storeFile = file( localProperties["KEYSTORE_PATH"] as String)
storePassword = localProperties["KEYSTORE_PASSWORD"] as String
keyAlias = localProperties["CLI_KEY_ALIAS"] as String
keyPassword = localProperties["CLI_KEY_PASSWORD"] as String
}
}

defaultConfig {
applicationId = "network.bisq.mobile.client"
minSdk = libs.versions.android.minSdk.get().toInt()
Expand All @@ -59,6 +72,7 @@ android {
buildConfigField("String", "APP_VERSION", "\"${version}\"")
buildConfigField("String", "SHARED_VERSION", "\"${sharedVersion}\"")
}

packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
Expand All @@ -69,7 +83,28 @@ android {
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
isDebuggable = false
}
getByName("debug") {
isDebuggable = true
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
}
}
applicationVariants.all {
val variant = this
outputs.all {
val output = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl
val appName = "BisqCli"
val version = variant.versionName
val fileName = "$appName-$version.apk"
output.outputFileName = fileName
}
}
buildFeatures {
Expand Down
75 changes: 75 additions & 0 deletions androidClient/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Bisq Cli proguard file

## Ktor
### Keep Ktor Client Core
-keep class io.ktor.** { *; }
-keepattributes *Annotation*

### Avoid removing reflective access needed by Ktor's serialization
-keepnames class kotlinx.serialization.** { *; }

### The following were suggested by R8 engine, should be reviewed carefully on release build testing
-dontwarn java.lang.management.ManagementFactory
-dontwarn java.lang.management.RuntimeMXBean
-dontwarn org.gradle.api.Action
-dontwarn org.gradle.api.Named
-dontwarn org.gradle.api.Plugin
-dontwarn org.gradle.api.Task
-dontwarn org.gradle.api.artifacts.Dependency
-dontwarn org.gradle.api.artifacts.ExternalModuleDependency
-dontwarn org.gradle.api.attributes.Attribute
-dontwarn org.gradle.api.attributes.AttributeCompatibilityRule
-dontwarn org.gradle.api.attributes.AttributeContainer
-dontwarn org.gradle.api.attributes.AttributeDisambiguationRule
-dontwarn org.gradle.api.attributes.HasAttributes
-dontwarn org.gradle.api.component.SoftwareComponent
-dontwarn org.gradle.api.plugins.ExtensionAware
-dontwarn org.gradle.api.tasks.util.PatternFilterable

## General

# Keep Kotlin Metadata
-keepattributes KotlinMetadata

# Keep KMP Framework Class Names
-keep class kotlinx.** { *; }

# Avoid stripping enums used by KMP
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

# Keep Compose Compiler Intrinsics
-keep class androidx.compose.runtime.** { *; }
-keep class androidx.compose.foundation.** { *; }
-keep class androidx.compose.material.** { *; }

# Keep Compose Preview Annotations (if using Android Studio Preview)
-keep @androidx.compose.ui.tooling.preview.Preview class * { *; }

# Keep Composer Intrinsics
-keep class androidx.compose.runtime.internal.ComposableLambdaImpl { *; }

# Keep all classes annotated with @Composable
-keep class * {
@androidx.compose.runtime.Composable *;
}

# Keep Compose compiler metadata
-keepattributes *Annotation*

# Keep Jetpack Compose runtime classes
-keep class androidx.compose.** { *; }

# Keep Kotlin metadata
-keep class kotlin.Metadata { *; }
-keepattributes InnerClasses
-keepattributes EnclosingMethod

# Keep Koin classes and avoid stripping DI components
-keep class org.koin.** { *; }
-keepclassmembers class * {
@org.koin.core.annotation.* <fields>;
@org.koin.core.annotation.* <methods>;
}
3 changes: 3 additions & 0 deletions androidClient/src/androidDebug/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<resources>
<string name="app_name">Bisq Cli (debug)</string>
</resources>
36 changes: 35 additions & 1 deletion androidNode/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import com.google.protobuf.gradle.proto
import org.apache.tools.ant.taskdefs.condition.Os
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import java.util.*

plugins {
alias(libs.plugins.kotlinMultiplatform)
Expand Down Expand Up @@ -61,10 +62,22 @@ kotlin {
}
}

val localProperties = Properties()
localProperties.load(File(rootDir, "local.properties").inputStream())

android {
namespace = "network.bisq.mobile.node"
compileSdk = libs.versions.android.compileSdk.get().toInt()

signingConfigs {
create("release") {
storeFile = file( localProperties["KEYSTORE_PATH"] as String)
storePassword = localProperties["KEYSTORE_PASSWORD"] as String
keyAlias = localProperties["KEY_ALIAS"] as String
keyPassword = localProperties["KEY_PASSWORD"] as String
}
}

sourceSets {
getByName("main") {
java {
Expand Down Expand Up @@ -105,7 +118,28 @@ android {
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
isMinifyEnabled = true
signingConfig = signingConfigs.getByName("release")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
isDebuggable = false
}
getByName("debug") {
isDebuggable = true
applicationIdSuffix = ".debug"
versionNameSuffix = "-debug"
}
}
applicationVariants.all {
val variant = this
outputs.all {
val output = this as com.android.build.gradle.internal.api.BaseVariantOutputImpl
val appName = "Bisq"
val version = variant.versionName
val fileName = "$appName-$version.apk"
output.outputFileName = fileName
}
}
buildFeatures {
Expand Down
Loading

0 comments on commit ad6ae5a

Please sign in to comment.