2011-03-17 18 views
24

Tengo diez proyectos de Android en una carpeta. Para cada proyecto, puedo usar ant debug para construirlo. Por lo tanto, no es problema escribir un script simple para compilar todos estos proyectos. Yo uso Hudson para construir estos proyectos a diario, y funciona bien.Automation for Android release build

Pero ahora nuestro proyecto debe ir a la fase de lanzamiento. Por lo tanto, el comando de compilación se convierte en ant release. Para compilar un proyecto de lanzamiento, tengo que ingresar la contraseña para el certificado cada vez durante la compilación. Entonces no puedo hacer la automatización para el lanzamiento.

Este trabajo de compilación me mata ya que tengo diez proyectos que todos deben interactuar con la entrada de la contraseña.

¿Cómo puedo hacer que la versión de lanzamiento siga siendo automática?

+0

aquí hay un tutorial que automatiza la entrada de contraseña: http://helpmeco.de/2012/2/compiling-and-signing-android-release-apk-from-the-command-line. – browep

Respuesta

31

Suponiendo que está utilizando herramientas recientes de Android, digamos v9 o v10.

Si nos fijamos en tools/ant/main_rules.xml en el directorio SDK de Android:

<!-- called through target 'release'. Only executed if the keystore and 
    key alias are known but not their password. --> 
<target name="-release-prompt-for-password" if="has.keystore" unless="has.password"> 
    <!-- Gets passwords --> 
    <input 
      message="Please enter keystore password (store:${key.store}):" 
      addproperty="key.store.password" /> 
    <input 
      message="Please enter password for alias '${key.alias}':" 
      addproperty="key.alias.password" /> 
</target> 

<!-- called through target 'release'. Only executed if there's no 
    keystore/key alias set --> 
<target name="-release-nosign" unless="has.keystore"> 
    <echo>No key.store and key.alias properties found in build.properties.</echo> 
    <echo>Please sign ${out.unsigned.file} manually</echo> 
    <echo>and run zipalign from the Android SDK tools.</echo> 
</target> 

Buscando el archivo XML para has.keystore revela:

<!-- properties for signing in release mode --> 
<condition property="has.keystore"> 
    <and> 
     <isset property="key.store" /> 
     <length string="${key.store}" when="greater" length="0" /> 
     <isset property="key.alias" /> 
    </and> 
</condition> 
<condition property="has.password"> 
    <and> 
     <isset property="has.keystore" /> 
     <isset property="key.store.password" /> 
     <isset property="key.alias.password" /> 
    </and> 
</condition> 

así que me supone que tiene que pasar en cuatro define a el build.xml: key.store, key.alias, key.store.password, key.alias.password.

Y recuerde no pasar esas definiciones en la línea de comando por razones de seguridad. :)

1

Solo una nota ... No quería establecer las contraseñas en un archivo de utilerías y, de forma predeterminada, su contraseña se repetirá en la línea de comandos, que también es una preocupación. Agregar el uso de SecureInputHandler a usted main_rules.xml funciona para que su contraseña no esté expuesta en la línea de comando.

<target name="-release-prompt-for-password" if="has.keystore" unless="has.password"> 
    <!-- Gets passwords --> 
    <input 
      message="Please enter keystore password (store:${key.store}):" 
      addproperty="key.store.password" > 
     <handler classname="org.apache.tools.ant.input.SecureInputHandler" /> 
    </input> 
    <input 
      message="Please enter password for alias '${key.alias}':" 
      addproperty="key.alias.password" > 
     <handler classname="org.apache.tools.ant.input.SecureInputHandler" /> 
    </input> 
</target> 
1

echar un vistazo a this artículo, especialmente donde empieza mencionando key.store.password. Lo he usado sin problemas.

Básicamente debe crear algún archivo secure.properties local en su máquina (de compilación), que debe mantenerse relativamente seguro, p. no accesible para todos o no almacenado para todos en control de fuente. Ese archivo almacena las contraseñas como propiedades con los nombres correctos, y se importa al archivo de compilación ANT del proyecto.

8

Puede definir su configuración de almacén de claves en su project.properties en su carpeta de proyecto. Al igual que este

key.store =/ruta/a/su/almacén de claves

key.alias = yourkeyalias

key.store.password = yourkeystorepassword

key.alias.password = yourkeyaliaspassword

+0

¿Puedo preguntarle algo sobre su respuesta, me funcionó solo si tengo la clave antes, pero cómo puedo generarla automáticamente? – Reham

+0

Puede usar el '$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000' para generar un keystore. Los detalles son [aquí] (http://developer.android.com/tools/publishing/app-signing.html) – lishali

22

basada en Gradle construye

1) Crear un archivo secure.properties para contener sus contraseñas:

key.store.password=<your keystore password> 
key.alias.password=<your alias password> 

Probablemente no lo quieren bajo control de versiones, por eso estamos colocando las contraseñas en un archivo separado *.properties. Si no le importa tener sus contraseñas bajo control de versiones, puede ingresar sus contraseñas directamente en build.gradle, pero eso no es recomendable, así que no estoy mostrando eso directamente.

2) Configurar el build.gradle de la siguiente manera:

Properties secureProperties = new Properties() 
secureProperties.load(new FileInputStream("secure.properties")) 

android { 
    signingConfigs { 
     release { 
      storeFile file("<path to your keystore>") 
      storePassword secureProperties['key.store.password'] 
      keyAlias "<alias name>" 
      keyPassword secureProperties['key.alias.password'] 
     } 
    } 

    buildTypes { 
     release { 
      signingConfig signingConfigs.release 
     } 
    } 
} 

Y eso es todo. ./gradlew assembleRelease ahora compila y firma mi APK sin solicitar mi contraseña.

a base de hormiga construye

1) Crear un archivo secure.properties para contener sus contraseñas:

key.store.password=<your keystore password> 
key.alias.password=<your alias password> 

Es probable que no lo quiere bajo control de versiones, por lo que estamos No estoy poniendo las contraseñas en uno de los archivos existentes *.properties. Si no le importa tener sus contraseñas bajo control de versión, ponga estas dos líneas en ant.properties y listo.

2) Cree un archivo custom_rules.xml para indicarle al sistema de compilación sobre su archivo secure.properties.

<?xml version="1.0" encoding="UTF-8"?> 
<project name="custom_rules" default="help"> 
    <property file="secure.properties" /> 
</project> 

No estoy familiarizado con este sistema de construcción, así que no estoy seguro acerca de los projectname o default propiedades del elemento, pero creo que lo he elegido debería funcionar para todo el mundo.

2b) Cualquier versión reciente de las herramientas del SDK de Android debe ser bueno para ir, pero si por alguna razón su archivo build.xml no contiene la siguiente, deberá agregarlo:

<import file="custom_rules.xml" optional="true" /> 

Y eso debería ser. ant release ahora compila y firma mi APK sin solicitar mi contraseña.

+0

¿Dónde se crea el custom_rules.xml? ¿Esto es algo que está registrado en el control de tu versión? – brianestey

+1

@brianestey 'custom_rules.xml' está en la raíz del proyecto, junto con' build.xml'. Lo controlo en el control de versiones. –

+0

¡Gracias por la respuesta rápida! Lo tengo funcionando. =) – brianestey