Tworzenie, testowanie i wdrażanie aplikacji systemu Android
Azure DevOps Services
Potoki można skonfigurować w celu automatycznego kompilowania, testowania i wdrażania aplikacji systemu Android.
Wymagania wstępne
Musisz mieć następujące elementy:
- Konto usługi GitHub. Jeśli nie masz konta usługi GitHub, utwórz je teraz.
- Projekt usługi Azure DevOps. Jeśli nie masz projektu, utwórz go teraz.
Konfigurowanie potoku
Wykonaj następujące zadania, aby skonfigurować potok dla przykładowej aplikacji systemu Android.
Utwórz rozwidlenie następującego repozytorium na koncie usługi GitHub, aby pobrać kod dla prostej aplikacji systemu Android.
https://github.com/MicrosoftDocs/pipelines-android
Zaloguj się do organizacji usługi Azure DevOps i przejdź do projektu.
Wybierz pozycję Potoki>Utwórz potok lub Nowy potok.
Wybierz pozycję GitHub jako lokalizację kodu źródłowego.
Być może nastąpi przekierowanie do usługi GitHub w celu zalogowania się. Jeśli tak, wprowadź poświadczenia usługi GitHub.
Wybierz wcześniej rozwidlenie repozytorium -android.
Wybierz pozycję Zatwierdź i zainstaluj na poniższym ekranie.
Usługa Azure Pipelines generuje plik YAML dla potoku.
Wybierz Uruchom.
Zatwierdź bezpośrednio w gałęzi głównej, a następnie wybierz pozycję Uruchom ponownie.
Poczekaj na zakończenie przebiegu.
Masz działający plik YAML (azure-pipelines.yml
) w repozytorium, który jest gotowy do dostosowania.
Napiwek
Aby wprowadzić zmiany w pliku YAML, wybierz potok na stronie Potoki , a następnie edytujazure-pipelines.yml
plik.
Kompilowanie przy użyciu narzędzia Gradle
Gradle to typowe narzędzie kompilacji używane do tworzenia projektów systemu Android. Aby uzyskać więcej informacji na temat opcji, zobacz zadanie Gradle .
# https://learn.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'
Dostosowywanie ścieżki kompilacji
Dostosuj wartość workingDirectory, jeśli
gradlew
plik nie znajduje się w katalogu głównym repozytorium. Wartość katalogu powinna być podobna do katalogu głównego repozytorium, takiego jakAndroidApps/MyApp
lub$(system.defaultWorkingDirectory)/AndroidApps/MyApp
.Dostosuj wartość gradleWrapperFile, jeśli
gradlew
plik nie znajduje się w katalogu głównym repozytorium. Wartość ścieżki pliku powinna być podobna do katalogu głównego repozytorium, takiego jakAndroidApps/MyApp/gradlew
lub$(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew
.
Dostosowywanie zadań narzędzia Gradle
Dostosuj wartość zadań dla preferowanego wariantu kompilacji, takiego jak assembleDebug
lub assembleRelease
.
Aby uzyskać więcej informacji, zobacz następującą dokumentację dotyczącą programowania w systemie Google Android:
- Kompilowanie pliku APK debugowania i
- Konfigurowanie wariantów kompilacji.
Podpisywanie i wyrównywanie pakietu systemu Android (APK)
Jeśli kompilacja jeszcze nie podpisze i spakuje plik APK, dodaj zadanie Podpisywanie systemu Android do pliku YAML. Plik APK musi być podpisany w celu uruchomienia na urządzeniu zamiast emulatora. Zipaligning zmniejsza ilość pamięci RAM zużywanej przez aplikację.
- task: AndroidSigning@2
inputs:
apkFiles: '**/*.apk'
jarsign: true
jarsignerKeystoreFile: 'pathToYourKeystoreFile'
jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
jarsignerKeystoreAlias: 'yourKeystoreAlias'
jarsignerKeyPassword: '$(jarsignerKeyPassword)'
zipalign: true
Przetestuj
Testowanie w emulatorze systemu Android
Utwórz zadanie powłoki Bash i skopiuj poniższy kod, aby zainstalować i uruchomić emulator. Nie zapomnij rozmieścić parametrów emulatora, aby dopasować je do środowiska testowego. Emulator jest uruchamiany jako proces w tle i jest dostępny w kolejnych zadaniach.
#!/usr/bin/env bash
# Install AVD files
echo "y" | $ANDROID_HOME/cmdline-tools/latest/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"
Testowanie na urządzeniach hostowanych na platformie Azure
Dodaj zadanie Test usługi App Center, aby przetestować aplikację w hostowanym laboratorium urządzeń z systemami iOS i Android. Wymagana jest bezpłatna wersja próbna centrum aplikacji, która musi zostać później przekonwertowana na płatną.
Najpierw zarejestruj się w usłudze App Center .
# App Center test v1
# Test app packages with Visual Studio App Center.
- task: AppCenterTest@1
inputs:
appFile: # string. Alias: app. Required. Binary application file path.
artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' # string. Alias: artifactsDir. Required. Artifacts directory. Default: $(Build.ArtifactStagingDirectory)/AppCenterTest.
# Prepare Tests
#prepareTests: true # boolean. Alias: enablePrepare. Prepare tests. Default: true.
frameworkOption: 'appium' # 'appium' | 'espresso' | 'calabash' | 'uitest' | 'xcuitest'. Alias: framework. Required when enablePrepare = true. Test framework. Default: appium.
#appiumBuildDirectory: # string. Alias: appiumBuildDir. Required when enablePrepare = true && framework = appium. Build directory.
#espressoBuildDirectory: # string. Alias: espressoBuildDir. Optional. Use when enablePrepare = true && framework = espresso. Build directory.
#espressoTestApkFile: # string. Alias: espressoTestApkPath. Optional. Use when enablePrepare = true && framework = espresso. Test APK path.
#calabashProjectDirectory: # string. Alias: calabashProjectDir. Required when enablePrepare = true && framework = calabash. Project directory.
#calabashConfigFile: # string. Optional. Use when enablePrepare = true && framework = calabash. Cucumber config file.
#calabashProfile: # string. Optional. Use when enablePrepare = true && framework = calabash. Profile to run.
#calabashSkipConfigCheck: false # boolean. Optional. Use when enablePrepare = true && framework = calabash. Skip Configuration Check. Default: false.
#uiTestBuildDirectory: # string. Alias: uitestBuildDir. Required when enablePrepare = true && framework = uitest. Build directory.
#uitestStorePath: # string. Optional. Use when enablePrepare = true && framework = uitest. Store file.
#uiTestStorePassword: # string. Alias: uitestStorePass. Optional. Use when enablePrepare = true && framework = uitest. Store password.
#uitestKeyAlias: # string. Optional. Use when enablePrepare = true && framework = uitest. Key alias.
#uiTestKeyPassword: # string. Alias: uitestKeyPass. Optional. Use when enablePrepare = true && framework = uitest. Key password.
#uiTestToolsDirectory: # string. Alias: uitestToolsDir. Optional. Use when enablePrepare = true && framework = uitest. Test tools directory.
#signInfo: # string. Optional. Use when framework = calabash || framework = uitest. Signing information.
#xcUITestBuildDirectory: # string. Alias: xcuitestBuildDir. Optional. Use when enablePrepare = true && framework = xcuitest. Build directory.
#xcUITestIpaFile: # string. Alias: xcuitestTestIpaPath. Optional. Use when enablePrepare = true && framework = xcuitest. Test IPA path.
#prepareOptions: # string. Alias: prepareOpts. Optional. Use when enablePrepare = true. Additional options.
# Run Tests
#runTests: true # boolean. Alias: enableRun. Run tests. Default: true.
credentialsOption: 'serviceEndpoint' # 'serviceEndpoint' | 'inputs'. Alias: credsType. Required when enableRun = true. Authentication method. Default: serviceEndpoint.
#serverEndpoint: # string. Required when enableRun = true && credsType = serviceEndpoint. App Center service connection.
#username: # string. Required when enableRun = true && credsType = inputs. App Center username.
#password: # string. Required when enableRun = true && credsType = inputs. App Center password.
appSlug: # string. Required when enableRun = true. App slug.
devices: # string. Required when enableRun = true. Devices.
#series: 'master' # string. Optional. Use when enableRun = true. Test series. Default: master.
#dsymDirectory: # string. Alias: dsymDir. Optional. Use when enableRun = true. dSYM directory.
localeOption: 'en_US' # 'da_DK' | 'nl_NL' | 'en_GB' | 'en_US' | 'fr_FR' | 'de_DE' | 'ja_JP' | 'ru_RU' | 'es_MX' | 'es_ES' | 'user'. Alias: locale. Required when enableRun = true. System language. Default: en_US.
#userDefinedLocale: # string. Optional. Use when enableRun = true && locale = user. Other locale.
#loginOptions: # string. Alias: loginOpts. Optional. Use when enableRun = true && credsType = inputs. Additional options for login.
#runOptions: # string. Alias: runOpts. Optional. Use when enableRun = true. Additional options for run.
#skipWaitingForResults: false # boolean. Alias: async. Optional. Use when enableRun = true. Do not wait for test result. Default: false.
# Advanced
#cliFile: # string. Alias: cliLocationOverride. App Center CLI location.
#showDebugOutput: false # boolean. Alias: debug. Enable debug output. Default: false.
Zachowaj artefakty przy użyciu rekordu kompilacji
Dodaj zadania Copy Files (Kopiowanie plików) i Publish Build Artifacts (Publikowanie artefaktów kompilacji). Plik APK jest przechowywany przy użyciu rekordu kompilacji lub testu i jest wdrażany w kolejnych potokach. Aby uzyskać więcej informacji, zobacz Artefakty.
- task: CopyFiles@2
inputs:
contents: '**/*.apk'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
Wdrażaj
Dodawanie centrum aplikacji
Dodaj zadanie Dystrybucji centrum aplikacji, aby rozpowszechnić aplikację w grupie testerów lub użytkowników wersji beta albo podwyższyć poziom aplikacji do usługi Intune lub Sklepu Google Play. Bezpłatne konto centrum aplikacji jest wymagane (nie jest wymagana żadna płatność).
# App Center distribute v3
# Distribute app builds to testers and users via Visual Studio App Center.
- task: AppCenterDistribute@3
inputs:
serverEndpoint: # string. Required. App Center service connection.
appSlug: # string. Required. App slug.
appFile: # string. Alias: app. Required. Binary file path.
#buildVersion: # string. Build version.
releaseNotesOption: 'input' # 'input' | 'file'. Alias: releaseNotesSelection. Required. Create release notes. Default: input.
releaseNotesInput: # string. Required when releaseNotesSelection = input. Release notes.
#releaseNotesFile: # string. Required when releaseNotesSelection = file. Release notes file.
#isMandatory: false # boolean. Require users to update to this release. Default: false.
destinationType: 'groups' # 'groups' | 'store'. Required. Release destination. Default: groups.
#distributionGroupId: # string. Alias: destinationGroupIds. Optional. Use when destinationType = groups. Destination IDs.
#destinationStoreId: # string. Required when destinationType = store. Destination ID.
#isSilent: # boolean. Optional. Use when destinationType = groups. Do not notify testers. Release will still be available to install.
# Symbols
#symbolsOption: 'Apple' # 'Apple' | 'Android' | 'UWP'. Alias: symbolsType. Symbols type. Default: Apple.
#symbolsPath: # string. Optional. Use when symbolsType == AndroidNative || symbolsType = Windows. Symbols path.
#appxsymPath: # string. Optional. Use when symbolsType = UWP. Symbols path (*.appxsym).
#symbolsDsymFiles: # string. Alias: dsymPath. Optional. Use when symbolsType = Apple. dSYM path.
#symbolsMappingTxtFile: # string. Alias: mappingTxtPath. Optional. Use when symbolsType = Android. Mapping file.
#nativeLibrariesPath: # string. Optional. Use when symbolsType == Android. Native Library File Path.
#symbolsIncludeParentDirectory: # boolean. Alias: packParentFolder. Optional. Use when symbolsType = Apple. Include all items in parent folder.
Instalowanie sklepu Google Play
Zainstaluj rozszerzenie Google Play i użyj następujących zadań, aby zautomatyzować interakcję ze sklepem Google Play. Domyślnie te zadania uwierzytelniają się w sklepie Google Play przy użyciu skonfigurowanego połączenia usługi.
Zwolnij
Dodaj zadanie Wydanie sklepu Google Play, aby zwolnić nową wersję aplikacji dla systemu Android do sklepu Google Play.
- task: GooglePlayRelease@4
inputs:
apkFile: '**/*.apk'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
track: 'internal'
Promocja
Dodaj zadanie Podwyższanie poziomu sklepu Google Play, aby podwyższyć poziom wcześniej wydanej aktualizacji aplikacji systemu Android z jednej ścieżki do innej, na przykład alpha
→ beta
.
- task: GooglePlayPromote@3
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
sourceTrack: 'internal'
destinationTrack: 'alpha'
Zwiększanie wdrożenia
Dodaj zadanie Google Play Increase Rollout ,aby zwiększyć procent wdrożenia aplikacji, która została wcześniej wydana na rollout
torze.
- task: GooglePlayIncreaseRollout@2
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)
Aktualizacja stanu
Dodaj zadanie Aktualizacja stanu sklepu Google Play, aby zaktualizować stan wdrożenia aplikacji, która została wcześniej wydana na rollout
torze.
- task: GooglePlayStatusUpdate@2
inputs:
authType: ServiceEndpoint
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
status: 'inProgress' # draft | inProgress | halted | completed
Powiązane rozszerzenia
- Zabezpieczenia skodyfikowane (zabezpieczeń skodyfikowanych)
- Google Play (Microsoft)
- Zadania aplikacji mobilnych dla systemów iOS i Android (James Montemagno)
- Laboratorium do testowania mobilnego (Perfecto Mobile)
- React Native (Microsoft)
Często zadawane pytania
Pyt.: Jak mogę tworzyć pakiety aplikacji?
1: Możesz skompilować i podpisać pakiet aplikacji za pomocą wbudowanego skryptu i bezpiecznego pliku. W tym celu najpierw pobierz magazyn kluczy i zapisz go jako bezpieczny plik w bibliotece. Następnie utwórz zmienne dla keystore.password
, key.alias
i key.password
w grupie zmiennych.
Następnie użyj zadań Pobierz bezpieczny plik i powłokę Bash , aby pobrać magazyn kluczy i skompilować i podpisać pakiet aplikacji.
W tym pliku YAML pobierz app.keystore
bezpieczny plik i użyj skryptu powłoki bash do wygenerowania pakietu aplikacji. Następnie użyj polecenia Copy Files (Kopiuj pliki ), aby skopiować pakiet aplikacji. W tym miejscu utwórz i zapisz artefakt za pomocą polecenia Publikuj artefakt kompilacji lub użyj rozszerzenia Google Play do opublikowania.
- 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'
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla