Help us understand the problem. What is going on with this article?

[Azure DevOps] Unity の Android 版自動ビルド環境を構築する (Self-hosted 環境)

はじめに

[Azure DevOps] クラウドで Unity 自動ビルド環境の構築 では Win64 でビルドを行ったのですが、Android 版の場合は署名が必要になります。

今回は Android のビルド&コード署名までを行いたいと思います。

ゴール

  • Unity の Self-hosted 環境で Android ビルドと APK の署名

事前準備

以下の記事で事前準備をしておいてください。

ソースコード

まずはソースコードです。

trigger:
- master

variables:
  Unity.TargetBuild: 'Android'
  Unity.ProjectPath: '$(Build.SourcesDirectory)'

  Keystore.FileName: '<Keystore FileName>'
  Keystore.Alias: '<Alias Name>'

  Output.FileName: 'drop'

pool:
  name: 'Unity Agent for Mac'

jobs:
  - job: Unity
    displayName: 'Unity Android build started.'
    condition: or(not(variables['Unity.UserName']), not(variables['Unity.Password']), not(variables['Unity.SerialKey']))
    workspace:
      clean: outputs

    steps:
    - task: UnityGetProjectVersionTask@1
      name: UnityGetProjectVersion
      displayName: 'Getting a version of Unity'
      inputs:
        unityProjectPath: '$(Unity.ProjectPath)'

    - task: UnityBuildTask@3
      displayName: 'Unity Building.'
      condition: succeeded()
      inputs:
        buildTarget: '$(Unity.TargetBuild)'
        unityProjectPath: '$(Unity.ProjectPath)'
        outputPath: '$(Build.BinariesDirectory)'
        outputFileName: '$(Output.FileName)'

    - task: AndroidSigning@3
      displayName: 'Signing the APK File.'
      inputs:
        apkFiles: '$(Build.BinariesDirectory)/*.apk'
        apksignerKeystoreFile: '$(Keystore.FileName)'
        apksignerKeystorePassword: '$(Keystore.Password)'
        apksignerKeystoreAlias: '$(Keystore.Alias)'
        apksignerKeyPassword: '$(Keystore.Password)'
        zipalign: true

    - task: CopyFiles@2
      displayName: 'Copying builds...'
      condition: succeeded()
      inputs:
        SourceFolder: '$(Build.BinariesDirectory)'
        Contents: '*.apk'
        TargetFolder: '$(Build.ArtifactStagingDirectory)'
        CleanTargetFolder: true
        OverWrite: true

    - task: PublishBuildArtifacts@1
      displayName: 'Publish builds...'
      condition: succeeded()
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'Release'
        publishLocation: 'Container'

APK ファイルの署名

Android の署名に必要な

  • Keystore ファイル
  • Keystore パスワード
  • Keystore エイリアス

を YAML で利用します。

variables:
  Keystore.FileName: '<Keystore FileName>'
  KeyStore.Alias: '<Alias Name>'
#  KeyStore.Password: 事前に Variables に設定しておく

- task: AndroidSigning@3
  displayName: 'Signing the APK File.'
  inputs:
    apkFiles: '$(Build.BinariesDirectory)/*.apk'
    apksignerKeystoreFile: '$(Keystore.FileName)'
    apksignerKeystorePassword: '$(Keystore.Password)'
    apksignerKeystoreAlias: '$(Keystore.Alias)'
    apksignerKeyPassword: '$(Keystore.Password)'
    zipalign: true

ソースコードをダラダラと書きましたが、[Azure DevOps] クラウドで Unity 自動ビルド環境の構築 との違いは署名の部分だけです。
[Azure DevOps] 証明書などの保存方法 で保存されているセキュアファイルライブラリから Keystore ファイルを参照するだけで、署名付きの APK ファイルが作成されます。

※最近では Gradle を利用したビルド環境を作ることも多いですが、今回は Gradle は利用せずに Unity で生成された APK をそのまま利用しています。

おわりに

署名自体はそんなに難しくないです。
Pipelines のセキュアファイルライブラリが便利ですので、それが出来れば Android ビルドも怖くないです。

akiojin
プログラマー (Scrum Alliance認定スクラムマスター (CMS)) 2011年株式会社クラウドクリエイティブスタジオを設立。アーケード筐体/コンシューマ機/携帯端末を問わず、特にオンラインを主としたリアルタイム対戦タイトルの開発を得意とする。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした