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
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +26 −0
- build.gradle.kts +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
+ }
+ }
+}