tawasuyu

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 · ruwaq Sergio · (1 killa ñawpaq) · tayta 7bf8cd2ca · kay commitpi sach'ata qhaway

Semántico sayk'uy

Mana ima sutichaypas t'ikrakurqanchu: qillqalla, yachachiylla utaq willaylla t'ikrakurqan.

1 qillqakuna · +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
+        }
+    }
+}