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:
- GitHub-Konto. Wenn Sie kein GitHub Konto haben, erstellen Sie jetzt ein Konto.
- Azure DevOps Projekt. Wenn Sie kein Projekt haben, erstellen Sie jetzt ein Projekt.
Einrichten der Pipeline
Führen Sie die folgenden Aufgaben aus, um eine Pipeline für eine Beispiel-Android-Anwendung einzurichten.
Fork the following repository to your GitHub account to get the code for a simple Android application.
https://github.com/MicrosoftDocs/pipelines-android
Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und wechseln Sie zu Ihrem Projekt.
Wählen Sie Pipelines>Pipeline oder neue Pipeline aus.
Wählen Sie GitHub als Speicherort Ihres Quellcodes aus.
Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein.
Wählen Sie das -android-Repository aus, das Sie zuvor verzweigt haben.
Wählen Sie " Genehmigen und Installieren" auf dem Bildschirm aus, der folgt.
Azure Pipelines generiert eine YAML-Datei für Ihre Pipeline.
Klicken Sie auf Run (Ausführen).
Setzen Sie sich direkt in den Hauptzweig ein, und wählen Sie dann erneut "Ausführen " aus.
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, zAndroidApps/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, zAndroidApps/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%)
Verwandte Erweiterungen
- Codierte Sicherheit (codierte Sicherheit )
- Google Play (Microsoft)
- Mobile App-Aufgaben für iOS und Android (James Montemagno)
- Mobile Testlabor (Perfecto Mobile)
- React Native (Microsoft)
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.alias
und 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'