55 * For more details take a look at the Java Libraries chapter in the Gradle
66 * User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
77 */
8+ import com.android.build.gradle.internal.tasks.BaseTask
89import org.jetbrains.kotlin.gradle.dsl.JvmTarget
10+ import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated
911import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
12+ import java.util.Base64
1013
1114plugins {
1215 kotlin(" android" )
2831 }
2932}
3033
31- tasks.register<Copy >(" copyGuiAssets" ) {
34+ val copyGuiAssets = tasks.register<Copy >(" copyGuiAssets" ) {
3235 val target = layout.projectDirectory.dir(" src/main/assets/web-gui" )
3336 delete(target)
3437 from(rootProject.layout.projectDirectory.dir(" gui/dist" ))
@@ -37,17 +40,45 @@ tasks.register<Copy>("copyGuiAssets") {
3740 throw GradleException (" You need to run \" pnpm run build\" on the gui folder first!" )
3841 }
3942}
40- tasks.register(" validateKeyStore" ) {
41- val storeFile = android.buildTypes.getByName(" release" ).signingConfig?.storeFile
42- // Only warn for now since this is run even when irrelevant
43- if (storeFile?.isFile != true ) {
44- logger.error(" Android KeyStore file does not exist or is not a file: ${storeFile?.path} " )
45- } else if (storeFile.length() <= 0 ) {
46- logger.error(" Android KeyStore file is empty: ${storeFile.path} " )
43+ tasks.preBuild {
44+ dependsOn(copyGuiAssets)
45+ }
46+
47+ // Set up signing pre/post tasks
48+ val preSign = tasks.register(" preSign" ) {
49+ dependsOn(writeTempKeyStore)
50+ }
51+ val postSign = tasks.register(" postSign" ) {
52+ finalizedBy(deleteTempKeyStore)
53+ }
54+ tasks.withType<BaseTask > {
55+ dependsOn(preSign)
56+ finalizedBy(postSign)
57+ }
58+
59+ // Handle GitHub secret Android KeyStore files
60+ val envKeyStore: String? = System .getenv(" ANDROID_STORE_FILE" )?.takeIf { it.isNotBlank() }
61+ val tempKeyStore = project.layout.buildDirectory.file(" tmp/keystore.tmp.jks" ).get().asFile
62+ val writeTempKeyStore = tasks.register(" writeTempKeyStore" ) {
63+ if (envKeyStore != null ) {
64+ doLast {
65+ tempKeyStore.apply {
66+ ensureParentDirsCreated()
67+ tempKeyStore.writeBytes(Base64 .getDecoder().decode(envKeyStore))
68+ tempKeyStore.deleteOnExit()
69+ }
70+ }
71+ finalizedBy(deleteTempKeyStore)
72+ } else {
73+ enabled = false
4774 }
4875}
49- tasks.preBuild {
50- dependsOn(" :server:android:copyGuiAssets" , " :server:android:validateKeyStore" )
76+ val deleteTempKeyStore = tasks.register<Delete >(" deleteTempKeyStore" ) {
77+ if (envKeyStore != null ) {
78+ delete(tempKeyStore)
79+ } else {
80+ enabled = false
81+ }
5182}
5283
5384tasks.withType<KotlinCompile > {
@@ -136,17 +167,30 @@ android {
136167 // Defines a user-friendly version name for your app.
137168 versionName = extra[" gitVersionName" ] as ? String ? : " v0.0.0"
138169
139- logger.lifecycle(" Configured for SlimeVR Android version $versionName ($versionCode )" )
170+ logger.lifecycle(" i: Configured for SlimeVR Android version \" $versionName \" ($versionCode ). " )
140171
141172 testInstrumentationRunner = " androidx.test.runner.AndroidJUnitRunner"
142173 }
143174
144175 signingConfigs {
145- create(" release" ) {
146- storeFile = file(" ./secrets/keystore.jks" )
147- storePassword = System .getenv(" ANDROID_STORE_PASSWD" )
148- keyAlias = System .getenv(" ANDROID_KEY_ALIAS" )
149- keyPassword = System .getenv(" ANDROID_KEY_PASSWD" )
176+ val inputKeyStore: File ? = if (envKeyStore != null ) {
177+ logger.lifecycle(" i: \" ANDROID_STORE_FILE\" environment variable found, using for signing config." )
178+ tempKeyStore
179+ } else {
180+ file(" secrets/keystore.jks" ).takeIf { it.canRead() && it.length() > 0 }
181+ }
182+
183+ if (inputKeyStore != null ) {
184+ logger.info(" i: Configuring signing for Android KeyStore file: \" ${inputKeyStore.path} \" ." )
185+
186+ create(" release" ) {
187+ storeFile = inputKeyStore
188+ storePassword = System .getenv(" ANDROID_STORE_PASSWD" )
189+ keyAlias = System .getenv(" ANDROID_KEY_ALIAS" ) ? : " key0"
190+ keyPassword = System .getenv(" ANDROID_KEY_PASSWD" )
191+ }
192+ } else {
193+ logger.warn(" w: Android KeyStore file is not valid or not found, skipping signing." )
150194 }
151195 }
152196
@@ -168,7 +212,7 @@ android {
168212 getDefaultProguardFile(" proguard-android-optimize.txt" ),
169213 " proguard-rules.pro" ,
170214 )
171- signingConfig = signingConfigs.getByName (" release" )
215+ signingConfig = signingConfigs.findByName (" release" )
172216 }
173217 }
174218
0 commit comments