Androidアプリの署名<KeyStore Keytool AndroidDebugKey>

<Androidアプリケーションへのデジタル署名>

Androidアプリケーション(以下アプリ)の動作に必要な様々なファイル(Javaソースをコンパイルしたclassファイル、リソース、データなど)をパッケージ化したものがapkファイル(android application package file)です。

拡張子を「.apk」から「.zip」に変えれば解凍ソフトを用いてパッケージ構成を確認することができます。apkファイルはアプリのインストーラーファイルになります。(参考サイト:apkファイルapkファイルとはapktoolでアンドロイドアプリの.apkファイルの中身を調べるApktoolの使い方(コマンドラインオプションの解説)

Google Play(旧 Android Market) に アップロードできる apkファイルの最大サイズは 50 MB です。ファイルのパッケージ名は、ユニーク(他と名前が重複しない)で永続的に使用できるものにします。パッケージ名は後で削除や再利用をすることができません。(参考サイト:アプリのアップロード

パッケージ名は英数字および下線(‘_’)が使用できます。(ただし最初の文字は英文字)「com.android」「com.google」「android」「com.example」から始まるパッケージ名は、Google Play に アップロードしようとすると「The package name of your apk may not begin with any of the following values: [com.android, com.google, android, com.example」とエラーになります。(参考サイト:アプリのアップロードパッケージ名を変更する必要がある場合

デジタル署名がないapkファイルは、Android端末の実機にも、エミュレーターにもインストールできません。すなわちアプリを実行することができません。署名されていないアプリは、不正なアプリと認識されます。署名の有効期限が切れているものはインストールできません。ただし、証明書の有効期限を確認するのはインストール時のみなので、インストール後に署名の有効期限が切れてもアプリは正常に動作します。(参考サイト:アプリケーションへの署名androidのアプリに署名したい

EclipseでAndroidアプリ開発時に普通にアプリを実行できますが、それは、開発者が明示的に署名を行わなくても、デバッグ用のキーストアが自動で作成されて署名されているからです。 WebシステムでHTTPSプロトコルを使用するときには、第三者機関である認証局(CA : Certification Authority)から発行されたSSLサーバ証明書が必要です。(参考サイト:SSLサーバ証明書の基礎知識インターネット10分講座:PKI証明書チェーン

一方、Androidアプリが配布されるAndroid Marketでは、アンドロイドアプリに認証局による署名を求めていないため自己証明書を使用します。アンドロイドでは、特定のデータへのアクセスが可能かどうかの判断や、ユーザIDの共有が可能かどうかの判断など、アプリケーション内部のデータアクセス を制御するために署名を使用します。 デジタル署名により、

  • コードの作成者を識別する
  • アプリが変更されていないかを検出する
  • アプリ間の信頼関係を確立する

といったことが可能になるので、なりすましやデータの改ざんの発見に有効です。この用途では、データの提供元と提供先が同じ証明書を持っていることを確認できればよいため、自己証明書で十分であると言えます。(参考サイト:Androidにおけるセキュリティ設計と動作(前編)Androidアプリへの署名 – 日本Androidの会アプリの署名に用いる証明書についてデジタル署名認証についてデジタル署名Javaとセキュリティ

アプリはそれぞれ独立したLinuxプロセスとして動き、インストール時に固有のLinuxユーザIDが割り当てられます。ユーザIDはアンインス トールされるまで変更されません。一度アンインストールして再インストールした場合は同じユーザIDになるとは限りません。また、別の端末に同じアプリを インストールしても、同じユーザIDにはなりません。アンドロイドで作成されるファイルへのアクセスは、このユーザIDによって制御され、ユーザIDが異 なると、明示的に許可しない限り別のアプリはファイルへアクセスできません。(参考サイト:IPA テクニカルウォッチ 「Android アプリの脆弱性」に関するレポート(pdf))

デジタル署名が異なると、ユーザIDが同一でも、アプリ間のデータ共有やアプリのアップデートができません。(参考サイト:Android のセキュリティーを理解するAndroid のマルチユーザ環境で ユーザID を取得するアプリ名? アクティビティ名? パッケージ名?

ただし、脆弱性が残っています。(参考サイト:Android OS においてアプリの署名の検証が不十分な脆弱性(Scan Tech Report)Androidアプリ不正改ざん検知ソリューション Walnut DetectorAndroidアプリDRMガイドライン

<キーストア>

キーストア(ファイルの種類を識別する拡張子は「.keystore」)は、キー情報(秘密鍵と公開鍵のペア、公開鍵証明書)を格納するリポジトリ(データの保管・管理場所)として機能するデータベースです。イメージとしては、鍵のかかった部屋(キーストア)に鍵(キー)のかかった金庫があり、金庫の中に証明書が入っている状態とするとよいかもしれません。(参考サイト:Android アプリケーションの公開 プライベートキーの作成とデジタル署名鍵と証明書を設定するキーストアファイル

Androidプロジェクトを初めてデバッグビルド(ソースコードのコンパイルやライブラリのリンクなどを行い、最終的な実行可能ファイルを作成)すると、「.android」フォルダに、デバッグ用のキー情報(「androiddebugkey」-パスワードはデフォルトで「android」)を格納したデバッグ用のキーストア(「debug.keystore」-パスワードはデフォルトで「android」)が、自動生成されます。(参考サイト:アプリケーションへの署名Signing Your Applications

以後のデバッグビルドのデジタル署名は、この「debug.keystore」ファイルが使用されます。(参考サイト:Androidアプリケーションと署名Androidのデバッグ用apkの署名方法と確認方法

「debug.keystore」ファイルの生成場所は、Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」→「ビルド」とした右ペインの「デフォルト・デバッグ・キーストア」欄で確認することができます。通常は以下の場所に生成されます。(参考サイト:Androidアプリケーションを公開するために:署名と配置の方法debug.keystore再生成AVDの保存場所を設定ANDROID_SDK_HOMEを設定する。PANIC: Could not open AVD config file

  • Windows XP → 「C:\Document and Settings\ユーザー名\.android\debug.keystore」
  • Windows Vista、7 → 「C:\Users\ユーザー名\.android\debug.keystore」
  • Mac OS X、Linux → 「~/.android/debug.keystore」

<コマンドプロンプト画面でフィンガープリントを確認>

デジタル証明書が改ざんされていないことを証明するためのハッシュ値をフィンガープリントといいます。(参考サイト:ハッシュ値を利用してファイルの同一性をチェックする

ハッシュ値とは、基のデータ(証明書)をハッシュ関数という特別な関数を使って計算で求めた値で、計算方法には「MD5」、「SHA」といったものがあります。ハッシュ値とハッシュ関数が分かっていても、基のデータを算出できないことが特徴です。(参考サイト:MD5SHA

フィンガープリントを確認するには、「Windows」キーを押しながら「R」キーを押して「ファイル名を指定して実行」画面を開き、名前欄に「cmd」と入力し、「OK」をクリックして「コマンドプロンプト」画面を開き、「keytool -list」コマンドを入力します。「keytool」とだけ入力すると、「keytoolの使い方」が表示されます。 「keytool」コマンドを入力して「’keytool’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」と表示が出る場合は、JDKがインストールされていないか、keytoolまでのパスがとおっていないことが考えられます。keytoolはJDKインストールフォルダのbinフォルダ配下にあります。JREにはありません。(参考サイト:Java環境に手動でグローバルサインのルート証明書をインストールする方法

「keytool」コマンドは、パスをとおして利用するのが便利です。パスをとおさずに利用する方法についても後述します。

  1. 「Windows」キーを押しながら「Pause」キーを押して(またはWindows画面左下の「スタートメニュー」→「コンピュータ」右クリック→「プロパティ」をクリックして)「システム」画面を開き、左側の表示上から4つ目の「システム詳細設定」をクリックします。
  2. 「ユーザーアカウント制御」画面が開いたら「続行」をクリックします。
  3. 「システムのプロパティ」画面が開いたら、詳細設定タブの「環境変数」をクリックします。
  4. 「環境変数」画面が開いたら、システム環境変数の「新規」ボタンをクリックします。
  5. 「新しいシステム変数」画面が開いたら、変数名に「JAVA_HOME」、変数値に「C:\Program Files\Java\jdk1.6.0_45」と入力し、「OK」をクリックします。
  6. ”Program”と”Files”の間に半角空白がありますが 「”C:\Program Files\Java\jdk1.6.0_45″」とダブルクォーテーションで括る必要はありません。(既にシステム環境変数に「JAVA_HOME」が存在する場合は、「JAVA_HOME」をダブルクリックし、変数値を「C:\Program Files\Java\jdk1.6.0_45」に置き換え、「OK」をクリックします。)
  7. 次に、システム環境変数「Path」(大文字小文字は無視されるので「PATH」あるいは「path」となっているかもしれません。)をダブルクリックします。「システム変数の編集」画面が開き、変数名欄が「Path」で表示されたら、変数値欄をクリックし、左矢印キーで確実に入力値の文字列先頭まで移動し、文字列先頭に「%JAVA_HOME%\bin;」を追記します。「Path」の元々の変数値を消すとシステムに不具合を及ぼすので、慎重に行ってください。不安なら元々の変数値をバックアップしておくことをお勧めします。セミコロン(;)は複数の値を設定する場合の区切り文字なので、忘れずに記述します。「%\bin;」の「\」も忘れやすいので注意します。入力できたら「OK」をクリックします。
  8. 「環境変数」画面で「OK」をクリックし、「システムのプロパティ」画面で「OK」をクリックして設定を反映します。(参考サイト:コマンドプロンプトでMD5が取得できない

 

「debug.keystore」ファイルのフィンガープリントを確認するには、「keytool -list -v -keystore C:\Users\ユーザー名\.android\debug.keystore」 -storepass android」とコマンドを入力します。詳細情報表示になり、証明書のフィンガープリント「MD5」と「SHA1」を確認することができます。(参考サイト:Android keystoreの操作

ただし、一度もAndroidプロジェクトをデバッグビルドしていない場合は、「debug.keystore」ファイルが生成されていないので、「keytool エラー: java.lang.Exception: キーストアファイルは存在しません: C:\Users\ユーザー名\.android\debug.keystore」とエラー表示になります。(参考サイト:Android キーストア・ファイルは存在しません

「keytoolエラー: java.lang.Exception: キーストア・ファイルは存在しますが、空です:」と出る場合は、キー情報がありません。

「keytool -list -keystore C:\Users\ユーザー名\.android\debug.keystore -storepass android」のように「 -v」オプションを入れずにコマンドを入力した場合は、Javaのバージョンによって表示されるフィンガープリントが異なります。Java6の場合は「MD5」が、Java7の場合は「SHA1」が表示されます。(参考サイト:Maps API Keyの取得についてjdk1.7ではkeytoolによるデフォルトSHA1だけに(MD5は?)keytool の結果が MD5 じゃなくて SHA1 になってるッ!!!JDK1.6と1.7でkeytoolの暗号化アルゴリズムが違う件

「keytool -list -v -keystore C:\Users\ユーザー名\.android\debug.keystore」のように「-storepass android」オプションを入れずにコマンドを入力した場合は、「キーストアのパスワードを入力してください:」とパスワードを問われます。これに対して、本来はデバッグ用のキーストアのパスワードの「android」を入力して「Enter」キーを押すべきところですが、そのまま「Enter」キーを押しても構いません。その結果「警告-キーストアに保存された情報の安全性は検証されていません! 完全性を検証するには、キーストアのパスワードを入力する必要があります。」とメッセージがでますが、表示されるフィンガープリントは、正式にパスワードを入力した場合と違いはありません。 Mac環境で漢字表示が文字化けする場合は、参考サイトを試してください。(参考サイト:MacOSXでJava系コマンドが文字化けするMacでAndroidデバッグ用証明書を生成するときにターミナルの文字化けを防ぐにはAndroid開発環境をセットアップしてMavenでビルドできるようにする

<Eclipseでフィンガープリントを確認>

プラグインをインストールすることで、Eclipseでもフィンガープリントを確認することができます。(参考サイト:Keytool plugin for Eclipse

  1. Eclipseメニューの「ヘルプ」→「新規ソフトウエアのインストール」をクリックします。「インストール」画面が開きます。
  2. 「追加」をクリックします。「リポジトリーの追加」画面が開きます。
  3. 名前欄に「Keytool plugin」(任意の名前)を、ロケーション欄に「http://keytool.sourceforge.net/update」を入力し、「OK」をクリックします。
  4. 「インストール」画面の名前欄に「Keytool」が表示されたら、「すべて選択」をクリックします。
  5. 「次へ」→「次へ」→「使用条件の条項に同意します」をチェックし「完了」をクリックします。
  6. 「選択が必要」画面が開き、「これらの証明書を信頼しますか?」欄に「patrick Fust; Picosoft; Picosoft」が表示されているので、「すべて選択」をクリックして、「OK」をクリックします。
  7. 「ソフトウエア更新」画面が開き「インストール内容を有効にするには、Eclipseを再始動する必要があります。再開せずに、変更を適用することもできますが、問題が発生する可能性があります。」と表示されるので、「今すぐ再始動」をクリックします。再開するとEclipseメニューに「Keytool」の項目が増えます。
  8. Eclipseメニューの「Keytool」→「Open Keystore」をクリックします。「Open keystorefile」画面が開きます。
  9. ファイル名に「C:\Users\ユーザー名\.android\debug.keystore」(Windows Vista、7の例)と入力します。「参照」ボタンを利用してフォルダツリーを辿って入力してもいいでしょう。パスワードに「android」と入力し、「ロード」をクリックします。パスワードを入れずに「ロード」をクリックすると、「Error loading keystore!」と表示され終了してしまいます。
  10. Eclipseのワークベンチ下側の「コンソール」ビューの横に「Keytool」ビューが現れるので、ビュー内の「androiddeugkey」をクリックします。ワークベンチ上側に「androiddeugkey」タブが表示され、フィンガープリントを確認することができます。

<debug.keystoreの有効期限>

「debug.keystore」のキー情報(秘密鍵と公開鍵のペア、公開鍵証明書)の有効期限が切れると、デバッグビルド時に「Error generating final archive: Debug Certificate expired on 年/月/日 時:分」(最後のアーカイブを生成中にエラー: 年/月/日 時:分 にデバッグ証明書が失効しました)とエラーメッセージが表示されます。(参考サイト:debug.keystore期限切れYour Project contains error s please fix them before running your applicationエラー

この場合、「コマンドプロンプト」画面で「del debug.keystore」とコマンドを入力して、有効期限切れのキー情報を「debug.keystore」ごと削除します。その後デバッグビルドすると、新しい有効期限のキー情報を格納した「debug.keystore」ファイルが自動生成され、エラーは解消されます。(参考サイト:2012年版 Androidアプリ開発 SDK入れて一年すると発生するエラー “Debug certificate expired on ~”アプリケーション実行時に”Error generating final archive: Debug Certificate expired on (日付)”エラーが発生する『Androidのちょっと忘れやすいトピックや時事ネタ』Your project contains error(s),please fix them begore running your application

初めてデバッグビルドを実行した際に自動生成される「debug.keystore」ファイルの有効期限は、以前は作成日から365日(1年)で設定されましたが、現在は10,950日(365日×30年)に変更されています。(参考サイト:『Eclipse』が実行できない!?

なお、デバッグ用のキーストアで署名したapkファイルをGoogle Play にアップロードしようとすると、「Google Play では、デバッグ証明書で署名されたapkは受け入れられません。有効期限が50年以上の新しい証明書を作成してください。」とのメッセージがでるようです。(参考サイト:Androidアプリをアップロードしようとすると、デバッグ証明書で署名されたapkは受け入れられませんと拒絶される。【Android】apkを署名する際の注意点[Unity3D]Android用の証明書を作る その1Unity : Android パッケージファイルの署名(2)

<キー情報の生成>

キー情報を自分で生成するには「keytool -genkeypair」(「keytool -genkey」)コマンドを使用します。(参考サイト:HTTPS設定 – keytoolを使った鍵とサーバ証明書の生成Java/keytool – 備忘録

JDK/JRE6以降、コマンドインタフェースが一部変更されており、「-genkeypair」コマンドの説明には、「このコマンドは、以前のリリースでは -genkey という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -genkeypair を使用することをお勧めします。」と記載されています。(参考サイト:keytool – 鍵と証明書の管理ツールkeytool

例えばデバッグ用のキー情報「androiddebugkey」を格納したキーストアファイル「debug.keystore」を自分で作成する場合は、「keytool -genkeypair -keystore debug.keystore -storepass android -alias androiddebugkey -keypass android -dname “CN=Android Debug,O=Android,C=US” -keyalg RSA -validity 10000」とコマンドを入力します。(参考サイト:Java/keytoolAndroidアプリへの署名の付け方keytoolコマンドで署名ファイルの作成いまさらAndroidアプリ開発記事 アプリ公開編 ②keytoolで秘密鍵を作成するAndroidアプリのデジタル署名に必要な証明書の作成

設定値の意味は以下の通りです。

  • keystore<キーストア名>:debug.keystore
    • 省略すると.keystoreになります。
  • storepass<キーストアのパスワード>:android
  • alias<エイリアス>:androiddebugkey
    • 省略するとmy~になります。
  • keypass<エイリアスのパスワード>:android
    • 省略するとキーストアのパスワードと同じになります。
  • dname-CN<所有者名(Common Name)>:Android Debug
  • dname-O<組織名(Organization)>:Android
  • dname-C<国番号(Country code)>:US
  • keyalg<公開鍵暗号方式>:RSA
    • 省略するとDSAになります。
  • validity<有効日数>:10000
    • 省略すると90になります。

エイリアスは、apkファイルに署名するときに使われるキー情報の参照名です。キーストアには複数のキー情報を格納することができ、エイリアスで区別します。通常Androidでは1つのキーストアに1つだけキー情報を格納します。(参考サイト:作成したアプリに署名を行う

エイリアス(キー情報)のパスワードは、 省略するとキーストアのパスワードと同じになります。キーとキーストアのパスワードは、同じにしたり別個にしたりできます。(参考サイト:keystoreのパスワードを変更する

組織名に「,」 (カンマ)が入っていると、「Keytool-error: java.io.IOException : Incorrect AVA format」とエラーになります。AVAはAttribute-Value-Assertions(属性値アサーション)の略で、属性値の記述が正しくないという意味になります。(参考サイト:incorrect AVA format エラー(署名作成時)keytoolエラー:java.io.IOException: Incorrect AVA format

国番号はISO規定の国コードを指定します。日本の場合は「JP」(大文字)です。国際電話番号の「81」ではありません。(参考サイト:Country Code – ISO 3166ISO 3166-1国番号

公開鍵暗号方式は、公開鍵の暗号化に使用するアルゴリズムとして RSA と DSA のどちらかを選択します。RSAを指定します。(参考サイト:RSADSA認証,アクセス制御

有効日数はアプリの予定される使用期間よりも長く設定します。25年以上であることが推奨されており、10000日は27年(1年365日)と145日になります。Google Play に アップロードする場合は、2033年10月22日 より後で切れるように設定しなければなりません。(参考サイト:Android Market登録(無料アプリ編)

既存のキーストアにエイリアス(キー情報)を追加する際に、キーストアのパスワードを誤ると、「keytool エラー: java.io.IOException: Keystore was tampered with, or password was incorrect」とエラーになります。例えば、既存のデバッグ用キーストア「debug.keystore」のパスワード「android」を誤ると、このエラーメッセージになります。(参考サイト:debug.keystore を新しくしたらパスワードが違うと怒られる。久々にAndroidアプリを開発しようとしたら動かない

既存のエイリアス(キー情報)と同一名のエイリアスを設定しようとすると、「keytool エラー: java.lang.Exception: 鍵ペアは生成されませんでした。別名 <エイリアス名> はすでに存在します。」とエラーになります。 エイリアス(キー情報)を削除する場合は、「keytool -delete -alias <エイリアス名> -keystore <キーストア名> -storepass <キーストアのパスワード>」とコマンドを入力します。(参考サイト:keytoolを使ってみた

キーストアを削除する場合は、「del <キーストア名>」とコマンドを入力します。(参考サイト:しばらく放置してアプリが起動しなくなるその前に

<リリース前>

アプリを複数のメンバで開発していて、開発者ごとに別々のデバッグ用のキーストアを使用しているとします。すると、証明書が異なるapkファイルは実機やエミュレータへ上書きインストールできないので、一旦アプリを削除してからインストールすることになります。また、Googleマップを使用する場合のGoogole Maps APIキーの取得に証明書が必要で、結果Googole Maps APIキーも開発者ごとに異なってしまいます。これでは手間がかかるので、複数のメンバで開発する場合はデバッグ用のキーストアを共用するのがいいでしょう。Eclipseメニューの「ウィンドウ」→「設定」→左ペイン「Android」→「ビルド」とした右ペインの「カスタム・デバッグ・キーストア」欄に共通のキーストアを指定します。参考サイトを記します。

本来デバックモードでは実行が難しいことの対処法の参考サイトを記します。

ADT r17より前は、デバッグビルドとリリースビルドで処理を切り替えたい場合、「AndroidManifest.xml」ファイルの「application」タグ内の「android:debuggable=true/false」を利用していました。参考サイトを記します。

ADT r17からは、「BuildConfig.java」のDEBUG定数(BuildConfig.DEBUG)を利用できるようになりました。プロジェクトを右クリック「Androidツール」→「Export Signed Application Package」 でapkファイルを作成するとDEBUG定数が「false」になります。万一、「false」にならなかった場合は、Eclipse メニューの「プロジェクト」→「自動的にビルド」を外し、「プロジェクト」→「クリーン」を実行後、プロジェクトを右クリック「Androidツール」→「Export Signed Application Package」という手順で行うとよいようです。参考サイトを記します。

ADT r17以降は、「android:debuggable=true/false」を記述すると、「Avoid hardcoding the debug mode; leaving it out allows debug and release builds to automatically assign one」 (デバッグモードを直接コード内に書き込むのは避けてください:書き込まなければ、リリースビルドとデバッグビルドを自動的に割り当てます)と警告が表示されます。参考サイトを記します。

Google Play を経由せずにアプリを実機にインストールしようとすると、出荷時の初期設定のままでは、「インストールはブロックされました。」と警告メッセージが表示されます。警告メッセージ画面左下の「設定」をクリックし、「提供元不明のアプリ」にチェックを入れ「OK」をクリックするとインストールできるようになります。一度チェックするとこの警告は以後表示されなくなります。セキュリティ上問題があるので、必要がなくなればブロックする設定に戻すのが安全です。ホーム画面で「Menu」ボタンをクリックし、「設定」の中の「アプリケーション」(端末によっては「セキュリティ」)を選択し、「提供元不明アプリ」のチェックを外します。参考サイトを記します。

なお、下記参考サイトで「android:debuggable」の設定をしているものがありますが、ADT r17以降は上で記述したように不要です。参考サイトを記します。

ファイルサイズ圧縮、難読化、最適化ツールのProGuardを設定するのもよいでしょう。使用されていないメソッド等、実質的に不要なコードを自動削除する機能があるので、リリース版アプリでの LogCat へのログ出力を制御にすることもできます。 AndroidでのProGuard 使い方 を参考にしてください。

<アプリのリリース>

アプリをGoogle Play に アップロードする場合は、次の3つが守られている必要があります。(参考サイト:アプリケーションへの署名Signing Your Applications

  1. アプリケーションは、有効期間が 2033年10月22日 より後で切れる暗号化キーで署名されている必要があります。
  2. アプリケーションは、そのマニフェストファイルの  <manifest> 要素の android:versionCode と android:versionName 属性の両方を定義する必要があります。サーバは、 android:versionCode を基準に、アプリケーションの内部的な識別と更新のハンドリングを行い、 android:versionName をアプリケーションのバージョンとしてユーザに表示します。
  3. アプリケーションは、そのマニフェストファイルの <application> 要素の android:icon と android:label 属性の両方を定義する必要があります。

リリースするapkファイルは、リリース用のキーストアで署名します。デバッグ用のキーストアで署名すると、Google Play にアップロードできません。 リリース用のキーストアでapkファイルを署名するには、「コマンドプロンプト」画面でする方法と、Eclipseでする方法があります。

<「コマンドプロンプト」画面でリリース用署名する場合>

未署名のapkファイルに「keytool -genkeypair」(「keytool -genkey」)コマンドで作成したリリース用のキーストアを用いて、「jarsigner -verbose -keystore」コマンドで署名し、「zipalign」コマンドで最適化します。

未署名のapkファイルをEclipseを使用して取得するには、対象のAndroidアプリケーションプロジェクトを右クリック→「Androidツール」→「未署名アプリケーション・パッケージのエクスポート…(Export Unsigned Application Package…)」をクリック→ファイル名を指定(<hogefuga.apk>)して「保存」をクリックします。

「An unsigned package of the application was saved at <hogefuga.apk> Before publishing the application you will need to:-Sign the application with your release key,-run zipalign on the signed package. ZipAlign is located in <SDK>/tools/ Alligning applications allows Android to use application resources more efficiently.」とメッセージが出たら、「OK」をクリックします。

「jarsigner」コマンドに「-verify」オプションを指定すると、apkファイルの署名を検証できます。 検証が成功すると、「jar が検証されました。」 というメッセージが表示されます。

「jarsigner -verify -verbose -certs <hogefuga.apk>」コマンドを実行して、「X.509 CN=Android Debug, O=Android, C=US [証明書は XX/XX/XX XX:XX から XX/XX/XX XX:XX まで有効です]」と表示されたら、<hogefuga.apk>はデバッグ用のキーストアで署名されています。(参考サイト:apkファイルの複数署名apkファイルに登録してあるデジタル証明書を見てみる。(Win)

「jarsigner -verify -verbose -certs <hogefuga.apk>」コマンドを実行して、「マニフェストは存在しません。jarは署名されていません。(署名が見つからないか、構文解析できません)」と表示されたら、<hogefuga.apk>は未署名のapkファイルです。

「jarsigner -verify -verbose -certs <hogefuga.apk>」コマンドを実行して「jarsigner: java.io.FileNotException:  <hogefuga.apk>(指定されたファイルが見つかりません。)」と表示される場合は、 <hogefuga.apk>と違う階層でコマンドを実行している可能性があります。「dir」コマンドで同じ階層に<hogefuga.apk>があることを確認します。

あるいは、<hogefuga.apk>が同じ階層になくても、フルパスでapkファイルの場所を指定すれば検証できます。

アプリの署名にも「jarsigner」コマンドを使用します。署名アルゴリズム(sigalg)は「SHA1withRSA」で、ダイジェストアルゴリズム(digestalg)は「SHA1」で署名します。(参考サイト:Sign your application with your private key

Java6では、デフォルトのアルゴリズムがAndroidの仕様に沿っているので、「jarsigner -verbose -keystore <keystore>(キーストアファイルのフルパス)<hogefuga.apk>(未署名のapkファイルのフルパス) <alias>(キーの参照名)」として署名できます。

Java7ではデフォルトのアルゴリズムが「SHA256withRSA」と「SHA-256」に変わっています。「jarsigner -verbose  -sigalg SHA1withRSA -digestalg SHA1 -keystore <keystore>(キーストアファイルのフルパス)<hogefuga.apk>(未署名のapkファイルのフルパス) <alias>(キーの参照名)」のように、「-sigalg」と「-digestalg」オプションを必ず付記する必要があります。 なお、「-digestalg SHA1」の部分を 「-digestalg SHA-1」とするのは不可のようです。参考サイトを記します。

署名をしたら「zipalign <-f> <-v> <アラインメント> <入力ファイル> <出力ファイル>」とします。(参考サイト:本格アプリを作ろう!Androidプログラミングレシピ

  • <-f>は、もし<出力ファイル>が存在したら上書きを強制(force)します。
  • <-v>は、画面出力を詳細(verbose)にします。
  • <アラインメント>は、アラインするバイト数を指定します。4以外の値は無視されます。
  • <入力ファイル>は、アラインメントされていない署名されたapkファイルを指定します。
  • <出力ファイル>は、アラインメントされて出力されるapkファイルを指定します。リリース用apkファイルになります。

「zipalign -v 4 <hogefuga.apk> <release.apk>」として、apk ファイル内の画像や raw ファイルなどのすべての非圧縮データを 4 バイトバウンダリで整列させるようにします。これにより、アプリケーション実行時のRAMの総使用量を減らすことが可能となります。参考サイトを記します。

その他の参考サイトを記します。

既に署名しているapkファイルに重ねて署名しようとすると、「jarsigner: jar に署名できません: java.util.zip.ZipException: invalid entry compressed size~」とエラーになることがあります。一旦署名を消す方法があるようです。参考サイトを記します。

<Eclipseでリリース用署名する場合>

Eclipseで署名する方法は、「コマンドプロンプト」画面でする方法では起こり得た二重署名の危険がなく簡単なのでお勧めです。Eclipseで対象のAndroidアプリケーションプロジェクトを右クリック→「Androidツール」→「署名アプリケーション・パッケージのエクスポート…(Export Signed Application Package…)」をクリックして署名します。Eclipseで署名した場合は、自動的にZipalignが実行され整列されます。Zipalignは、apkファイルの最適化を行ってくれるツールで、アプリの実行速度が向上します。Zipalignが実行されていないapkファイルを Google Play にアップロードしようとすると、「apk に zipalign が実行されていません。apk に zipalign ツールを実行して携帯端末上のパフォーマンスを向上させてください。」とメッセージが表示されます。現在は、zipalign実行が必須となっています。参考サイトを記します。

アプリのリリースに参考となるサイトを記します。

<アプリのアップデート>

Google Play にリリースしたアプリのアップデートには、リリース時に用いたキーストアが必要です。リリース用のキーストアを紛失したり、パスワードがわからなくなったりすると、アプリのアップデートができなくなるので、新しいパッケージ名と新しいキーストアでアプリを公開しなければならなくなります。また、リリース用のキーストアが第三者に渡ると、作者に成りすましてアプリを配布したり、勝手に置き換えたり、アプリのデータを盗んだりすることが可能になってしまうので、注意して厳重に保管する必要があります。

なお、頑張ればapkファイルをいじることは可能のようです。

<Google Maps API を使ったアプリを作成する場合>

地図アプリを作成するには、Google Maps APIのキーを取得する必要があります。また「Google APIs」をインストールする必要があります。 Google Maps API を利用するアプリは、デバッグ用とリリース用で証明書が異なることに留意が必要です。例えば、開発時のエミュレータでは地図が正常にが表示されていたのに、Google Play に公開したら真っ白で表示されないといったことが起こります。

Google Maps Android API v2を利用の場合「Google APIs」は必要ありません。Google Maps Android API v1 のAPIキーは、2013年3月3日から申請することはできなくなるので、2012年12月3日の時点でV2を使用するよう奨励されています。その後v1のAPIキーの発行は2013年3月18日をもって終了しました。参考サイトを以下に記します。

<Google Play Game Services を使ったアプリを作成する場合>

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>