gioser

sergio/humanoid

HTML 38Markdown 1TOML 10 Definiciones

firma de publicación para las nueve apps, en la raíz

Las apps se repartían firmadas con la clave de depuración de la máquina que
las compilaba: intransferible, regenerable por cualquiera y sin valor como
identidad. Ahora el release se firma con una clave propia (RSA 4096), y como
Android identifica una app por su firma, esa clave es lo que permite publicar
actualizaciones — por eso vive fuera del repo y hay que respaldarla.

La configuración va en subprojects{} con plugins.withId("com.android.application"),
así los nueve módulos la reciben sin repetir el bloque nueve veces. Las
credenciales se leen de propiedades de Gradle (~/.gradle/gradle.properties);
si no están, el release sale sin firmar en vez de romper la compilación, que
es lo que le conviene a un clon ajeno.

Los APK de release ya se publican en gioser.net/humanoid y en el repositorio
F-Droid propio (gioser.net/fdroid/repo). De paso, R8 deja el launcher y el
teclado en 1,5 MB frente a los 10 MB del debug.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016w3QXjA1GHKcJG1sfJAbco

2f085ae865b3c38f375197c0e7ae238935e94464 · por Sergio · (hace 1 mes) · padre 7bf8cd2ca · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +26 −0

diff --git a/build.gradle.kts b/build.gradle.kts
index 9deb573..6786924 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,31 @@
+import com.android.build.api.dsl.ApplicationExtension
+
 plugins {
     alias(libs.plugins.android.application) apply false
     alias(libs.plugins.kotlin.android) apply false
     alias(libs.plugins.kotlin.compose) apply false
 }
+
+// Firma de publicación para las nueve apps, en un solo sitio.
+//
+// Las credenciales viven fuera del repo (~/.gradle/gradle.properties): aquí no
+// hay ni ruta ni contraseña que filtrar. Si no están —otra máquina, un clon
+// ajeno— el release simplemente sale sin firmar en vez de romper la compilación.
+//
+// La firma es la identidad de la app para Android: si cambia, el teléfono no
+// ofrece actualización, obliga a desinstalar. Por eso vive fuera y se respalda.
+subprojects {
+    plugins.withId("com.android.application") {
+        val almacen = (findProperty("rizomaKeystore") as String?)?.let(::file)
+        if (almacen?.exists() != true) return@withId
+        extensions.configure<ApplicationExtension> {
+            val firma = signingConfigs.create("publicacion") {
+                storeFile = almacen
+                storePassword = findProperty("rizomaKeystorePassword") as String?
+                keyAlias = findProperty("rizomaKeyAlias") as String?
+                keyPassword = findProperty("rizomaKeyPassword") as String?
+            }
+            buildTypes.getByName("release").signingConfig = firma
+        }
+    }
+}