JetBrains Space ヘルプ

Android

Android アプリケーションの一般的な公開サイクルには、次の主な手順が含まれます。

  1. アプリケーションを構築します。

  2. アプリケーションに署名します。

  3. アプリケーションを Google Play Console にアップロードします。

Space Automation を使用してこれらの手順を自動化するには、いくつかの方法があります。

Android の構築および公開ワークフローを初めて使用する場合は、次の Android パブリッシングの基本トピックから始めることをお勧めします。Android プロジェクトでのテストの自動化に興味がある場合は、「Android プロジェクトでテストを実行する」を参照してください。

Android パブリッシングの基本

このトピックの内容は、開発者 .android.com/ からの情報に基づいています。このトピックの公開日以降、特定の情報が変更されている可能性があることに注意してください。実際の情報については、Google の公式ドキュメントを参照してください。

ビルドシステム

通常、Android アプリケーションは Gradle ビルドツールを使用して構築されます。Kotlin および Gradle を使用した Java アプリケーションを構築するためのすべての推奨事項は、Android アプリケーションにも適用できます。基本的に、アプリを構築するために必要なのは、./gradlew build を実行することだけです。

ビルドアーティファクト形式

次のいずれかの形式でアーティファクトを生成するように Android ビルドを構成できます。

  • Android アプリケーションパッケージ (APK) – アプリのバイナリ、スクリーンショット、その他のリソースを含むアーカイブ。アプリケーション開発者の身元を確認するには、APK ファイルを秘密鍵でデジタル署名する必要があります。その後、APK を Google Play にアップロードするか、個別に配布することができます。複数のデバイスをより適切にサポートするには、各デバイスに最適化された APK をいくつか作成する必要があります。または、単一の「最適化されていない」APK を作成することもできます。

  • Android アプリバンドル (AAB) – アプリのバイナリやその他のリソースを含み、APK の生成を Google Play に委ねる公開形式。長所: Google Play 自体がデバイス構成ごとに多数の APK を作成します。APK と同様に、バンドルも Google Play にアップロードする前に署名する必要があります。

署名の基本

アプリに署名するには 2 つの方法があります。

  • プライベートアプリ署名キー – (APK のみに適用) プライベートアプリシグネチャーキーを使用して APK に直接署名します。署名キーは、アプリの存続期間中は決して変更されません。キーを使用して APK に署名するには、Android Studio、Gradle タスク、またはコマンドラインツールを使用します。キーを紛失すると、アプリを更新できなくなります。

  • Play アプリの署名 – (APK と AAB に適用可能、推奨) このフローでは、アップロードキープライベートアプリ署名キーの 2 つのキーを使用します。アップロードキーを自分側に保存し、アップロードする前にそれを使用して AAB または APK に署名します。アプリ署名キーは Google によって保存されます。ダウンロードすることはできません。Google はこのキーを使用して APK (アップロードされたもの、または AAB から構築されたもの) に署名します。主な利点は、アップロードキーを紛失したり侵害された場合に、新しいキーを発行できることです。詳細

Gradle および Gradle Play Publisher を使用してアプリを構築して公開する

前提条件

  • プロジェクトでは、Gradle 6.5 以降および Android Gradle プラグイン 4.1.0 以降を使用する必要があります。

  • アプリの APK または AAB は、Google Play Console に少なくとも 1 回公開する必要があります。

対象イメージ

  • JRE、Gradle 6.5 以降、Android SDK (アプリケーションで使用されているのと同じバージョン)、および xxd ツールを含むカスタムイメージ。次のサンプル Dockerfile を使用して独自のイメージを構築できます。

    FROM gradle:6.8.3-jre15 USER root ENV TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip" \ ANDROID_SDK_ROOT="/usr/local/android-sdk" \ ANDROID_SDK=30 \ ANDROID_BUILD_TOOLS=30.0.3 \ PATH="${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${PATH}" # Download Android SDK RUN mkdir "$ANDROID_SDK_ROOT" .android "$ANDROID_SDK_ROOT/cmdline-tools" && \ cd "$ANDROID_SDK_ROOT/cmdline-tools" && \ curl -o sdk.zip $TOOLS_URL && \ unzip sdk.zip && \ rm sdk.zip && \ mv cmdline-tools tools && \ yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses # Install Android Build Tools RUN $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --update RUN $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" \ "platforms;android-${ANDROID_SDK}" \ "platform-tools" # Install xxd RUN apt-get update && \ apt-get install xxd

Android アプリケーションは Gradle ビルドツールを使用します。Android プロジェクトのデフォルトの Gradle 構成では、アプリの APK または AAB の生成と署名を自動化できます。できないことは、アプリのアップロードや宣伝などのリリース活動を自動化することです。このセクションでは、Gradle Play パブリッシャー(英語)プラグインを使用してこの課題を解決する方法を説明します。これは、Google Play Developer API を使用してすべてのリリースアクティビティを実行できる非公式 Gradle プラグインです。

  1. Gradle Play パブリッシャーのドキュメント(英語)の説明に従って、Google Cloud Platform サービスアカウントを作成します。プラグインはこのアカウントを使用して、Google Play Console でリリースアクティビティを実行します。

    サービスアカウントを作成するときに、アカウントの秘密キーを .json ファイルで取得します。ファイルをコンピューターに保存します。次の手順で必要になります。

    アプリに対する十分な権限をアカウントに提供していることを確認してください: Google Play コンソール | ユーザーと権限 | 新しいユーザーを招待します。この例では、アプリを内部テストトラックに公開するため、アカウントにはテストトラックのリリースを管理する権限が必要です。

  2. アプリケーションに署名するためのアップロードキーを生成します (この例では、Play アプリの署名を使用します)。すでにキーを持っている場合は、この手順をスキップしてください。キーを生成するには、以下を使用できます。

    • Android Studio. 詳細

    • keytool コマンドラインツール。例:

      keytool -genkey -v -keystore uploadkey.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

    キーを作成するときは、次の情報を指定する必要があります (次の手順で必要になります)。

    • キーストアファイル名: キーを保存する .jks ファイル。

    • キーストアのパスワード: .jks キーストレージのパスワード。

    • キーのエイリアス: 秘密キーの名前。

    • キーのパスワード: 秘密キーのパスワード。

  3. セキュリティ上の理由から、アプリのシークレット署名キーデータと Google サービスアカウントキーはシークレットとパラメーターストレージに保存されます。

    すべての機密データをシークレットおよびパラメーターとして保存します。

    1. まず、バイナリ .jks キーストアファイルを 16 進形式に変換しましょう。こうすることで、シークレットとして保存することができます。ビルド中に、オートメーションスクリプトは 16 進シークレットをバイナリ .jks ファイルに変換します。キーストアファイルを変換するには、xxd ツール (xxd パッケージの一部) を使用できます。

      xxd -plain upload_key.jks > upload_key.hex

      xxd ツールがない場合は、最初に sudo apt get install xxd を実行します。

    2. Space で、必要なプロジェクトを開きます。

    3. 設定 | シークレットとパラメーターを開き、新しいシークレットを作成します。

    4. upload_key.hex ファイルを開き、その内容をコピーし、シークレット値として貼り付けます。

    5. 同様に、Google サービスアカウントキーを変換し、そのシークレットを作成します。

      xxd -plain google_sa_key.json > google_sa_key.hex

      実際には、.json は単なるプレーンテキストであるため、16 進数に変換する必要はありません。ただし、コピー & ペーストのエンコーディングの課題を回避するには、16 進数として保存し、ビルド中にプレーンテキストに変換し直すことをお勧めします。

    6. キーストアのパスワードとキーのパスワードのシークレットを作成します。

    7. キーエイリアスのパラメーターを作成します (安全なストレージは必要ありません)。

    8. その結果、プロジェクトのシークレットとパラメーターには 4 つのシークレットと 1 つのパラメーターが存在します。

      Secrets for Android automation
  4. プロジェクトレベルの build.gradle ファイルで、アプリケーション署名を構成します。セキュリティ上の理由から、環境変数を使用してシークレットとパラメーターストレージに保存されている主要データにアクセスします。例:

    ... // Key store file name // The Automation script will create the key store file in the root directory, // but this build.gradle is located one level down - on the project level. def appKeyStoreFile = "../upload_key.jks" // Key store password, key alias and password created on the prev steps. // Env vars will be assigned by the Automation script. def appKeyStorePassword = System.env.KEY_STORE_PASSWORD def appKeyAlias = System.env.KEY_ALIAS def appKeyPassword = System.env.KEY_PASSWORD android { ... signingConfigs { release { storeFile file(appKeyStoreFile) storePassword appKeyStorePassword keyAlias appKeyAlias keyPassword appKeyPassword } } buildTypes { release { signingConfig signingConfigs.release ... } } }
  5. プロジェクトレベルの build.gradle ファイルで、Gradle Play Publisher プラグインを構成します。セキュリティ上の理由から、サービスアカウントキーをシークレットとパラメーターストレージに保存し、自動化スクリプトを使用して作成します。プラグインの設定方法の詳細については、プラグインのドキュメント(英語)を参照してください。

    import com.github.triplet.gradle.androidpublisher.ReleaseStatus plugins { id 'com.android.application' id 'com.github.triplet.play' version '3.3.0' } // Service account key file you created on step 1 // The Automation script will create the key store file in the root directory, // but this build.gradle is located one level down - on the project level. def googleServiceAccountKeyFile = "../google_sa_key.json" ... android {...} play { // We will publish the app to the internal testing track track.set("internal") serviceAccountCredentials.set(file(googleServiceAccountKeyFile)) // Our app is not yet publicly available, // we will publish it in the draft state. releaseStatus.set(ReleaseStatus.DRAFT) } ...
  6. ビルド実行番号に応じてアプリのバージョンを自動的に変更する場合は、プロジェクトレベルの build.gradleversionCode パラメーターと versionName パラメーターを変更します。例: versionCode をビルド番号と等しく、versionName1.0.$build_number にしたい場合:

    def appVersionCode = Integer.valueOf(System.env.JB_SPACE_EXECUTION_NUMBER ?: 0) def appVersionName = "1.0.${System.env.JB_SPACE_EXECUTION_NUMBER}" ... android { ... defaultConfig { ... versionCode appVersionCode versionName appVersionName } } ...

    結果のプロジェクト build.gradle は次のようになります。

    import com.github.triplet.gradle.androidpublisher.ReleaseStatus plugins { id 'com.android.application' id 'com.github.triplet.play' version '3.3.0' } def appVersionCode = Integer.valueOf(System.env.JB_SPACE_EXECUTION_NUMBER ?: 0) def appVersionName = "1.1.${System.env.JB_SPACE_EXECUTION_NUMBER}" def appKeyStoreFile = "../upload_key.jks" def appKeyStorePassword = System.env.KEY_STORE_PASSWORD def appKeyAlias = System.env.KEY_ALIAS def appKeyPassword = System.env.KEY_PASSWORD def googleServiceAccountKeyFile = "../google_sa_key.json" apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "com.first.simpleandroidapp" minSdkVersion 28 targetSdkVersion 30 versionCode appVersionCode versionName appVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } signingConfigs { release { storeFile file(appKeyStoreFile) storePassword appKeyStorePassword keyAlias appKeyAlias keyPassword appKeyPassword // Optional, specify signing versions used v1SigningEnabled true v2SigningEnabled true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } } play { track.set("internal") serviceAccountCredentials.set(file(googleServiceAccountKeyFile)) releaseStatus.set(ReleaseStatus.DRAFT) } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4' implementation 'androidx.navigation:navigation-ui-ktx:2.3.4' testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }
  7. プロジェクトルートで、.space.kts 自動化スクリプトを作成します。

    job("Build and publish bundle to internal track") { // disable gitPush job trigger startOn { gitPush { enabled = false } } container("Build and publish", "mycompany.registry.jetbrains.space/p/projectkey/mydocker/automation-android:1.0.5") { env["GOOGLE_SA_KEY"] = Secrets("google_sa_key") env["KEY_STORE"] = Secrets("key_store") env["KEY_STORE_PASSWORD"] = Secrets("key_store_password") env["KEY_PASSWORD"] = Secrets("key_password") env["KEY_ALIAS"] = Params("key_alias") shellScript { content = """ echo Get private signing key... echo ${'$'}KEY_STORE > upload_key.hex xxd -plain -revert upload_key.hex upload_key.jks echo Get Google service account key... echo ${'$'}GOOGLE_SA_KEY > google_sa_key.hex xxd -plain -revert google_sa_key.hex google_sa_key.json echo Build and publish AAB... ./gradlew publishBundle """ } } }

    注:

    • 次の要件を満たすカスタム Docker イメージを使用します。

    • この例では、AAB を構築して公開します。代わりに APK をビルドして公開したい場合は、行 ./gradlew publishBundle./gradlew publishApk に変更します。

  8. ジョブを実行します。ジョブが正常に完了したら、Google Play Console を確認します。アップロードされたアプリケーションのドラフトが含まれている必要があります。

    Published application draft
  9. 必要に応じて、アプリのメタデータ (スクリーンショット、説明など) のアップロード、アプリアーティファクトのプロモーション、製品フレーバーの操作など、他のすべてのリリースタスクを自動化するように Gradle Play Publisher を構成できます。詳細については、Gradle Play パブリッシャーのドキュメント(英語)を参照してください。

fastlane を使用してアプリをビルドして公開する

前提条件

  • プロジェクトは fastlane を使用するように構成する必要があります。詳細 (英語)

  • アプリの APK または AAB は、Google Play Console に少なくとも 1 回公開する必要があります。

対象イメージ

  • fastlane、JRE、Android SDK (アプリケーションで使用されているのと同じバージョン)、および xxd ツールを含むカスタムイメージ。このイメージはパブリック JetBrains リポジトリ public.registry.jetbrains.space/p/space/containers/automation-android-fastlane:latest から取得できます。

    あるいは、次のサンプル Dockerfile を使用して独自のイメージを構築することもできます。

    FROM fastlanetools/ci:0.3.0 USER root ENV TOOLS_URL="https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip" \ ANDROID_SDK_ROOT="/usr/local/android-sdk" \ ANDROID_SDK=30 \ ANDROID_BUILD_TOOLS=30.0.3 \ PATH="${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin:${ANDROID_SDK_ROOT}/cmdline-tools/tools/bin:${PATH}" # Install OpenJDK-11 RUN apt-get -y -o Acquire::Check-Valid-Until=false --allow-releaseinfo-change update && \ apt-get install -y openjdk-11-jdk -o Acquire::Check-Valid-Until=false && \ apt-get install -y ant -o Acquire::Check-Valid-Until=false && \ apt-get clean; ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/ RUN export JAVA_HOME # Install Android SDK RUN mkdir "$ANDROID_SDK_ROOT" .android "$ANDROID_SDK_ROOT/cmdline-tools" && \ cd "$ANDROID_SDK_ROOT/cmdline-tools" && \ curl -o sdk.zip $TOOLS_URL && \ unzip sdk.zip && \ rm sdk.zip && \ mv cmdline-tools tools && \ yes | $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --licenses RUN $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --update RUN $ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" \ "platforms;android-${ANDROID_SDK}" \ "platform-tools" # Install xxd RUN apt-get install xxd -o Acquire::Check-Valid-Until=false # Install Fastlane RUN apt-get install --no-install-recommends -y --allow-unauthenticated build-essential git ruby-full -o Acquire::Check-Valid-Until=false && \ gem install fastlane && \ gem install bundler

Android アプリケーションは Gradle ビルドツールを使用します。Android プロジェクトのデフォルトの Gradle 構成では、アプリの APK または AAB の生成と署名を自動化できます。できないことは、アプリのアップロードや宣伝などのリリース活動を自動化することです。このセクションでは、fastlane(英語) プラットフォームを利用してこの課題を解決する方法を説明します。fastlane ツールを使用すると、デプロイを自動化し、iOS および Android アプリケーションのルーチンをリリースできます。このツールは、通常、プロジェクトソースとともに VCS に保存される Fastfile ファイルで構成されます。

  1. fastlane のドキュメント(英語)の説明に従って、Google Cloud Platform サービスアカウントを作成します。このツールは、このアカウントを使用して、Google Play Console でリリースアクティビティを実行します。

    サービスアカウントを作成するときに、アカウントの秘密キーを .json ファイルで取得します。ファイルをコンピューターに保存します。次の手順で必要になります。

    アプリに対する十分な権限をアカウントに提供していることを確認してください: Google Play コンソール | ユーザーと権限 | 新しいユーザーを招待します。この例では、アプリを内部テストトラックに公開するため、アカウントにはテストトラックのリリースを管理する権限が必要です。

  2. アプリケーションに署名するためのアップロードキーを生成します (この例では、Play アプリの署名を使用します)。すでにキーを持っている場合は、この手順をスキップしてください。キーを生成するには、以下を使用できます。

    • Android Studio. 詳細

    • keytool コマンドラインツール。例:

      keytool -genkey -v -keystore uploadkey.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

    キーを作成するときは、次の情報を指定する必要があります (次の手順で必要になります)。

    • キーストアファイル名: キーを保存する .jks ファイル。

    • キーストアのパスワード: .jks キーストレージのパスワード。

    • キーのエイリアス: 秘密キーの名前。

    • キーのパスワード: 秘密キーのパスワード。

  3. セキュリティ上の理由から、アプリのシークレット署名キーデータと Google サービスアカウントキーはシークレットとパラメーターストレージに保存されます。

    すべての機密データをシークレットおよびパラメーターとして保存します。

    1. まず、バイナリ .jks キーストアファイルを 16 進形式に変換しましょう。こうすることで、シークレットとして保存することができます。ビルド中に、オートメーションスクリプトは 16 進シークレットをバイナリ .jks ファイルに変換します。キーストアファイルを変換するには、xxd ツール (xxd パッケージの一部) を使用できます。

      xxd -plain upload_key.jks > upload_key.hex

      xxd ツールがない場合は、最初に sudo apt get install xxd を実行します。

    2. Space で、必要なプロジェクトを開きます。

    3. 設定 | シークレットとパラメーターを開き、新しいシークレットを作成します。

    4. upload_key.hex ファイルを開き、その内容をコピーし、シークレット値として貼り付けます。

    5. 同様に、Google サービスアカウントキーを変換し、そのシークレットを作成します。

      xxd -plain google_sa_key.json > google_sa_key.hex

      実際には、.json は単なるプレーンテキストであるため、16 進数に変換する必要はありません。ただし、コピー & ペーストのエンコーディングの課題を回避するには、16 進数として保存し、ビルド中にプレーンテキストに変換し直すことをお勧めします。

    6. キーストアのパスワードとキーのパスワードのシークレットを作成します。

    7. キーエイリアスのパラメーターを作成します (安全なストレージは必要ありません)。

    8. その結果、プロジェクトのシークレットとパラメーターには 4 つのシークレットと 1 つのパラメーターが存在します。

      Secrets for Android automation
  4. プロジェクトレベルの build.gradle ファイルで、アプリケーション署名を構成します。セキュリティ上の理由から、環境変数を使用してシークレットとパラメーターストレージに保存されている主要データにアクセスします。例:

    ... // Key store file name // The Automation script will create the key store file in the root directory, // but this build.gradle is located one level down - on the project level. def appKeyStoreFile = "../upload_key.jks" // Key store password, key alias and password created on the prev steps. // Env vars will be assigned by the Automation script. def appKeyStorePassword = System.env.KEY_STORE_PASSWORD def appKeyAlias = System.env.KEY_ALIAS def appKeyPassword = System.env.KEY_PASSWORD android { ... signingConfigs { release { storeFile file(appKeyStoreFile) storePassword appKeyStorePassword keyAlias appKeyAlias keyPassword appKeyPassword } } buildTypes { release { signingConfig signingConfigs.release ... } } }
  5. ビルド実行番号に応じてアプリのバージョンを自動的に変更する場合は、プロジェクトレベルの build.gradleversionCode パラメーターと versionName パラメーターを変更します。例: versionCode をビルド番号と等しく、versionName1.0.$build_number にしたい場合:

    def appVersionCode = Integer.valueOf(System.env.JB_SPACE_EXECUTION_NUMBER ?: 0) def appVersionName = "1.0.${System.env.JB_SPACE_EXECUTION_NUMBER}" ... android { ... defaultConfig { ... versionCode appVersionCode versionName appVersionName } } ...

    結果のプロジェクト build.gradle は次のようになります。

    plugins { id 'com.android.application' } def appVersionCode = Integer.valueOf(System.env.JB_SPACE_EXECUTION_NUMBER ?: 0) def appVersionName = "1.1.${System.env.JB_SPACE_EXECUTION_NUMBER}" def appKeyStoreFile = "../upload_key.jks" def appKeyStorePassword = System.env.KEY_STORE_PASSWORD def appKeyAlias = System.env.KEY_ALIAS def appKeyPassword = System.env.KEY_PASSWORD apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { compileSdkVersion 30 buildToolsVersion "30.0.3" defaultConfig { applicationId "com.first.simpleandroidapp" minSdkVersion 28 targetSdkVersion 30 versionCode appVersionCode versionName appVersionName testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } signingConfigs { release { storeFile file(appKeyStoreFile) storePassword appKeyStorePassword keyAlias appKeyAlias keyPassword appKeyPassword // Optional, specify signing versions used v1SigningEnabled true v2SigningEnabled true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } } dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.google.android.material:material:1.3.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.navigation:navigation-fragment-ktx:2.3.4' implementation 'androidx.navigation:navigation-ui-ktx:2.3.4' testImplementation 'junit:junit:4.13' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }
  6. ファストレーンを構成します。fastlane/Fastfile で、新しいレーンを追加します。

    desc "Upload app draft to internal testing track" lane :deploy_draft_to_internal do gradle( task: 'bundle', build_type: 'Release' ) upload_to_play_store( track: 'internal', release_status: 'draft' ) end

    このレーンは、まずアプリケーション AAB を構築し、それを内部テストトラックにアップロードします。

  7. fastlane/Appfile ファイルで、Google Play サービスアカウントキーへのパス (プロジェクトルートからの相対パス) を指定します。ビルド中に、プロジェクトシークレットからキーを取得し、それをルートディレクトリに置きます。ここでは任意の名前を指定できます。例: Appfile は次のようになります。

    json_key_file("google_sa_key.json") package_name("com.first.simpleandroidapp")
  8. プロジェクトルートで、.space.kts 自動化スクリプトを作成します。

    job("Build and publish bundle to internal track") { // disable gitPush job trigger startOn { gitPush { enabled = false } } container("Build and publish", "mycompany.registry.jetbrains.space/p/projectkey/mydocker/automation-android-fastlane:1.0.5") { env["GOOGLE_SA_KEY"] = Secrets("google_sa_key") env["KEY_STORE"] = Secrets("key_store") env["KEY_STORE_PASSWORD"] = Secrets("key_store_password") env["KEY_PASSWORD"] = Secrets("key_password") env["KEY_ALIAS"] = Params("key_alias") shellScript { content = """ echo Get private signing key... echo ${'$'}KEY_STORE > upload_key.hex xxd -plain -revert upload_key.hex upload_key.jks echo Get Google service account key... echo ${'$'}GOOGLE_SA_KEY > google_sa_key.hex xxd -plain -revert google_sa_key.hex google_sa_key.json echo Build and publish AAB... fastlane android deploy_draft_to_internal """ } } }

    注:

    • 次の要件を満たすカスタム Docker イメージを使用します。

    • サービスアカウントキーをルートディレクトリの google_sa_key.json ファイル ( fastlane/Appfile で指定したのと同じファイル) に復元します。

  9. ジョブを実行します。ジョブが正常に完了したら、Google Play Console を確認します。アップロードされたアプリケーションのドラフトが含まれている必要があります。

    Published application draft
  10. 必要に応じて、アプリのメタデータ (スクリーンショット、説明など) のアップロード、アプリアーティファクトのプロモーション、製品フレーバーの操作など、他のすべてのリリースタスクを自動化するように fastlane を構成できます。詳細については、fastlane のドキュメント(英語)を参照してください。

Android プロジェクトでテストを実行する

Android プロジェクトは、次の 2 種類のテストをサポートします。

  • ローカルユニットテスト

    これらは「通常の」単体テストです。これらのテストは通常、Android アプリケーションをビルド / 公開するときに実行されます。例: ./gradlew test を使用してローカル単体テストを実行できます。

  • 計測されたテスト

    これらのテストは、実際の Android デバイス上またはエミュレータ内で実行されます。インストルメント化されたテストの実行を自動化するには、Google が提供するクラウドベースのサービスである Firebase Test Lab を使用できます。Firebase Test Lab は、オートメーションスクリプトで使用できる gcloud コマンドラインツールを完全にサポートしています。詳細 (英語)