Compilar, testar e implantar aplicativos Android
Azure DevOps Services
Você pode configurar pipelines para compilar, testar e implantar aplicativos Android automaticamente.
Pré-requisitos
Você deve ter os seguintes itens:
- Conta do GitHub. Se você não tiver uma conta do GitHub, crie uma agora.
- Projeto do Azure DevOps. Se você não tiver um projeto, crie um agora.
Configurar o pipeline
Execute as tarefas a seguir para configurar um pipeline para um aplicativo Android de exemplo.
Bifurque o repositório a seguir em sua conta do GitHub para obter o código de um aplicativo Android simples.
https://github.com/MicrosoftDocs/pipelines-android
Entre na organização do Azure DevOps e acesse seu projeto.
Selecione Pipelines>Criar pipeline ou Novo pipeline.
Selecione GitHub como o local do código-fonte.
Você pode ser redirecionado para o GitHub para então entrar. Nesse caso, insira suas credenciais do GitHub.
Selecione o repositório -android que você bifurcava anteriormente.
Selecione Aprovar e instalar na tela a seguir.
O Azure Pipelines gera um arquivo YAML para o seu pipeline.
Selecione Executar.
Confirmar diretamente no branch principal e escolha Executar novamente.
Aguarde a conclusão da execução.
Você tem um arquivo YAML funcional (azure-pipelines.yml
) em seu repositório que está pronto para você personalizar.
Dica
Para fazer alterações no arquivo YAML, selecione o pipeline na página Pipelines e Edite o arquivo azure-pipelines.yml
.
Compilar com o Gradle
O Gradle é uma ferramenta de compilação comum usada para criar projetos Android. Para obter mais informações sobre suas opções, confira a tarefa 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'
Ajustar o caminho da compilação
Ajuste o valor de workingDirectory se o arquivo
gradlew
não estiver na raiz do repositório. O valor do diretório deve ser semelhante à raiz do repositório, comoAndroidApps/MyApp
ou$(system.defaultWorkingDirectory)/AndroidApps/MyApp
.Ajuste o valor de gradleWrapperFile se o arquivo
gradlew
não estiver na raiz do repositório. O valor do caminho do arquivo deve ser semelhante à raiz do repositório, comoAndroidApps/MyApp/gradlew
ou$(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew
.
Ajustar tarefas do Gradle
Ajuste o valor das tarefas para a variante de compilação que você preferir, como assembleDebug
ou assembleRelease
.
Para obter mais informações, confira a seguinte documentação de desenvolvimento para Android do Google:
Assinar e alinhar um APK (Pacote Android)
Se a compilação ainda não assinar e efetuar o zipalign do APK, adicione a tarefa Assinatura do Android ao YAML. Um APK deve ser assinado para ser executado em um dispositivo em vez de um emulador. O zipaligning reduz a RAM consumida pelo aplicativo.
Importante
Recomendamos armazenar cada uma das senhas a seguir em uma variável secreta.
- task: AndroidSigning@2
inputs:
apkFiles: '**/*.apk'
jarsign: true
jarsignerKeystoreFile: 'pathToYourKeystoreFile'
jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
jarsignerKeystoreAlias: 'yourKeystoreAlias'
jarsignerKeyPassword: '$(jarsignerKeyPassword)'
zipalign: true
Teste
Testar no Android Emulator
Crie a tarefa Bash e copie e cole o código abaixo para instalar e executar o emulador. Não se esqueça de organizar os parâmetros do emulador para se ajustarem ao ambiente de teste. O emulador começa como um processo em segundo plano e está disponível em tarefas posteriores.
#!/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"
Testar em dispositivos hospedados no Azure
Adicione a tarefa Teste do App Center para testar o aplicativo em um laboratório hospedado de dispositivos iOS e Android. Uma avaliação gratuita do App Center é necessária, que deve ser convertida posteriormente em paga.
Inscrever-se com o App Center primeiro.
# 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.
Manter artefatos com o registro de build
Adicionar as tarefas Copiar Arquivos e Publicar Artefato de Compilação. Sua APK é armazenada com o registro ou teste de compilação e é implantada em pipelines posteriores. Para obter mais informações, confira Artefatos.
- task: CopyFiles@2
inputs:
contents: '**/*.apk'
targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
Implantar
Adicionar o App Center
Adicione a tarefa Distribuir do App Center para distribuir um aplicativo para um grupo de testadores ou usuários beta ou promova o aplicativo para Intune ou Google Play. Uma conta gratuita do App Center é necessária (nenhum pagamento é necessário).
# 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.
Instalar o Google Play
Instale a extensão do Google Play e use as tarefas a seguir para automatizar a interação com o Google Play. Por padrão, essas tarefas são autenticadas no Google Play usando uma conexão de serviço que você configura.
Versão
Adicione a tarefa Versão do Google Play para lançar uma nova versão do aplicativo Android à Google Play Store.
- task: GooglePlayRelease@4
inputs:
apkFile: '**/*.apk'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
track: 'internal'
Promover
Adicione a tarefa Promover do Google Play para promover uma atualização de aplicativo Android lançada anteriormente de uma faixa para outra, como alpha
→ beta
.
- task: GooglePlayPromote@3
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
sourceTrack: 'internal'
destinationTrack: 'alpha'
Aumentar a distribuição
Adicione a tarefa Aumentar a distribuição do Google Play para aumentar o percentual de distribuição de um aplicativo que foi lançado anteriormente para a faixa rollout
.
- task: GooglePlayIncreaseRollout@2
inputs:
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)
Atualização de status
Adicione a tarefa Atualização de status do Google Play para atualizar a status de distribuição para o aplicativo que foi lançado anteriormente na faixa rollout
.
- task: GooglePlayStatusUpdate@2
inputs:
authType: ServiceEndpoint
packageName: 'com.yourCompany.appPackageName'
serviceEndpoint: 'yourGooglePlayServiceConnectionName'
status: 'inProgress' # draft | inProgress | halted | completed
Extensões relacionadas
- Segurança codificada (segurança codificada)
- Google Play (Microsoft)
- Tarefas de aplicativo móvel para iOS e Android (James Montemagno)
- Laboratório de Testes Móveis (Perfecto Mobile)
- React Native (Microsoft)
Perguntas frequentes
P: Como fazer criar pacotes de aplicativos?
R: Você pode criar e assinar o pacote do aplicativo com um script embutido e um arquivo seguro. Para fazer isso, primeiro baixe o repositório de chaves e armazene-o como um arquivo seguro na Biblioteca. Em seguida, crie variáveis para keystore.password
, key.alias
e key.password
em um grupo de variáveis.
Em seguida, use as tarefas Baixar Arquivo Seguro e Bash para baixar o repositório de chaves e compilar e assinar o pacote do aplicativo.
Neste arquivo YAML, baixe um arquivo seguro app.keystore
e use um script bash para gerar um pacote de aplicativos. Em seguida, use Copiar Arquivos para copiar o pacote do aplicativo. A partir daí, crie e salve um artefato com Publicar Artefato de Build ou use a extensão do Google Play para publicar.
- 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'
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de