Megosztás a következőn keresztül:


Android-alkalmazások létrehozása, tesztelése és üzembe helyezése

Azure DevOps Services

Beállíthat folyamatokat androidos alkalmazások automatikus létrehozására, tesztelésére és üzembe helyezésére.

Előfeltételek

A következő elemekkel kell rendelkeznie:

Folyamat beállítása

Végezze el az alábbi feladatokat egy folyamat beállításához egy minta Android-alkalmazáshoz.

  1. Az alábbi adattár elágaztatása a GitHub-fiókba egy egyszerű Android-alkalmazás kódjának lekéréséhez.

    https://github.com/MicrosoftDocs/pipelines-android
    
  2. Jelentkezzen be az Azure DevOps-szervezetbe, és nyissa meg a projektet.

  3. Válassza a>Folyamatok létrehozása vagyaz Új folyamat lehetőséget.

  4. Válassza a GitHubot a forráskód helyeként.

    Screenshot showing list of repositories to select from.

    Előfordulhat, hogy a rendszer átirányítja a GitHubra a bejelentkezéshez. Ha igen, adja meg a GitHub hitelesítő adatait.

  5. Válassza ki azt az -android adattárat, amelyet korábban elágazott.

  6. Válassza a Jóváhagyás lehetőséget, és telepítse az alábbi képernyőn.

    Az Azure Pipelines létrehoz egy YAML-fájlt a folyamathoz.

  7. Válassza a Futtatás lehetőséget.

  8. Véglegesítse közvetlenül a főágat, majd válassza újra a Futtatás lehetőséget.

  9. Várja meg, amíg a futtatás befejeződik.

Rendelkezik egy működő YAML-fájllal (azure-pipelines.yml) az adattárban, amely készen áll a testreszabásra.

Tipp.

A YAML-fájl módosításához jelölje ki a folyamatot a Folyamatok lapon, majd szerkessze a azure-pipelines.yml fájlt.

Buildelés a Gradle használatával

A Gradle egy gyakori buildelési eszköz, amelyet Android-projektek készítéséhez használnak. A lehetőségekről további információt a Gradle-feladatban talál.

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

A buildelési útvonal módosítása

  • Módosítsa a workingDirectory értéket, ha a gradlew fájl nincs az adattár gyökerében. A könyvtárértéknek az adattár gyökeréhez hasonlónak kell lennie, például AndroidApps/MyApp vagy $(system.defaultWorkingDirectory)/AndroidApps/MyApp.

  • Módosítsa a gradleWrapperFile értéket, ha a gradlew fájl nincs az adattár gyökerében. A fájl elérési útja értékének hasonlónak kell lennie az adattár gyökeréhez, például AndroidApps/MyApp/gradlew vagy $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew.

Gradle-tevékenységek módosítása

Állítsa be a kívánt buildvariáns tevékenységértékét , például assembleDebug vagy assembleRelease. További információkért tekintse meg a Google Android következő fejlesztési dokumentációját:

Android-csomag (APK) aláírása és igazítása

Ha a build még nem írta alá és zipalign az APK-t, adja hozzá az Android-aláírási feladatot a YAML-hez. Az APK-t alá kell írni, hogy emulátor helyett egy eszközön fusson. A zipaligning csökkenti az alkalmazás által felhasznált RAM-ot.

Fontos

Javasoljuk, hogy az alábbi jelszavakat egy titkos változóban tárolja.

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

Test

Tesztelés az Android Emulatoron

Hozza létre a Bash-feladatot , és másolja be az alábbi kódot az emulátor telepítéséhez és futtatásához. Ne felejtse el elrendezni az emulátor paramétereit a tesztelési környezetnek megfelelően. Az emulátor háttérfolyamatként indul, és a későbbi feladatokban is elérhető.

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

Tesztelés Az Azure által üzemeltetett eszközökön

Adja hozzá az App Center tesztfeladatot az alkalmazás teszteléséhez iOS- és Android-eszközök üzemeltetett tesztkörnyezetében. Az App Center ingyenes próbaverziója szükséges, amelyet később fizetőssé kell alakítani.

Először regisztráljon az App Centerrel .

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

Összetevők megőrzése a buildrekorddal

Adja hozzá a Fájlok másolása és buildösszetevők közzététele feladatokat . Az APK a buildrekorddal vagy a teszttel együtt lesz tárolva, és a későbbi folyamatokban lesz üzembe helyezve. További információ: Összetevők.

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

Üzembe helyezés

App Center hozzáadása

Adja hozzá az App Center Distribute feladatot, amely egy alkalmazást tesztelők vagy bétafelhasználók egy csoportjának terjeszt, vagy előlépteti az alkalmazást az Intune-ban vagy a Google Play-ben. Ingyenes App Center-fiók szükséges (nincs szükség fizetésre).

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

A Google Play telepítése

Telepítse a Google Play bővítményt , és az alábbi feladatokkal automatizálja a Google Playrel való interakciót. Alapértelmezés szerint ezek a feladatok konfigurált szolgáltatáskapcsolattal hitelesítik a Google Play-et.

Felszabadítás

Adja hozzá a Google Play kiadási feladatát, hogy kiadjon egy új Android-alkalmazásverziót a Google Play Áruházban.

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

Reklámozás

Adja hozzá a Google Play-előléptetési feladatot egy korábban kiadott Android-alkalmazás frissítésének egyik sávról a másikra való előléptetéséhez, például alphabeta.

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

Bevezetés növelése

Adja hozzá a Google Play -beli bevezetési feladatot, hogy növelje a sávon korábban kiadott alkalmazás bevezetési százalékos arányát rollout .

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

Állapotfrissítés

Adja hozzá a Google Play állapotfrissítési feladatát a korábban a trackben megjelent alkalmazás bevezetési állapotának rollout frissítéséhez.

  - task: GooglePlayStatusUpdate@2
    inputs:
      authType: ServiceEndpoint
      packageName: 'com.yourCompany.appPackageName'
      serviceEndpoint: 'yourGooglePlayServiceConnectionName'
      status: 'inProgress' # draft | inProgress | halted | completed

GYIK

K: Hogyan hozzon létre alkalmazáscsomagokat?

Válasz: Létrehozhatja és aláírhatja az alkalmazáscsomagot egy beágyazott szkripttel és egy biztonságos fájllal. Ehhez először töltse le a kulcstárat, és tárolja biztonságos fájlként a tárban. Ezután hozzon létre változókat a keystore.password, key.aliasés key.password egy változócsoportban.

Ezután a Biztonságos fájl letöltése és a Bash-feladatok segítségével töltse le a kulcstárat, és hozza létre és írja alá az alkalmazáscsomagot.

Ebben a YAML-fájlban töltsön le egy app.keystore biztonságos fájlt, és használjon bash-szkriptet egy alkalmazáscsomag létrehozásához. Ezután használja a Fájlok másolása parancsot az alkalmazáscsomag másolásához. Innen hozzon létre és mentsen egy összetevőt a Build-összetevő közzététele vagy a Google Play-bővítmény használatával a közzétételhez.

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