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:

Nastavení kanálu

Pokud chcete nastavit kanál pro ukázkovou aplikaci pro Android, proveďte následující úlohy.

  1. 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
    
  2. Přihlaste se ke své organizaci Azure DevOps a přejděte do svého projektu.

  3. Vyberte Kanály>vytvořit kanál nebo Nový kanál.

  4. Jako umístění zdrojového kódu vyberte GitHub .

    Screenshot showing list of repositories to select from.

    Můžete být přesměrováni na GitHub kvůli přihlášení. Pokud ano, zadejte svoje přihlašovací údaje GitHubu.

  5. Vyberte úložiště -android, které jste dříve rozvětvovali.

  6. Na následující obrazovce vyberte Schválit a nainstalovat .

    Azure Pipelines vygeneruje soubor YAML pro váš kanál.

  7. Vyberte Spustit.

  8. Potvrďte se přímo do hlavní větve a pak zvolte Spustit znovu.

  9. 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říklad AndroidApps/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říklad AndroidApps/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:

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 alphabeta.

- 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

Č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.aliasa 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'