Estoy tratando de configurar el proceso de firma para que la contraseña del almacén de claves y la clave no se almacenen en el build.gradle
archivo del proyecto .
Actualmente tengo lo siguiente en el build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Funciona perfectamente bien, pero no debo poner los valores para storePassword
, y keyPassword
en mi repositorio. Preferiría no poner storeFile
y keyAlias
allí tampoco.
¿Hay alguna manera de alterarlo build.gradle
para que obtenga contraseñas de alguna fuente externa (como un archivo que reside solo en mi computadora)?
Y, por supuesto, la alteración build.gradle
debe ser utilizable en cualquier otra computadora (incluso si la computadora no tiene acceso a las contraseñas).
Estoy usando Android Studio y en Mac OS X Maverics si es importante.
android
gradle
android-studio
code-signing
Bobrovsky
fuente
fuente
build.gradle
, tendrá que tener algo más quebuild.gradle
, si eso es un ajuste a las variables de entorno (por una respuesta), un archivo de propiedades (por otra respuesta) o algún otro medio. Si no está dispuesto a tener cosas fuerabuild.gradle
, entonces, por definición, toda la información de firma debe estar dentrobuid.gradle
.Respuestas:
Lo bueno de Groovy es que puedes mezclar libremente código Java, y es bastante fácil de leer en un archivo de clave / valor
java.util.Properties
. Quizás haya una forma aún más fácil de usar Groovy idiomático, pero Java sigue siendo bastante simple.Cree un
keystore.properties
archivo (en este ejemplo, en el directorio raíz de su proyecto al ladosettings.gradle
, aunque puede colocarlo donde desee:Agregue esto a su
build.gradle
:fuente
storeFile file('AndroidManifest.xml')
. Ej. ) Y luego anularlo ocasiona que tenga lugar el proceso de firma.Error:(24, 0) Could not find property 'android' on root project 'RootProjectName'
donde la línea 24 es la que tiene el bloque if. Agregarapply plugin: 'com.android.application'
a la raíz build.gradle también permite que falle la compilación. ¿Qué estoy haciendo mal?Could not get unknown property 'android' for root project
Alternativamente, si desea aplicar la respuesta de Scott Barta de una manera más similar al código gradle generado automáticamente, puede crear un
keystore.properties
archivo en la carpeta raíz del proyecto:y modifique su código gradle para:
Puede almacenar este archivo de propiedades en la raíz de su módulo, en cuyo caso simplemente omita
rootProject
, y también puede modificar este código para tener varios conjuntos de propiedades para diferentes almacenes de claves y alias de claves.fuente
if ( keystorePropertiesFile.exists() )
asegurarme de que el archivo esté presente antes de intentar obtener los atributos e intentar firmar..txt
extensión al final delkeystore.properties
archivo..txt
extensión en elkeystore.properties
archivo.La forma más fácil es crear un
~/.gradle/gradle.properties
archivo.Entonces su
build.gradle
archivo puede verse así:fuente
Después de leer algunos enlaces:
http://blog.macromates.com/2006/keychain-access-from-shell/ http://www.thoughtworks.com/es/insights/blog/signing-open-source-android-apps-without-disclosing- contraseñas
Como está usando Mac OSX, puede usar el Acceso a Llaveros para almacenar sus contraseñas.
Luego, en sus guiones gradle:
Usar así:
fuente
Así es como lo hago. Usar variables de entorno
fuente
Neither path nor baseDir may be null or empty string. path='null'
Es posible tomar cualquier proyecto de gradle de Android Studio existente y construirlo / firmarlo desde la línea de comandos sin editar ningún archivo. Esto lo hace muy agradable para almacenar su proyecto en el control de versiones mientras mantiene sus claves y contraseñas separadas y no en su archivo build.gradle:
fuente
La respuesta aceptada utiliza un archivo para controlar qué almacén de claves usar para firmar el APK que reside en la misma carpeta raíz del proyecto. Cuando usamos vcs como Git , podría ser algo malo cuando olvidamos agregar el archivo de propiedades para ignorar la lista. Porque revelaremos nuestra contraseña al mundo. Los problemas aún persisten.
En lugar de hacer el archivo de propiedades en el mismo directorio dentro de nuestro proyecto, deberíamos hacerlo fuera. Lo hacemos afuera usando el archivo gradle.properties.
Aquí los pasos:
1.Edite o cree gradle.properties en su proyecto raíz y agregue el siguiente código, recuerde editar la ruta con la suya:
2.Cree androidproject.properties en / your / path / y agregue el siguiente código, no olvide cambiar /your/path/to/android.keystore a su ruta de almacén de claves:
3.En el módulo de su aplicación build.gradle (no en la raíz del proyecto build.gradle) agregue el siguiente código si no existe o ajústelo:
4. Agregue el siguiente código debajo del código en el paso 3:
Este código buscará la propiedad AndroidProject.signing en gradle.properties desde el paso 1 . Si se encuentra la propiedad, traducirá el valor de la propiedad como la ruta del archivo que apunta a androidproject.properties que creamos en el paso 2 . Luego, todo el valor de la propiedad se utilizará como configuración de firma para nuestro build.gradle.
Ahora no debemos preocuparnos nuevamente por el riesgo de exponer nuestra contraseña del almacén de claves.
Obtenga más información en Signing Android apk sin poner la información del almacén de claves en build.gradle
fuente
Para aquellos que buscan poner sus credenciales en un archivo JSON externo y leer eso desde el principio, esto es lo que hice:
my_project / credentials.json:
my_project / android / app / build.gradle
La razón por la que elegí un
.json
tipo de archivo, y no un.properties
tipo de archivo (como en la respuesta aceptada), es porque también quería almacenar otros datos (otras propiedades personalizadas que necesitaba) en ese mismo archivo (my_project/credentials.json
), y todavía tengo que analizar el firmando información desde ese archivo también.fuente
Esta pregunta ha recibido muchas respuestas válidas, pero quería compartir mi código que puede ser útil para los encargados del mantenimiento de la biblioteca , ya que deja el original
build.gradle
bastante limpio .Agrego una carpeta al directorio del módulo que yo
gitignore
. Se parece a esto:keystore.jks
ysigning.properties
debe explicarse por sí mismo. Y sesigning.gradle
ve así:Y el original
build.gradle
Como puede ver, no tiene que especificar los buildTypes en absoluto, si el usuario tiene acceso a un
signing
directorio válido , simplemente lo coloca en el módulo y puede construir una aplicación de lanzamiento firmada válida, de lo contrario, simplemente funciona para él como normalmente lo haría.fuente
apply from
tenga en cuenta que debería aparecer después delandroid
bloqueoPuede solicitar contraseñas desde la línea de comando:
Esta respuesta apareció anteriormente: https://stackoverflow.com/a/33765572/3664487
fuente
Mi contraseña contenía un carácter especial cuyo signo de dólar $ y tuve que escapar de eso en el archivo gradle.properties. Después de eso, la firma funcionó para mí.
fuente