Erstellen, Testen, & Bereitstellen von Android-Apps

Azure DevOps Services

Sie können Pipelines einrichten, um Android-Anwendungen automatisch zu erstellen, zu testen und bereitzustellen.

Voraussetzungen

Sie müssen über die folgenden Elemente verfügen:

Einrichten der Pipeline

Führen Sie die folgenden Aufgaben aus, um eine Pipeline für eine Beispiel-Android-Anwendung einzurichten.

  1. Fork the following repository to your GitHub account to get the code for a simple Android application.

    https://github.com/MicrosoftDocs/pipelines-android
    
  2. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und wechseln Sie zu Ihrem Projekt.

  3. Wählen Sie Pipelines>Pipeline oder neue Pipeline aus.

  4. Wählen Sie GitHub als Speicherort Ihres Quellcodes aus.

    Screenshot showing list of repositories to select from.

    Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein.

  5. Wählen Sie das -android-Repository aus, das Sie zuvor verzweigt haben.

  6. Wählen Sie " Genehmigen und Installieren" auf dem Bildschirm aus, der folgt.

    Azure Pipelines generiert eine YAML-Datei für Ihre Pipeline.

  7. Klicken Sie auf Run (Ausführen).

  8. Setzen Sie sich direkt in den Hauptzweig ein, und wählen Sie dann erneut "Ausführen " aus.

  9. Warten Sie, bis die Ausführung beendet ist.

Sie verfügen über eine funktionierende YAML-Datei (azure-pipelines.yml) in Ihrem Repository, die für Sie angepasst werden kann.

Tipp

Wenn Sie Änderungen an der YAML-Datei vornehmen möchten, wählen Sie die Pipeline auf der Pipelines Seite aus, und bearbeiten Sie dann die azure-pipelines.yml Datei.

Erstellen mit Gradle

Gradle ist ein gängiges Buildtool, das für das Erstellen von Android-Projekten verwendet wird. Weitere Informationen zu Ihren Optionen finden Sie in der Gradle-Aufgabe .

# 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'

Anpassen des Buildpfads

  • Passen Sie den WorkingDirectory-Wert an, wenn sich Ihre gradlew Datei nicht im Stamm des Repositorys befindet. Der Verzeichniswert sollte dem Stamm des Repositorys ähnlich sein, z AndroidApps/MyApp . B. oder $(system.defaultWorkingDirectory)/AndroidApps/MyApp.

  • Passen Sie den GradleWrapperFile-Wert an, wenn sich Ihre gradlew Datei nicht im Stammverzeichnis des Repositorys befindet. Der Dateipfadwert sollte dem Stamm des Repositorys ähnlich sein, z AndroidApps/MyApp/gradlew . B. oder $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew.

Anpassen von Gradle-Aufgaben

Passen Sie den Aufgabenwert für die gewünschte Buildvariante an, z assembleDebug . B. oder assembleRelease. Weitere Informationen finden Sie in der folgenden Google Android-Entwicklungsdokumentation:

Signieren und Ausrichten eines Android-Pakets (APK)

Wenn Ihr Build die APK nicht bereits signiert und zipalign hat, fügen Sie der YAML die Android-Signaturaufgabe hinzu. Eine APK muss signiert werden, um auf einem Gerät anstelle eines Emulators ausgeführt zu werden. Zipaligning reduziert den VON der Anwendung verbrauchten RAM.

Wichtig

Es wird empfohlen, jede der folgenden Kennwörter in einer geheimen Variable zu speichern.

- task: AndroidSigning@2
  inputs:
    apkFiles: '**/*.apk'
    jarsign: true
    jarsignerKeystoreFile: 'pathToYourKeystoreFile'
    jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
    jarsignerKeystoreAlias: 'yourKeystoreAlias'
    jarsignerKeyPassword: '$(jarsignerKeyPassword)'
    zipalign: true

Testen

Testen sie auf dem Android-Emulator

Hinweis

Das Android-Emulator ist derzeit nur im gehosteten macOS-Agent verfügbar.

Erstellen Sie die Bash-Aufgabe , und kopieren Sie den folgenden Code, um den Emulator zu installieren und auszuführen. Vergessen Sie nicht, die Emulatorparameter an Ihre Testumgebung anzupassen. Der Emulator beginnt als Hintergrundprozess und steht in späteren Aufgaben zur Verfügung.

#!/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"

Testen auf gehosteten Azure-Geräten

Fügen Sie die App Center-Testaufgabe hinzu, um die Anwendung in einem gehosteten Labor von iOS- und Android-Geräten zu testen. Eine kostenlose App Center-Testversion ist erforderlich, die später in kostenpflichtig konvertiert werden muss.

Melden Sie sich zuerst mit App Center an.

# 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

Speichern von Artefakten mit dem Builddatensatz

Fügen Sie die Aufgaben "Dateien kopieren" und "Erstellen" Artifacts veröffentlichen hinzu. Ihre APK wird mit dem Builddatensatz oder -test gespeichert und wird in späteren Pipelines bereitgestellt. Weitere Informationen finden Sie unter Artifacts.

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

Bereitstellen

App Center hinzufügen

Fügen Sie die Aufgabe "App Center Verteilen" hinzu, um eine Anwendung an eine Gruppe von Testern oder Betabenutzern zu verteilen oder die Anwendung auf Intune oder Google Play zu bewerben. Ein kostenloses App Center-Konto ist erforderlich (keine Zahlung ist erforderlich).

# 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

Installieren von Google Play

Installieren Sie die Google Play-Erweiterung und verwenden Sie die folgenden Aufgaben, um die Interaktion mit Google Play zu automatisieren. Standardmäßig authentifizieren sich diese Aufgaben mit einer Dienstverbindung , die Sie konfigurieren, bei Google Play.

Release

Fügen Sie die Aufgabe "Google Play Release" hinzu, um eine neue Android-App-Version im Google Play Store zu veröffentlichen.

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

Höherstufen

Fügen Sie die Aufgabe "Google Play Promote " hinzu, um ein zuvor veröffentlichtes Android-Anwendungsupdate von einem Titel auf einen anderen zu bewerben, z alpha . B. → beta.

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

Erhöhen des Rollouts

Fügen Sie die Aufgabe "Google Play Erhöhen Rollout " hinzu, um den Rollout-Prozentsatz einer Anwendung zu erhöhen, die zuvor für den rollout Track veröffentlicht wurde.

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

Häufig gestellte Fragen

F: Gewusst wie Erstellen von App-Bündeln?

A: Sie können Ihr App-Bundle mit einem Inlineskript und einer sicheren Datei erstellen und signieren. Um dies zu tun, laden Sie zuerst Ihren Keystore herunter und speichern Sie sie als sichere Datei in der Bibliothek. Erstellen Sie dann Variablen für keystore.password, key.aliasund key.password in einer Variablengruppe.

Verwenden Sie als Nächstes die Aufgaben "Sichere Datei herunterladen " und " Bash ", um Ihren Keystore herunterzuladen und Ihr App-Paket zu erstellen und zu signieren.

Laden Sie in dieser YAML-Datei eine app.keystore sichere Datei herunter und verwenden Sie ein Bash-Skript, um ein App-Bundle zu generieren. Verwenden Sie dann "Dateien kopieren" , um das App-Bundle zu kopieren. Erstellen und speichern Sie dort ein Artefakte mit dem Veröffentlichen von Build-Artefakten oder verwenden Sie die Google Play-Erweiterung , um zu veröffentlichen.

- 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'