Skip to content

Most visited

Recently visited

navigation

アプリの署名

Android では、すべての APK はインストール前に証明書を使用してデジタル署名されている必要があります。このドキュメントでは、証明書の作成と保存、ビルド設定ごとに異なる証明書を使用した署名、APK に自動的に署名するためのビルドプロセス設定など、Android Studio を使用して APK に署名する方法を説明します。

証明書とキーストア

電子証明書または ID 証明書とも呼ばれる公開キー証明書には、公開キー / 秘密キーのペアで構成される公開キーのほか、キーの所有者を特定するその他のメタデータ(名前と場所など)が含まれています。証明書の所有者は、対応する秘密キーも所有しています。

APK に署名すると、署名ツールにより公開キー証明書が APK にアタッチされます。公開キー証明書は、APK を所有者および対応する秘密キーに一意に関連付ける「指紋」として機能します。これにより、Android では、以降の APK のアップデートが正規のものであり、元の作成者からリリースされたことが確認されます。この証明書の作成に使用するキーは、アプリ署名キーと呼ばれます。

キーストアは 1 つ以上の秘密キーを含むバイナリ ファイルです。

ユーザーが新しいバージョンをアプリのアップデートとしてインストールできるようにするには、すべてのアプリが使用期間全体を通じて同じ証明書を使用する必要があります。アプリの使用期間全体を通じて同じ証明書を使用するメリットについては、以下の署名に関する考慮事項をご覧ください。

デバッグビルドに署名する

IDE からプロジェクトを実行またはデバッグすると、Android Studio は、Android SDK ツールで生成されたデバッグ用証明書を使用して自動的に APK に署名します。Android Studio で初めてプロジェクトを実行またはデバッグすると、IDE はデバッグ キーストアとデバッグ用証明書を $HOME/.android/debug.keystore に自動的に作成し、キーストアとキーのパスワードを設定します。

デバッグ用証明書はビルドツールで作成され、設計上安全性は確保されていないため、ほとんどのアプリストア(Google Play ストアを含む)ではデバッグ用証明書で署名された APK の公開は受け入れられません。

Android Studio はデバック用署名情報を署名の設定に自動的に保存するため、デバッグのたびに入力する必要はありません。署名の設定は、キーストアの場所、キーストアのパスワード、キーの名前、キーのパスワードなど、APK の署名に必要なすべての情報で構成されたオブジェクトです。デバッグ用署名の設定を直接編集することはできませんが、リリースビルドに署名する方法を設定することはできます。

デバッグ用アプリのビルドおよび実行方法の詳細については、アプリをビルドして実行するをご覧ください。

デバッグ用証明書の有効期限

デバッグモードで APK に署名するために使用する自己署名証明書は、作成日から 365 日で失効します。証明書の期限が切れるとビルドエラーになります。

この問題を解決するには、debug.keystore ファイルを削除します。ファイルは次の場所にあります。

次にデバッグビルド タイプをビルドおよび実行するとき、ビルドツールによって新しいキーストアとデバッグキーが再生成されます。ビルドするだけではキーストアとデバッグキーは再生成されないため、必ずアプリを実行する必要があります。

キーを管理する

アプリ署名キーは、デベロッパーの ID を確認して、シームレスかつ安全なアップデートをユーザーに保証するために使用されるため、キーの管理とその安全な保管は、デベロッパーとユーザーの両者にとって非常に重要です。Google Play App Signing を使用して Google のインフラでアプリ署名キーを安全に管理および保管するか、独自のキーストアとアプリ署名キーを管理および保護するかを選択できます。

Google Play App Signing を使用する

Google Play App Signing を使用する場合は、アプリ署名キーとアップロード キーの 2 つのキーを使用します。Google はアプリ署名キーの管理と保護を担当します。アップロード キーはデベロッパーが保管し、Google Play ストアにアプリをアップロードする際に、アプリへの署名に使用します。

Google Play App Signing の使用を選択する場合、Google Play から提供される Play Encrypt Private Key ツールを使用して、アプリ署名キーをエクスポートおよび暗号化してから、Google のインフラにアップロードします。次にアップロード キーを別に作成して Google に登録します。アプリを公開する準備が整ったら、アップロード キーを使用してアプリに署名し、Google Play にアップロードします。図 1 に示すように、Google はアップロード証明書を使用して本人確認を行い、アプリ署名キーで APK に再署名し、ユーザーに配信します(アプリ署名キーをまだ生成していない場合は、サインアップ プロセス中に生成できます)。

図 1. Google Play App Signing でアプリに署名する

Google Play App Signing を使用しているときにアップロード キーを失くしたり、キーが侵害されたりした場合は、Google に連絡して古いアップロード キーを取り消し、新しいキーを生成してください。アプリ署名キーは Google によって保護されているため、アップロード キーを変更した場合でも、新しいバージョンのアプリを元のアプリのアップデートとして引き続きアップロードできます。

Google Play App Signing の使用を選択する方法の詳細については、アプリ署名キーを管理するをご覧ください。

固有のキーとキーストアを管理する

Google Play App Signing を使用する代わりに、固有のアプリ署名キーとキーストアの管理を自分で行うことができます。固有のアプリ署名キーとキーストアの管理を自分で行う場合、自分の責任でこのキーとキーストアを安全に保護する必要があります。キーストアには強力なパスワードを使用する必要があり、キーストアに保存する各秘密キーにもそれぞれ異なる強力なパスワードを使用する必要があります。キーストアは安全な場所に保管する必要があります。アプリ署名キーにアクセスできなくなったり、キーが侵害されたりした場合、Google はアプリ署名キーを取り出すことができなくなり、デベロッパーは新しいバージョンのアプリを元のアプリのアップデートとしてユーザーにリリースできなくなります。詳細については、後述のキーを保護するをご覧ください。

図 2 に示すように、固有のアプリ署名キーとキーストアを自分で管理する場合は、APK に署名するときに、アプリ署名キーを使用してローカルで APK に署名し、署名済み APK を直接 Google Play ストアにアップロードして配信します。

図 2. 固有のアプリ署名キーを自分で管理する場合のアプリへの署名

APK に署名する

キーとキーストアの管理方法に関係なく、Android Studio を使用して、手動で、または APK に自動的に署名するようにビルドプロセスを設定して APK に署名できます(アップロード キーまたはアプリ署名キーのいずれかで)。

固有のアプリ署名キーとキーストアの管理と保護を自分で行う場合は、アプリ署名キーを使用して APK に署名します。Google Play App Signing を使用してアプリ署名キーとキーストアの管理と保護を行う場合は、アップロード キーを使用して APK に署名します。

キーとキーストアを生成する

Android Studio でアプリ署名キーまたはアップロード キーを生成するには、次の手順を実行します。

  1. メニューバーで、[Build] > [Generate Signed APK] をクリックします。
  2. プルダウンでモジュールを選択し、[Next]をクリックします。
  3. [Create new] をクリックして、新しいキーとキーストアを作成します。

  4. 図 3 のように、[New Key Store] ウィンドウで、キーストアとキーに次の情報を指定します。

    図 3. Android Studio で新しいキーストアを作成する

    Keystore

    • Key store path: キーストアを作成する場所を選択します。
    • Password: キーストアの安全なパスワードを作成し、確認します。

    Key

    • Alias: キーを識別する名前を入力します。
    • Password: キーの安全なパスワードを作成し、確認します。キーストアのパスワードとは異なるパスワードにする必要があります。
    • Validity (years): キーの有効期間を年単位で設定します。キーは少なくとも 25 年間は有効であるため、アプリの使用期間全体を通じて同じキーを使用してアプリのアップデートに署名できます。
    • Certificate: 証明書の所有者に関する情報を入力します。この情報はアプリには表示されませんが、APK の一部として証明書に含まれます。

    フォームの入力が完了したら、[OK] をクリックします。

  5. 新しいキーで署名した APK を生成する場合は、手動で APK に署名します。キーとキーストアのみを生成して、APK に署名しない場合は、[Cancel] をクリックします。
  6. Google Play App Signing を使用する場合は、アプリ署名キーを管理するに進み、Google Play App Signing のセットアップの指示に従ってください。

手動で APK に署名する

Android Studio を使用して、署名済み APK を手動で一度に 1 つずつ、または同時に複数のビルド バリアント向けに生成できます。手動で APK に署名する代わりに、ビルドプロセスで自動的に署名を処理するように Gradle ビルドを設定することもできます。このセクションでは、手動の署名プロセスについて説明します。ビルドプロセスに署名を含める方法については、APK に自動で署名するようビルドプロセスを設定するをご覧ください。

Android Studio でリリース用 APK に手動で署名するには、次の手順を実行します。

  1. [Build] > [Generate Signed APK] をクリックし、[Generate Signed APK] ウィンドウを開きます(上述のようにキーとキーストアを生成した直後の場合、このウィンドウは既に開いています)。
  2. [Generate Signed APK Wizard] ウィンドウで、キーストアと秘密キーを選択して両方のパスワードを入力します(前のセクションでキーストアを作成した場合は、このフィールドに既に入力されています)。[Next] をクリックします。

    注: Google Play App Signing を使用している場合は、アップロード キーをここで指定する必要があります。固有のアプリ署名キーとキーストアを自分で管理している場合は、アプリ署名キーを指定する必要があります。詳細については、上述のキーを管理するをご覧ください。

    図 4. Android Studio で秘密キーを選択する

  3. 次のウィンドウで、署名済み APK の保存先を指定し、ビルドタイプを選択して、プロダクト フレーバーを選択し(該当する場合)、[Finish] をクリックします。

    図 5. 選択したプロダクト フレーバーの署名済み APK を生成する

    注: プロジェクトでプロダクト フレーバーを使用している場合、Windows / Linux では Control キー、Mac OSX では Command キーを押しながら複数のプロダクト フレーバーを選択できます。Android Studio は、選択したプロダクト フレーバーごとに個別の APK を生成します。

このプロセスが完了すると、上記の手順で指定した保存先フォルダに署名済み APK が作成されます。これで、Google Play ストアなどのアプリのマーケットプレイスまたは任意の仕組みを使って署名済み APK を配布できます。Google Play ストアに署名済み APK を公開する方法については、公開を開始するをご覧ください。その他の配布オプションについては、その他の配布方法をご覧ください。

ユーザーがアプリのアップデートを正常にインストールできるようにするには、アプリの使用期間全体を通じて同じ証明書で APK に署名する必要があります。この APK への署名とすべてのアプリを同じキーで署名するさまざまなメリットについては、以下の署名に関する考慮事項をご覧ください。秘密キーとキーストアの保護の詳細については、キーを保護するをご覧ください。

APK に自動で署名するようビルドプロセスを設定する

Android Studio で、ビルドプロセス中にリリース用 APK に自動的に署名するようにプロジェクトを設定できます。そのためには、署名設定を作成し、リリース ビルドタイプにその設定を適用します。署名設定は、キーストアの場所、キーストアのパスワード、キーのエイリアス、キーのパスワードで構成されます。Android Studio で署名設定を作成してリリース ビルドタイプに適用するには、次の手順を実行します。

  1. [Project] ウィンドウで、アプリを右クリックし、[Open Module Settings] をクリックします。
  2. [Project Structure] ウィンドウの左側のパネルにある [Modules] で、署名するモジュールをクリックします。
  3. [Signing] タブをクリックし、[Add] をクリックします
  4. キーストア ファイルを選択して、この署名設定の名前を入力し(複数作成する場合があるため)、必要な情報を入力します。

    図 6. 新しい署名設定を作成するためのウィンドウ

  5. [Build Types] タブをクリックします。
  6. [release] ビルドをクリックします。
  7. [Signing Config] で、作成した署名設定を選択します。

    図 7. Android Studio で署名設定を選択する

  8. [OK] をクリックします。

これで、Android Studio を使用してリリース ビルドタイプをビルドするたびに、IDE は指定した署名設定を使用して自動的に APK に署名するようになります。署名済み APK は、ビルドしたモジュールのプロジェクト ディレクトリの build/outputs/apk/ フォルダにあります。

署名設定を作成すると、署名情報が Gradle ビルド ファイルの書式なしテキストに保存されます。チームで作業している場合、またはコードを一般公開して共有する場合は、署名情報を保護する必要があるため、ビルドファイルから署名情報を削除して別の場所に保存します。署名情報をビルドファイルから削除する方法については、ビルドファイルから署名情報を削除するをご覧ください。署名情報の保護の詳細については、キーを保護するをご覧ください。

プロダクト フレーバーごとに異なる署名をする

アプリでプロダクト フレーバーを使用し、フレーバーごとに異なる署名を行う場合、追加の署名設定を作成し、フレーバーごとに指定することができます。

  1. [Project] ウィンドウで、アプリを右クリックし、[Open Module Settings] をクリックします。
  2. [Project Structure] ウィンドウの左側のパネルにある [Modules] で、署名するモジュールをクリックします。
  3. [Signing] タブをクリックし、[Add] をクリックします
  4. キーストア ファイルを選択して、この署名設定の名前を入力し(複数作成する場合があるため)、必要な情報を入力します。

    図 8. 新しい署名設定を作成するためのウィンドウ

  5. 必要に応じて、すべての署名設定を作成するまで手順 3 および 4 を繰り返します。
  6. [Flavors] タブをクリックします。
  7. 設定するフレーバーをクリックし、[Signing Config] プルダウン メニュー から適切な署名設定を選択します。

    図 9. プロダクト フレーバーごとに署名の設定をする

    追加のプロダクト フレーバーの設定を繰り返します。

  8. [OK] をクリックします。

Gradle の設定ファイルで署名設定を指定することもできます。詳細については、署名の設定をするをご覧ください。

Android Wear アプリに署名する

Android Wear アプリをビルドしている場合、アプリへの署名プロセスは、このページに記載されているプロセスとは異なることがあります。詳細については、Android Wear アプリのパッケージ化と公開をご覧ください。

署名に関する考慮事項

アプリの想定される使用期間全体を通じて、同じ証明書ですべての APK に署名する必要があります。その理由は次のとおりです。

アプリのアップグレードをサポートする場合、アプリ署名キーの有効期間は、そのアプリの想定される使用期間よりも長くなければなりません。推奨される有効期間は 25 年以上です。キーの有効期間が切れると、ユーザーはアプリの新しいバージョンにシームレスにアップグレードできなくなります。

アプリを Google Play で公開する場合、APK への署名に使用するキーの有効期限は 2033 年 10 月 22 日以降にする必要があります。Google Play では、新しいバージョンが使用可能になったときにユーザーがアプリをシームレスにアップグレードできるようにするために、この要件を設けています。Google Play App Signing を使用すれば、Google によって、アプリが正しく署名されていることが保証され、アプリの使用期間中にアップデートを受け取ることができます。

キーを保護する

アプリ署名キーとキーストアの管理を自分で行う場合(Google Play App Signing を使用する代わりに)、アプリ署名キーの保護は、デベロッパーとユーザーの両者にとって非常に重要です。別の人にキーの使用を許可したり、キーストアとパスワードを第三者が見つけて使用できるような安全ではない場所に置いたりすると、作成者本人であるという保証がなくなり、ユーザーの信頼を失います。

注: Google Play App Signing を使用すると、アプリ署名キーは Google のインフラで安全に保管されます。後述のように、アップロード キーについては、自分で引き続き安全に保管する必要があります。アップロード キーが侵害された場合は、Google に連絡してこのキーを取り消し、新しいアップロード キーを受け取ることができます。

第三者があなたの知らないうちに、または許可なくキーを取得した場合、その第三者が本物のアプリを不正に置き換えたり破損させたりするアプリに署名し、配布するおそれがあります。また、あなたの ID で他のアプリやシステム自体を攻撃したり、ユーザーデータを破損したり盗んだりするアプリに署名して配布する可能性もあります。

秘密キーは、アプリの今後のバージョンすべてに署名するために必要です。キーを紛失したり不適切な場所に置いたりすると、既存のアプリのアップデートを公開できなくなります。以前に生成したキーを再生成することはできません。

デベロッパーとしてのあなたの評判は、アプリ署名キーを期限切れになるまで常に適切に保護することにかかっています。次に、キーを安全に保つためのヒントを示します。

一般的に、キーを生成、使用、格納する際の常識的な注意事項を順守すれば、キーの安全は確保されます。

ビルドファイルから署名情報を削除する

署名設定を作成すると、Android Studio はモジュールの build.gradle ファイルに書式なしテキストとして署名情報を追加します。チームで作業していたり、コードをオープンソース化したりする場合、この機密情報をビルドファイルから削除し、第三者が容易にアクセスできないようにする必要があります。そのためには、次のように、機密情報を保存するプロパティ ファイルを個別に作成し、ビルドファイルでそのファイルを参照するようにします。

  1. 署名設定を作成し、1 つ以上のビルドタイプに適用します。この手順では、上記の APK に自動で署名するようビルドプロセスを設定するで説明したように、リリース ビルドタイプの署名設定を 1 つ設定しているものとします。
  2. プロジェクトのルート ディレクトリで keystore.properties というファイルを作成します。このファイルには、次に示す署名情報を含める必要があります。
    storePassword=myStorePassword
    keyPassword=mykeyPassword
    keyAlias=myKeyAlias
    storeFile=myStoreFileLocation
    
  3. モジュールの build.gradle ファイルで、android {} ブロックの前に keystore.properties ファイルを読み込むコードを追加します。
    ...
    
    // Create a variable called keystorePropertiesFile, and initialize it to your
    // keystore.properties file, in the rootProject folder.
    def keystorePropertiesFile = rootProject.file("keystore.properties")
    
    // Initialize a new Properties() object called keystoreProperties.
    def keystoreProperties = new Properties()
    
    // Load your keystore.properties file into the keystoreProperties object.
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
    
    android {
        ...
    }
    
    

    注: 別の場所に keystore.properties ファイルを保存することもできます(たとえば、プロジェクトのルート フォルダではなくモジュール フォルダや、継続的インテグレーション ツールを使用している場合はビルドサーバー上など)。その場合は、実際の keystore.properties ファイルの場所を使用して keystorePropertiesFile が正しく初期化されるように、上記のコードを変更する必要があります。

  4. 構文 keystoreProperties['propertyName'] を使用して、keystoreProperties に保存されたプロパティを参照できます。この構文を使用して、keystoreProperties に保存された署名情報を参照するように、モジュールの build.gradle ファイルの signingConfigs ブロックを変更します。
    android {
        signingConfigs {
            config {
                keyAlias keystoreProperties['keyAlias']
                keyPassword keystoreProperties['keyPassword']
                storeFile file(keystoreProperties['storeFile'])
                storePassword keystoreProperties['storePassword']
            }
        }
        ...
      }
    
  5. [Build Variants] ツール ウィンドウを開き、リリース ビルドタイプが選択されていることを確認します。
  6. [Build] > [Build APK] をクリックしてリリース ビルドをビルドし、署名済み APK がモジュールの build/outputs/apk/ ディレクトリに作成されたことを確認します。

これでビルドファイルには機密情報が含まれていないため、ビルドファイルをソース コントロールに含めたり、共有のコードベースにアップロードしたりできます。必ず keystore.properties ファイルのセキュリティを確保し、ソース コントロール システムからの削除なども検討してください。

コマンドラインからアプリをビルドして署名する

アプリの署名に Android Studio は必要ありません。apksigner ツールを使用して、コマンドラインからアプリに署名するか、ビルド時にデベロッパーに代わってアプリに署名するように Gradle を設定することができます。どちらの方法でも、keytool を使用して秘密キーを最初に生成する必要があります。次に例を示します。

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

注: keytool は、JDK の bin/ ディレクトリにあります。Android Studio から JDK を探す場合は、[File] > [Project Structure] を選択しから [SDK Location] をクリックすると、[JDK location] が表示されます。

この例では、キーストアとキーのパスワードを入力し、キーの識別名フィールドを指定するよう求められます。次に my-release-key.jks というファイルでキーストアが生成されるので、これを現在のディレクトリに保存します(任意の保存先に移すことができます)。キーストアには、10,000 日間有効なキー 1 つ含まれています。

これで署名されていない APK をビルドして手動で署名するか、Gradle を設定して APK に署名することができます。

署名されていない APK をビルドして手動で署名する

  1. Android Studio で [View] > [Tool Windows] > [Terminal] を選択してコマンドラインを開き、プロジェクト ディレクトリのルートに移動します。次に assembleRelease タスクを呼び出します。
    gradlew assembleRelease
    

    これにより、project_name/module_name/build/outputs/apk/module_name-unsigned.apk という APK が作成されます。APK は、この時点で未署名であり、最適化されていません。秘密キーで署名するまでインストールされません。

  2. zipalign を使用して、未署名の APK を最適化します。

    zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
    

    zipalign によって、未圧縮のすべてのデータが、ファイルの始まりを基準にして特定のバイト単位で整列されて開始されるようになります。これにより、アプリが使用する RAM の量が削減されます。

  3. apksigner を使用して、秘密キーで APK に署名します。

    apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
    

    この例では、単一のキーストア ファイル my-release-key.jks に保管されている秘密キーと証明書を使用して署名された APK が my-app-release.apk に出力されます。

    apksigner ツールは、個別の秘密キーと証明書ファイルを使用した APK ファイルの署名や、複数の署名者を使用した APK の署名など、その他の署名オプションもサポートしています。詳細については、apksigner リファレンスをご覧ください。

    注: apksigner ツールを使用するには、リビジョン 24.0.3 以降の Android SDK Build Tools をインストールしている必要があります。このパッケージは、SDK Manager を使用してアップデートできます。

  4. APK が署名されたことを確認します。

    apksigner verify my-app-release.apk
    

Gradle を設定して APK に署名する

  1. モジュールレベルの build.gradle ファイルを開き、 storeFilestorePasswordkeyAliaskeyPassword のエントリを含む signingConfigs {} ブロックを追加して、そのオブジェクトをビルドタイプの signingConfig プロパティに渡します。次に例を示します。
    android {
        ...
        defaultConfig { ... }
        signingConfigs {
            release {
                storeFile file("my-release-key.jks")
                storePassword "password"
                keyAlias "my-alias"
                keyPassword "password"
            }
        }
        buildTypes {
            release {
                signingConfig signingConfigs.release
                ...
            }
        }
    }
    

    Gradle は build.gradle からの相対パスを読み取るため、上記の例は、my-release-key.jksbuild.gradle ファイルと同じディレクトリにある場合のみ動作します。

    注: この場合、キーストアとキーのパスワードは build.gradle ファイルに直接表示されます。セキュリティを強化するため、ビルドファイルから署名情報を削除する必要があります。

  2. プロジェクトのルート ディレクトリでコマンドラインを開き、 assembleRelease タスクを呼び出します。
    gradlew assembleRelease
    

これにより、project_name/module_name/build/outputs/apk/module_name-release.apk という APK が作成されます。この APK ファイルは、build.gradle ファイルで指定された、zipalign で最適化されている秘密キーで署名されます。

署名キーでリリースビルドを設定したら、そのビルドタイプで「インストール」タスクが使用できるようになります。installRelease タスクにより、すべてのエミュレータまたは端末で、リリース APK のビルド、最適化、署名、インストールが可能になります。

秘密キーで署名された APK を配布する準備が整いましたが、最初にアプリを公開する方法の詳細を確認し、次に Google Play のローンチ チェックリストを見直す必要があります。

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)