Membangun, menguji, & menyebarkan aplikasi Android
Azure DevOps
Anda dapat menyiapkan alur untuk membuat, menguji, dan menyebarkan aplikasi Android secara otomatis.
Prasyarat
Anda harus memiliki item berikut:
- Akun GitHub. Jika Anda tidak memiliki akun GitHub, buat akun tersebut sekarang.
- Proyek Azure DevOps. Jika Anda tidak memiliki proyek, buat proyek sekarang.
Menyiapkan alur
Lakukan tugas berikut untuk menyiapkan alur untuk contoh aplikasi Android.
Fork repositori berikut ke akun GitHub Anda untuk mendapatkan kode untuk aplikasi Android sederhana.
https://github.com/MicrosoftDocs/pipelines-android
Masuk ke organisasi Azure DevOps Anda dan buka proyek Anda.
Pilih Alur>Buat alur atau Alur baru.
Pilih GitHub sebagai lokasi kode sumber Anda.
Anda dapat diarahkan ke GitHub untuk masuk. Jika demikian, masukkan informasi masuk GitHub Anda.
Pilih repositori -android yang sebelumnya Anda fork.
Pilih Setujui dan instal di layar berikut ini.
Azure Pipelines menghasilkan file YAML untuk alur Anda.
Pilih Jalankan.
Terapkan langsung ke cabang utama, lalu pilih Jalankan lagi.
Tunggu sampai eksekusi selesai.
Anda memiliki file YAML yang berfungsi (azure-pipelines.yml
) di repositori Anda yang siap untuk Anda sesuaikan.
Tip
Untuk membuat perubahan pada file YAML, pilih alur di halaman Alur , lalu Editazure-pipelines.yml
file.
Membangun dengan Gradle
Gradle adalah alat build umum yang digunakan untuk membuat proyek Android. Untuk informasi selengkapnya tentang opsi Anda, lihat tugas 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'
Menyesuaikan jalur build
Sesuaikan nilai workingDirectory jika file Anda
gradlew
tidak berada di akar repositori. Nilai direktori harus mirip dengan akar repositori, sepertiAndroidApps/MyApp
atau$(system.defaultWorkingDirectory)/AndroidApps/MyApp
.Sesuaikan nilai gradleWrapperFile jika file Anda
gradlew
tidak berada di akar repositori. Nilai jalur file harus mirip dengan akar repositori, sepertiAndroidApps/MyApp/gradlew
atau$(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew
.
Menyesuaikan tugas Gradle
Sesuaikan nilai tugas untuk varian build yang Anda sukai, seperti assembleDebug
atau assembleRelease
.
Untuk informasi selengkapnya, lihat dokumentasi pengembangan Google Android berikut ini:
- Membangun APK debug dan
- Mengonfigurasi varian build.
Menandatangani dan menyelaraskan Paket Android (APK)
Jika build Anda belum menandatangani dan meng-zipalign APK, tambahkan tugas Penandatanganan Android ke YAML. APK harus ditandatangani untuk berjalan di perangkat, bukan emulator. Zipaligning mengurangi RAM yang digunakan oleh aplikasi.
Penting
Sebaiknya simpan masing-masing kata sandi berikut dalam variabel rahasia.
- task: AndroidSigning@2
inputs:
apkFiles: '**/*.apk'
jarsign: true
jarsignerKeystoreFile: 'pathToYourKeystoreFile'
jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
jarsignerKeystoreAlias: 'yourKeystoreAlias'
jarsignerKeyPassword: '$(jarsignerKeyPassword)'
zipalign: true
Uji
Uji di Android Emulator
Buat tugas Bash dan salin tempel kode di bawah ini untuk menginstal dan menjalankan emulator. Jangan lupa untuk mengatur parameter emulator agar sesuai dengan lingkungan pengujian Anda. Emulator dimulai sebagai proses latar belakang dan tersedia dalam tugas selanjutnya.
#!/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"
Uji di perangkat yang dihosting Azure
Tambahkan tugas Uji App Center untuk menguji aplikasi di lab perangkat iOS dan Android yang dihosting. Uji coba gratis App Center diperlukan, yang nantinya harus dikonversi menjadi berbayar.
Daftar dengan App Center terlebih dahulu.
# 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.
Menyimpan artefak dengan rekaman build
Tambahkan tugas Salin File dan Terbitkan Artefak Build. APK Anda disimpan dengan catatan build atau pengujian, dan disebarkan di alur yang lebih baru. Untuk informasi selengkapnya, lihat Artefak.
- task: CopyFiles@2
inputs:
contents: '**/*.apk'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
Menyebarkan
Tambahkan App Center
Tambahkan tugas Distribusi App Center untuk mendistribusikan aplikasi ke sekelompok penguji atau pengguna beta, atau promosikan aplikasi ke Intune atau Google Play. Akun App Center gratis diperlukan (tidak diperlukan pembayaran).
# 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.
Menginstal Google Play
Instal ekstensi Google Play dan gunakan tugas berikut untuk mengotomatiskan interaksi dengan Google Play. Secara default, tugas-tugas ini mengautentikasi ke Google Play menggunakan koneksi layanan yang Anda konfigurasikan.
Lepaskan
Tambahkan tugas Rilis Google Play untuk merilis versi aplikasi Android baru ke Google Play Store.
- task: GooglePlayRelease@4
inputs:
apkFile: '**/*.apk'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
track: 'internal'
Promosikan
Tambahkan tugas Promosi Google Play untuk mempromosikan pembaruan aplikasi Android yang dirilis sebelumnya dari satu trek ke trek lain, seperti alpha
→ beta
.
- task: GooglePlayPromote@3
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
sourceTrack: 'internal'
destinationTrack: 'alpha'
Meningkatkan peluncuran
Tambahkan tugas Google Play Tingkatkan Peluncuran untuk meningkatkan persentase peluncuran aplikasi yang sebelumnya dirilis ke rollout
trek.
- task: GooglePlayIncreaseRollout@2
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)
Pembaruan status
Tambahkan tugas Pembaruan Status Google Play untuk memperbarui status peluncuran untuk aplikasi yang sebelumnya dirilis ke rollout
trek.
- task: GooglePlayStatusUpdate@2
inputs:
authType: ServiceEndpoint
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
status: 'inProgress' # draft | inProgress | halted | completed
Ekstensi terkait
- Codified Security (Codified Security)
- Google Play (Microsoft)
- Tugas Aplikasi Seluler untuk iOS dan Android (James Montemagno)
- Lab Pengujian Seluler (Perfecto Mobile)
- React Native (Microsoft)
FAQ
T: Bagaimana cara membuat app bundle?
A: Anda dapat membuat dan menandatangani app bundle dengan skrip sebaris dan file aman. Untuk melakukannya, pertama-tama unduh keystore Anda dan simpan sebagai file aman di Pustaka. Kemudian, buat variabel untuk keystore.password
, key.alias
, dan key.password
dalam grup variabel.
Selanjutnya, gunakan tugas Unduh File Aman dan Bash untuk mengunduh keystore Anda dan membangun dan menandatangani bundel aplikasi Anda.
Dalam file YAML ini, unduh file aman app.keystore
dan gunakan skrip bash untuk menghasilkan bundel aplikasi. Kemudian, gunakan Salin File untuk menyalin bundel aplikasi. Dari sana, buat dan simpan artefak dengan Terbitkan Artefak Build atau gunakan ekstensi Google Play untuk memublikasikan.
- 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'
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk