言語ガイド: Android

以下のセクションに沿って、CircleCI で Android プロジェクトをセットアップする方法について説明します。

前提条件

このガイドは以下を前提としています。

  • Gradle を使用して Android プロジェクトをビルドしている。 Gradle とは、Android Studio でプロジェクトを作成する際のデフォルトのビルド ツールです。
  • プロジェクトが VCS リポジトリのルートに置かれている。
  • プロジェクトのアプリケーションが app という名前のサブフォルダーに置かれている。

メモ: CircleCI では、クラウド版 CircleCI で利用可能な、x86 Android エミュレーターとネストされた仮想化をサポートしている Android マシン イメージを提供しています。 利用方法に関するドキュメントは、こちらで参照できます。 または、Firebase Test Lab などの外部サービスを使用してエミュレーター テストを実行することもできます。 詳細については、後述のセクション「Firebase Test Lab を使用したテスト」を参照してください。

UI テストの設定ファイルの例

Android マシン イメージを使用した設定ファイルのサンプルを詳しく見ていきましょう。 Android マシン イメージを使用する際に、Orb を使用する方法、または、手動で設定行う方法があります。 プロジェクトに最適な方法を選んでください。

# .circleci/config.yaml
version: 2.1 # Orb を使用するには、CircleCI 2.1 を使用する必要があります
# 使用したい Orb を宣言します
# Android Orb のドキュメントは、こちらから参照できます: https://circleci.com/developer/ja/orbs/orb/circleci/android
orbs:
  android: circleci/android@1.0 
workflows:
  test:
    jobs:
      # このジョブではデフォルトで Android マシン イメージを使用します
      - android/run-ui-tests:
          # 必要に応じて事前ステップと事後ステップを使用して
          # ビルトイン ステップの前後でカスタム ステップを実行します
          system-image: system-images;android-29;default;x86

上記のように、Android Orb を使用すると設定がシンプルになります。こちらで、さまざまな複雑さの設定ファイルの例を比較できます。

単体テストの設定ファイルの例

CircleCI には、Android アプリのビルドに使用できる便利な Docker イメージが用意しています。 これらのビルド済みイメージは、Docker Hub の CircleCI Org から入手できます。 これらのイメージのソース コードと Dockerfile は、こちらの GitHub リポジトリで入手できます。

CircleCI Android イメージは、公式の openjdk:11-jdk Docker イメージをベースにしており、この公式イメージは buildpack-deps をベースにしています。 ベース OS は Debian Jessie です。 ビルドは、パスワードなしの sudo にフル アクセスできる circleci ユーザーとして実行されます。

以下の例は、Android マシン イメージではなく Android Docker イメージを使用する例を示しています。

version: 2
jobs:
  build:
    working_directory: ~/code
    docker:
      - image: circleci/android:api-30-alpha
        auth:
          username: mydockerhub-user
          password: $DOCKERHUB_PASSWORD  # コンテキスト/プロジェクト UI 環境変数の参照
    environment:
      JVM_OPTS: -Xmx3200m
    steps:
      - checkout
      - restore_cache:
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
#      - run:
#         name: Chmod パーミッション #Gradlew Dependencies のパーミッションが失敗する場合は、これを使用します
#         command: sudo chmod +x ./gradlew
      - run:
          name: Download Dependencies
          command: ./gradlew androidDependencies
      - save_cache:
          paths:
            - ~/.gradle
          key: jars-{{ checksum "build.gradle" }}-{{ checksum  "app/build.gradle" }}
      - run:
          name: Run Tests
          command: ./gradlew lint test
      - store_artifacts: # for display in Artifacts: https://circleci.com/docs/2.0/artifacts/
          path: app/build/reports
          destination: reports
      - store_test_results: # for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/
          path: app/build/test-results
      # See https://circleci.com/docs/2.0/deployment-integrations/ for deploy examples

React Native プロジェクト

React Native プロジェクトは、Linux、Android、および macOS の機能を使用して CircleCI 2.0 上でビルドできます。 React Native プロジェクトの例については、GitHub で公開されている React Native アプリケーションのサンプルを参照してください。

Firebase Test Lab を使用したテスト

メモ:: ここではサードパーティ製ツールをテストに使用して説明していますが、エミュレーター テストを実行する際には Android マシン イメージを使用することをお勧めします。

CircleCI で Firebase Test Lab を使用するには、最初に以下の手順を行います。

  1. Firebase プロジェクトを作成する: Firebase のドキュメントの手順に従います。

  2. Google Cloud SDK をインストールおよび承認する:Google Cloud SDK の承認」の手順に従います。

    メモ: google/cloud-sdk の代わりに、Android 用 CircleCI イメージの使用を検討してください。

  3. 必要な API を有効にする: 作成したサービス アカウントを使用して Google にログインし、Google Developers Console の API ライブラリ ページに移動したら、 コンソール上部の検索ボックスで Google Cloud Testing APICloud Tool Results API を検索し、それぞれ [有効にする] をクリックします。

.circleci/config.yml ファイルに、以下の run ステップを追加します。

  1. デバッグ APK とテスト APK をビルドする: Gradle から 2 つの APK をビルドします。 ビルドのパフォーマンスを向上させるために、Pre-Dexing の無効化を検討してください。

  2. サービス アカウントを保存する: 作成したサービス アカウントをローカルの JSON ファイルに保存します。

  3. gcloud を承認する:. gcloud ツールを承認し、デフォルトのプロジェクトを設定します。

  4. gcloud を使用して Firebase Test Lab でテストする: APK ファイルへのパスはプロジェクトに合わせて調整してください。

  5. crcmod をインストールし、gsutil を使用してテスト結果データをコピーする: gsutil を使用するには crcmod が必要です。 gsutil を使用してバケット内の最新ファイルを CircleCI アーティファクト フォルダーにダウンロードします。 BUCKET_NAMEOBJECT_NAME は、プロジェクト固有の名前に置き換えてください。

version: 2
jobs:
  test:
    docker:
      - image: circleci/android:api-28-alpha  # gcloud はこのイメージに含まれています
        auth:
          username: mydockerhub-user
          password: $DOCKERHUB_PASSWORD  # コンテキスト/プロジェクト UI 環境変数の参照
    steps:
      - run:
          name: デバッグ APK とリリース APK のビルド
          command: |
            ./gradlew :app:assembleDebug
            ./gradlew :app:assembleDebugAndroidTest
      - run:
          name: Google サービス アカウントの保存
          command: echo $GCLOUD_SERVICE_KEY > ${HOME}/gcloud-service-key.json
      - run:
          name: gcloud の承認とデフォルト プロジェクトの設定
          command: |
            sudo gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
            sudo gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
      - run:
          name: Firebase Test Lab でのテスト
          command: >
            sudo gcloud firebase test android run \ 
              --app <local_server_path>/<app_apk>.apk \ 
              --test <local_server_path>/<app_test_apk>.apk \ 
              --results-bucket cloud-test-${GOOGLE_PROJECT_ID}
      - run:
          name: gsutil 依存関係のインストールとテスト結果データのコピー
          command: |
            sudo pip install -U crcmod
            sudo gsutil -m cp -r -U `sudo gsutil ls gs://[BUCKET_NAME]/[OBJECT_NAME] | tail -1` ${CIRCLE_ARTIFACTS}/ | true

gcloud を使用して Firebase を実行する方法については、Firebase の公式ドキュメントを参照してください。

デプロイ

デプロイ ターゲットの構成例については、「デプロイの構成」を参照してください。

トラブルシューティング

メモリ不足エラーへの対処

ビルド中にメモリ不足 (OOM) エラーが発生することがあります。 JVM のメモリ使用をカスタマイズする基本的な方法については、「Java メモリ エラーの回避とデバッグ」を参照してください。

テストに Robolectric を使用している場合は、Gradle のメモリ使用を微調整する必要があります。 Gradle VM を複数のテストにフォークする場合、VM は事前にカスタマイズされた JVM メモリ パラメーターを受け取りません。 build.gradle ファイル内に android.testOptions.unitTests.all { maxHeapSize = "1024m" } を追加して、テスト用の追加 JVM ヒープを Gradle に提供する必要があります。 all { maxHeapSize = "1024m" } を既存の Android 構成ブロックに追加してもかまいません。 その場合は以下のようになります。

android {
    testOptions {
        unitTests {
            // その他の構成

            all {
                maxHeapSize = "1024m"
            }
        }
    }

それでも OOM の問題が解決しない場合は、Gradle の最大ワーカー数を ./gradlew test --max-workers 4 のように制限します。

Pre-Dexing の無効化によるビルド パフォーマンスの向上

依存関係を Pre-Dexing しても CircleCI でメリットはありません。 Pre-Dexing を無効にする方法については、こちらのブログ記事を参照してください。

Gradle Android プラグインはデフォルトで依存関係を Pre-Dexing します。 Pre-Dexing は、Java バイトコードを Android バイトコードに変換し、コードの変更時にインクリメンタルに Dexing できるため、開発スピードの向上につながります。 ただし、CircleCI はクリーン ビルドを実行するため、実際には Pre-Dexing によってコンパイル時間が長引き、メモリ使用量も増加します。

Google Play ストアへのデプロイ

CI ビルドから Play ストアにデプロイする場合には、いくつかのサードパーティ ソリューションを利用できます。 Gradle Play Publisher では、App Bundle や APK、アプリ メタデータをアップロードできます。 fastlane を Android で使用することも可能です。



ドキュメントの改善にご協力ください

このガイドは、CircleCI の他のドキュメントと同様にオープンソースで、GitHub で使用できます。 ご協力いただき、ありがとうございます。


クリエイティブ・コモンズ・ライセンス
CircleCICircleCI ドキュメントは、クリエイティブ・コモンズの表示--非営利-継承 4.0 国際ライセンス に基づいてライセンス供与されています。