Sestavování, testování a nasazování aplikací pro Android
Služby Azure DevOps
Kanály můžete nastavit tak, aby automaticky sestavovat, testovat a nasazovat aplikace pro Android.
Požadavky
Musíte mít následující položky:
- Účet GitHub. Pokud nemáte účet GitHubu, vytvořte si ho teď.
- Projekt Azure DevOps Pokud projekt nemáte, vytvořte ho teď.
Nastavení kanálu
Pokud chcete nastavit kanál pro ukázkovou aplikaci pro Android, proveďte následující úlohy.
Vytvořte fork následujícího úložiště do účtu GitHub, abyste získali kód pro jednoduchou aplikaci pro Android.
https://github.com/MicrosoftDocs/pipelines-android
Přihlaste se ke své organizaci Azure DevOps a přejděte do svého projektu.
Vyberte Kanály>vytvořit kanál nebo Nový kanál.
Jako umístění zdrojového kódu vyberte GitHub .
Můžete být přesměrováni na GitHub kvůli přihlášení. Pokud ano, zadejte svoje přihlašovací údaje GitHubu.
Vyberte úložiště -android, které jste dříve rozvětvovali.
Na následující obrazovce vyberte Schválit a nainstalovat .
Azure Pipelines vygeneruje soubor YAML pro váš kanál.
Vyberte Spustit.
Potvrďte se přímo do hlavní větve a pak zvolte Spustit znovu.
Počkejte na dokončení.
Máte v úložišti funkční soubor YAML,azure-pipelines.yml
který je připravený k přizpůsobení.
Tip
Pokud chcete provést změny v souboru YAML, vyberte kanál na stránce Pipelines (Kanály ) a pak upravteazure-pipelines.yml
soubor.
Sestavení s využitím Gradle
Gradle je běžný nástroj pro sestavování projektů pro Android. Další informace o možnostech najdete v úkolu 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'
Úprava cesty sestavení
Upravte hodnotu workingDirectory, pokud
gradlew
váš soubor není v kořenovém adresáři úložiště. Hodnota adresáře by měla být podobná kořenovému adresáři úložiště, napříkladAndroidApps/MyApp
nebo$(system.defaultWorkingDirectory)/AndroidApps/MyApp
.Upravte hodnotu gradleWrapperFile, pokud váš
gradlew
soubor není v kořenovém adresáři úložiště. Hodnota cesty k souboru by měla být podobná kořenovému adresáři úložiště, napříkladAndroidApps/MyApp/gradlew
nebo$(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew
.
Úprava úkolů Gradle
Upravte hodnotu úkolů pro variantu sestavení, kterou dáváte přednost, například assembleDebug
nebo assembleRelease
.
Další informace najdete v následující dokumentaci k vývoji pro Google Android:
- Vytvoření souboru APK pro ladění a
- Nakonfigurujte varianty sestavení.
Podepsání a zarovnání balíčku androidu (APK)
Pokud se váš build ještě nepodepíše a zazipuje APK, přidejte do YAML úlohu podepisování androidu. Soubor APK musí být podepsaný, aby se spustil na zařízení místo emulátoru. Zipaligning snižuje paměť RAM spotřebovanou aplikací.
Důležité
Doporučujeme uložit všechna následující hesla do tajné proměnné.
- task: AndroidSigning@2
inputs:
apkFiles: '**/*.apk'
jarsign: true
jarsignerKeystoreFile: 'pathToYourKeystoreFile'
jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
jarsignerKeystoreAlias: 'yourKeystoreAlias'
jarsignerKeyPassword: '$(jarsignerKeyPassword)'
zipalign: true
Test
Testování v emulátoru Androidu
Vytvořte úlohu Bash a zkopírujte níže uvedený kód, abyste nainstalovali a spustili emulátor. Nezapomeňte uspořádat parametry emulátoru tak, aby vyhovovaly vašemu testovacímu prostředí. Emulátor se spustí jako proces na pozadí a je k dispozici v pozdějších úlohách.
#!/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"
Testování na zařízeních hostovaných v Azure
Přidejte úlohu App Center Test k otestování aplikace v hostované testovacím prostředí zařízení s iOSem a Androidem. Vyžaduje se bezplatná zkušební verze App Center , která se musí později převést na placenou verzi.
Nejdřív se zaregistrujte pomocí 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.
Zachování artefaktů pomocí záznamu buildu
Přidejte úlohy Kopírovat soubory a Publikovat artefakty sestavení. Váš APK se uloží se záznamem sestavení nebo testem a nasadí se v pozdějších kanálech. Další informace najdete v tématu Artefakty.
- task: CopyFiles@2
inputs:
contents: '**/*.apk'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
Nasadit
Přidat App Center
Přidejte úlohu Distribuce App Center pro distribuci aplikace skupině testerů nebo beta uživatelů nebo propagujte aplikaci na Intune nebo Google Play. Vyžaduje se bezplatný účet App Center (nevyžaduje se žádná platba).
# 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.
Instalace Google Play
Nainstalujte rozšíření Google Play a pomocí následujících úloh automatizujte interakci s Google Play. Ve výchozím nastavení se tyto úlohy ověřují ve službě Google Play pomocí připojení služby, které nakonfigurujete.
Verze
Přidejte úlohu vydání Google Play, která vydá novou verzi aplikace pro Android do obchodu Google Play.
- task: GooglePlayRelease@4
inputs:
apkFile: '**/*.apk'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
track: 'internal'
Propagovat
Přidejte úlohu Google Play Promote pro zvýšení úrovně dříve vydané aktualizace aplikace pro Android z jedné skladby na jinou, například alpha
→ beta
.
- task: GooglePlayPromote@3
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
sourceTrack: 'internal'
destinationTrack: 'alpha'
Zvýšení zavedení
Přidejte úlohu Zvýšení zavedení Google Play, abyste zvýšili procento zavedení aplikace, která byla dříve vydána do skladbyrollout
.
- task: GooglePlayIncreaseRollout@2
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)
Aktualizace stavu
Přidejte úlohu Aktualizace stavu Google Play, která aktualizuje stav uvedení aplikace, která byla dříve vydána do trackurollout
.
- task: GooglePlayStatusUpdate@2
inputs:
authType: ServiceEndpoint
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
status: 'inProgress' # draft | inProgress | halted | completed
Související rozšíření
- Kodifikované zabezpečení (kodifikované zabezpečení)
- Google Play (Microsoft)
- Úlohy mobilních aplikací pro iOS a Android (James Montemagno)
- Mobile Testing Lab (Perfecto Mobile)
- React Native (Microsoft)
Často kladené dotazy
Otázka: Návody vytváření sad aplikací?
A: Sadu aplikací můžete sestavit a podepsat pomocí vloženého skriptu a zabezpečeného souboru. Uděláte to tak, že nejprve stáhnete úložiště klíčů a uložíte ho jako zabezpečený soubor do knihovny. Potom vytvořte proměnné pro keystore.password
, key.alias
a key.password
ve skupině proměnných.
Dále pomocí úloh Stáhnout zabezpečený soubor a Bash stáhněte úložiště klíčů a sestavte a podepište sadu aplikací.
V tomto souboru YAML stáhněte app.keystore
zabezpečený soubor a pomocí skriptu Bash vygenerujte sadu aplikací. Potom pomocí kopírování souborů zkopírujte sadu aplikací. Odtud vytvořte a uložte artefakt s publikováním artefaktu sestavení nebo k publikování použijte rozšíření Google Play.
- 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'
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro