Compilación, prueba e implementación de aplicaciones Android

En esta guía se explica cómo compilar, probar e implementar aplicaciones Android automáticamente.

Introducción

Siga estas instrucciones para configurar una canalización para una aplicación android de ejemplo.

  1. El código del repositorio siguiente es una aplicación android sencilla. Para empezar, bifurca este repositorio en la cuenta GitHub cliente.

    https://github.com/MicrosoftDocs/pipelines-android
    
  2. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  3. En el proyecto, vaya a la página Pipelines (Canalizaciones). A continuación, elija la acción para crear una canalización.

  4. Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.

  5. Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.

  6. Cuando aparezca la lista de repositorios, seleccione el repositorio de ejemplo de Java.

  7. Azure Pipelines analizará el código del repositorio y recomendará plantillas de inicio para la canalización. Seleccione la plantilla Android.

  8. Azure Pipelines generará un archivo YAML para la canalización. Seleccione Save and run (Guardar y ejecutar) y, luego, seleccione Commit directly to the main branch (Confirmar directamente en la rama principal) y, luego, elija de nuevo Save and run (Guardar y ejecutar).

  9. Se inicia una nueva ejecución. Espere a que finalice.

Cuando haya terminado, tendrá un archivo YAML en funcionamiento ( ) en el repositorio que está listo azure-pipelines.yml para personalizar.

Sugerencia

Para realizar cambios en el archivo YAML como se describe en este tema, seleccione la canalización en la página Pipelines y, a continuación, edite el archivo.

Gradle

Gradle es una herramienta de compilación común que se usa para compilar proyectos de Android. Consulte la tarea Gradle para obtener más información sobre estas opciones.

# https://docs.microsoft.com/azure/devops/pipelines/ecosystems/android
pool:
  vmImage: 'macOS-latest'

steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleDebug'

Ajuste de la ruta de acceso de compilación

Ajuste el valor workingDirectory si el archivo no está en la raíz del repositorio. El valor del directorio debe ser relativo a la raíz del repositorio, como AndroidApps/MyApp o $(system.defaultWorkingDirectory)/AndroidApps/MyApp .

Ajuste el valor de gradleWrapperFile si el archivo no está en la raíz del repositorio. El valor de ruta de acceso del archivo debe ser relativo a la raíz del repositorio, como AndroidApps/MyApp/gradlew o $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew .

Ajuste de tareas de Gradle

Ajuste el valor de las tareas para la variante de compilación que prefiera, como o assembleRelease . Para más información, consulte la documentación de desarrollo de Android de Google: Compilación de un APK de depuracióny Configuración de variantes de compilación.

Firmar y alinear un APK de Android

Si la compilación aún no firma y comprima el APK, agregue la tarea Firma de Android al ARCHIVO YAML. Un APK debe estar firmado para ejecutarse en un dispositivo en lugar de en un emulador. La aplicación zipaligning reduce la RAM consumida por la aplicación.

Importante: Se recomienda almacenar cada una de las siguientes contraseñas en una variable secreta.
- task: AndroidSigning@2
  inputs:
    apkFiles: '**/*.apk'
    jarsign: true
    jarsignerKeystoreFile: 'pathToYourKeystoreFile'
    jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
    jarsignerKeystoreAlias: 'yourKeystoreAlias'
    jarsignerKeyPassword: '$(jarsignerKeyPassword)'
    zipalign: true

Prueba en android Emulator

Nota: La versión Emulator Android solo está disponible actualmente en el agente de macOS hospedado.

Cree la tarea Bash y copie pegue el código siguiente para instalar y ejecutar el emulador. No olvide organizar los parámetros del emulador para que se ajusten a su entorno de pruebas. El emulador se inicia como un proceso en segundo plano y está disponible en las tareas posteriores.

#!/usr/bin/env bash

# Install AVD files
echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;android-27;google_apis;x86'

# Create emulator
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-27;google_apis;x86' --force

$ANDROID_HOME/emulator/emulator -list-avds

echo "Starting emulator"

# Start emulator in background
nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -no-snapshot > /dev/null 2>&1 &
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'

$ANDROID_HOME/platform-tools/adb devices

echo "Emulator started"

Prueba en dispositivos hospedados en Azure

Agregue la App Center test para probar la aplicación en un laboratorio hospedado de dispositivos iOS y Android. Se App Center una evaluación gratuita que se debe convertir posteriormente en de pago.

Regístrese con App Center primero.

# App Center test
# Test app packages with Visual Studio App Center
- task: AppCenterTest@1
  inputs:
    appFile: 
    #artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' 
    #prepareTests: true # Optional
    #frameworkOption: 'appium' # Required when prepareTests == True# Options: appium, espresso, calabash, uitest, xcuitest
    #appiumBuildDirectory: # Required when prepareTests == True && Framework == Appium
    #espressoBuildDirectory: # Optional
    #espressoTestApkFile: # Optional
    #calabashProjectDirectory: # Required when prepareTests == True && Framework == Calabash
    #calabashConfigFile: # Optional
    #calabashProfile: # Optional
    #calabashSkipConfigCheck: # Optional
    #uiTestBuildDirectory: # Required when prepareTests == True && Framework == Uitest
    #uitestStorePath: # Optional
    #uiTestStorePassword: # Optional
    #uitestKeyAlias: # Optional
    #uiTestKeyPassword: # Optional
    #uiTestToolsDirectory: # Optional
    #signInfo: # Optional
    #xcUITestBuildDirectory: # Optional
    #xcUITestIpaFile: # Optional
    #prepareOptions: # Optional
    #runTests: true # Optional
    #credentialsOption: 'serviceEndpoint' # Required when runTests == True# Options: serviceEndpoint, inputs
    #serverEndpoint: # Required when runTests == True && CredsType == ServiceEndpoint
    #username: # Required when runTests == True && CredsType == Inputs
    #password: # Required when runTests == True && CredsType == Inputs
    #appSlug: # Required when runTests == True
    #devices: # Required when runTests == True
    #series: 'master' # Optional
    #dsymDirectory: # Optional
    #localeOption: 'en_US' # Required when runTests == True# Options: da_DK, nl_NL, en_GB, en_US, fr_FR, de_DE, ja_JP, ru_RU, es_MX, es_ES, user
    #userDefinedLocale: # Optional
    #loginOptions: # Optional
    #runOptions: # Optional
    #skipWaitingForResults: # Optional
    #cliFile: # Optional
    #showDebugOutput: # Optional

Conservación de artefactos con el registro de compilación

Agregue las tareas Copiar archivos y Publicar Artifacts compilación para almacenar el APK con el registro o la prueba de compilación e implementarlo en canalizaciones posteriores. Vea Artifacts.

- task: CopyFiles@2
  inputs:
    contents: '**/*.apk'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1

Implementación

App Center

Agregue la App Center Distribuir para distribuir una aplicación a un grupo de evaluadores o usuarios beta, o bien promover la aplicación a Intune o Google Play. Se requiere App Center cuenta gratuita (no es necesario realizar ningún pago).

# App Center distribute
# Distribute app builds to testers and users via Visual Studio App Center
- task: AppCenterDistribute@1
  inputs:
    serverEndpoint: 
    appSlug: 
    appFile: 
    #symbolsOption: 'Apple' # Optional. Options: apple
    #symbolsPath: # Optional
    #symbolsPdbFiles: '**/*.pdb' # Optional
    #symbolsDsymFiles: # Optional
    #symbolsMappingTxtFile: # Optional
    #symbolsIncludeParentDirectory: # Optional
    #releaseNotesOption: 'input' # Options: input, file
    #releaseNotesInput: # Required when releaseNotesOption == Input
    #releaseNotesFile: # Required when releaseNotesOption == File
    #isMandatory: false # Optional
    #distributionGroupId: # Optional

Google Play

Instale la extensión Google Play y use las siguientes tareas para automatizar la interacción con Google Play. De forma predeterminada, estas tareas se autentican para Google Play mediante una conexión de servicio que configure.

Release

Agregue la Google Play release para publicar una nueva versión de la aplicación Android en Google Play store.

- task: GooglePlayRelease@2
  inputs:
    apkFile: '**/*.apk'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    track: 'internal'

Promoción

Agregue la Google Play Promover para promover una actualización de aplicación de Android publicada anteriormente de una pista a otra, como → beta .

- task: GooglePlayPromote@2
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    sourceTrack: 'internal'
    destinationTrack: 'alpha'

Aumento del lanzamiento

Agregue la Google Play aumentar el lanzamiento para aumentar el porcentaje de lanzamiento de una aplicación que se publicó anteriormente en la pista.

- task: GooglePlayIncreaseRollout@1
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)

Preguntas más frecuentes

Cómo crear paquetes de aplicaciones?

Puede compilar y firmar la agrupación de aplicaciones con un script en línea y un archivo seguro. Para ello, primero debe descargar el almacén de claves y almacenarlo como un archivo seguro en la biblioteca. También tendrá que crear variables para keystore.password , y en un grupo de key.aliaskey.passwordkeystore.password.

A continuación, usará las tareas Descargar archivo seguro y Bash para descargar el almacén de claves y compilar y firmar el paquete de aplicaciones.

En este archivo YAML, se descarga un archivo seguro y se usa un app.keystore script de Bash para generar un paquete de aplicaciones. A continuación, use Copiar archivos para copiar la agrupación de aplicaciones. Desde allí, puede crear y guardar un artefacto con Publicar artefacto de compilación o usar la extensión Google Play para publicar.

- task: DownloadSecureFile@1
  name: keyStore
  displayName: "Download keystore from secure files"
  inputs:
    secureFile: app.keystore

- task: Bash@3
  displayName: "Build and sign App Bundle"
  inputs:
    targetType: "inline"
    script: |
      msbuild -restore $(Build.SourcesDirectory)/myAndroidApp/*.csproj -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:Configuration=$(buildConfiguration) -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(keyStore.secureFilePath) -p:AndroidSigningStorePass=$(keystore.password) -p:AndroidSigningKeyAlias=$(key.alias) -p:AndroidSigningKeyPass=$(key.password)

- task: CopyFiles@2
  displayName: 'Copy deliverables'
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/myAndroidApp/bin/$(buildConfiguration)'
    Contents: '*.aab'
    TargetFolder: 'drop'