Android uygulamaları oluşturma, test etme ve dağıtma

Azure DevOps Services

Android uygulamalarını otomatik olarak derlemek, test etmek ve dağıtmak için işlem hatlarını ayarlayabilirsiniz.

Önkoşullar

Aşağıdaki öğelere sahip olmanız gerekir:

  • GitHub hesabı. GitHub hesabınız yoksa şimdi bir hesap oluşturun.
  • Azure DevOps projesi. Projeniz yoksa şimdi bir proje oluşturun.

İşlem hattını ayarlama

Örnek bir Android uygulaması için işlem hattı ayarlamak üzere aşağıdaki görevleri gerçekleştirin.

  1. Basit bir Android uygulamasının kodunu almak için aşağıdaki depoyu GitHub hesabınıza çatallayın.

    https://github.com/MicrosoftDocs/pipelines-android
    
  2. Azure DevOps kuruluşunuzda oturum açın ve projenize gidin.

  3. İşlem Hatları>İşlem hattı oluştur'u veya Yeni işlem hattı'ni seçin.

  4. Kaynak kodunuzun konumu olarak GitHub'ı seçin.

    Screenshot showing list of repositories to select from.

    Oturum açmak için GitHub'a yönlendirilebilirsiniz. Öyleyse GitHub kimlik bilgilerinizi girin.

  5. Önceden çatalını oluşturduğunuz -android deposunu seçin.

  6. Onayla'yı seçin ve aşağıdaki ekranda yükleyin .

    Azure Pipelines, işlem hattınız için bir YAML dosyası oluşturur.

  7. Çalıştır seçin.

  8. Doğrudan ana dala işleyin ve yeniden Çalıştır'ı seçin.

  9. Çalıştırmanın bitmesini bekleyin.

Deponuzda özelleştirmeniz için hazır çalışan bir YAML dosyanız (azure-pipelines.yml) var.

Bahşiş

YAML dosyasında değişiklik yapmak için İşlem Hatları sayfasında işlem hattını seçin ve dosyayı düzenleyinazure-pipelines.yml.

Gradle ile derleme

Gradle, Android projeleri oluşturmak için kullanılan yaygın bir derleme aracıdır. Seçenekleriniz hakkında daha fazla bilgi için bkz . Gradle görevi.

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

Derleme yolunu ayarlama

  • Dosyanız gradlew deponun kökünde değilse workingDirectory değerini ayarlayın. Dizin değeri, veya $(system.defaultWorkingDirectory)/AndroidApps/MyAppgibi AndroidApps/MyApp deponun köküne benzer olmalıdır.

  • Dosyanız gradlew deponun kökünde değilse gradleWrapperFile değerini ayarlayın. Dosya yolu değeri, veya $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlewgibi AndroidApps/MyApp/gradlew deponun köküne benzer olmalıdır.

Gradle görevlerini ayarlama

veya assembleReleasegibi assembleDebug tercih ettiğiniz derleme değişkeninin görev değerini ayarlayın. Daha fazla bilgi için aşağıdaki Google Android geliştirme belgelerine bakın:

Android Paketini (APK) imzalama ve hizalama

Derlemeniz APK'yı henüz imzalamaz ve sıkıştırmazsa Android İmzalama görevini YAML'ye ekleyin. Öykünücü yerine bir cihazda çalıştırmak için APK imzalanmalıdır. Zipaligning, uygulama tarafından kullanılan RAM'i azaltır.

Önemli

Aşağıdaki parolaların her birini bir gizli dizi değişkeninde depolamanızı öneririz.

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

Test etme

Android Öykünücüsü'nda test edin

Bash görevini oluşturun ve öykünücüyü yüklemek ve çalıştırmak için aşağıdaki kodu yapıştırın. Öykünücü parametrelerini test ortamınıza uyacak şekilde düzenlemeyi unutmayın. Öykünücü bir arka plan işlemi olarak başlar ve sonraki görevlerde kullanılabilir.

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

Azure tarafından barındırılan cihazlarda test edin

Uygulamayı iOS ve Android cihazların barındırılan laboratuvarında test etmek için App Center Test görevini ekleyin. App Center ücretsiz deneme sürümü gereklidir ve bu denemenin daha sonra ücretliye dönüştürülmesi gerekir.

Önce App Center'a kaydolun.

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

Yapıtları derleme kaydıyla tutma

Dosyaları Kopyala ve Derleme Yapıtlarını Yayımla görevlerini ekleyin. APK'niz derleme kaydı veya test ile depolanır ve sonraki işlem hatlarında dağıtılır. Daha fazla bilgi için bkz . Yapıtlar.

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

Dağıt

App Center ekle

Uygulamayı test eden veya beta kullanıcı grubuna dağıtmak ya da uygulamayı Intune veya Google Play'e yükseltmek için App Center Distribute görevini ekleyin. Ücretsiz bir App Center hesabı gereklidir (ödeme gerekmez).

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

Google Play'i yükleme

Google Play uzantısını yükleyin ve Google Play ile etkileşimi otomatikleştirmek için aşağıdaki görevleri kullanın. Varsayılan olarak, bu görevler yapılandırdığınız bir hizmet bağlantısını kullanarak Google Play'de kimlik doğrulaması yapar.

Sürüm

Google Play Mağazası'na yeni bir Android uygulaması sürümü yayınlamak için Google Play Yayın görevi ekleyin.

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

Yükselt

Daha önce yayımlanmış bir Android uygulama güncelleştirmesini → gibi alphabetabir parçadan diğerine yükseltmek için Google Play Yükseltme görevini ekleyin.

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

Dağıtımı artırma

Daha önce parçada yayımlanan rollout bir uygulamanın dağıtım yüzdesini artırmak için Google Play Dağıtımı Artır görevini ekleyin.

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

Durum güncelleştirmesi

Daha önce parçada yayımlanan rollout uygulamanın dağıtım durumunu güncelleştirmek için Google Play Durum Güncelleştirmesi görevini ekleyin.

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

SSS

S: Uygulama paketleri Nasıl yaparım? oluşturulsun?

Y: Uygulama paketinizi satır içi betik ve güvenli bir dosyayla derleyebilir ve imzalayabilirsiniz. Bunu yapmak için önce keystore'nuzu indirin ve kitaplıkta güvenli bir dosya olarak depolayın. Ardından, bir değişken grubunda , key.aliasve key.password için keystore.passworddeğişkenler oluşturun.

Ardından Güvenli Dosyayı İndir ve Bash görevlerini kullanarak anahtar deponuzu indirin ve uygulama paketinizi derleyip imzalayın.

Bu YAML dosyasında güvenli bir app.keystore dosya indirin ve bir bash betiği kullanarak uygulama paketi oluşturun. Ardından, uygulama paketini kopyalamak için Dosyaları Kopyala'yı kullanın. Buradan Derleme Yapıtını Yayımla ile bir yapıt oluşturup kaydedin veya yayımlamak için Google Play uzantısını kullanın.

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