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.
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
Azure DevOps kuruluşunuzda oturum açın ve projenize gidin.
İşlem Hatları>İşlem hattı oluştur'u veya Yeni işlem hattı'ni seçin.
Kaynak kodunuzun konumu olarak GitHub'ı seçin.
Oturum açmak için GitHub'a yönlendirilebilirsiniz. Öyleyse GitHub kimlik bilgilerinizi girin.
Önceden çatalını oluşturduğunuz -android deposunu seçin.
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.
Çalıştır seçin.
Doğrudan ana dala işleyin ve yeniden Çalıştır'ı seçin.
Ç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/MyApp
gibiAndroidApps/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/gradlew
gibiAndroidApps/MyApp/gradlew
deponun köküne benzer olmalıdır.
Gradle görevlerini ayarlama
veya assembleRelease
gibi 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:
- Hata ayıklama APK'sı oluşturma ve
- Derleme değişkenlerini yapılandırı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 alpha
beta
bir 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
İlgili uzantılar
- Codified Security (Codified Security)
- Google Play (Microsoft)
- iOS ve Android için Mobil Uygulama Görevleri (James Montemagno)
- Mobil Test Laboratuvarı (Perfecto Mobile)
- React Native (Microsoft)
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.alias
ve key.password
için keystore.password
değ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'
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin