以前の記事で IDE を使わずに Android アプリ開発プロジェクトを構築する方法をみました。 今回はそのプロジェクトから署名された apk ファイルを生成する方法を見ていきます(一覧)。
記事概要:
- (必要なら)鍵の生成 (keytool)
- 鍵の設定 (build.properties)
- apk ファイルの生成 (ant release)
- 警告あれこれ
以下、プロジェクトのルート・フォルダは「$PROJECT_HOME」とします。
鍵の生成
まずはキーストアと鍵の生成。 既にあるキーストアを使う場合は、このステップを実行する必要はありません。 キーストアと鍵を生成するには JDK に付属する「keytool」を使用します。 詳しい使い方は
などを参照。 コマンド・プロンプト(以下 Windows 前提)のカレントフォルダ下に「.keystore」というファイル名のキーストア
- $PROJECT_HOME/.keystore
を生成するためには以下のようにします(alias の waman は適当に変更してください):
keytool -genkey -alias waman -keystore .keystore
個々のプロジェクトに依らないキーストアを作成したい場合は -keystore オプションを指定せずに
keytool -genkey -alias waman
と実行すれば、
- C:/Documents and Settings/●●●●/.keystore (= ${user.home}/.keystore)
というキーストアが生成されます。 ここで「●●●●」はユーザー名です。
鍵設定
次は、ビルドに使用する Ant にキーストアを知らせる設定です。 Ant によって読み込まれる設定ファイル
- $PROJECT_HOME/build.properties
に以下のプロパティを設定します($PROJECT_HOME にキーストア「.keystore」を生成した場合):
key.store=.keystore key.alias=waman
上記でキーストアのファイルを指定せずに鍵を生成した場合、以下のようにパス区切り文字 \(円記号)をエスケープする必要あり:
key.store=C:\\Documents and Settings\\●●●●\\.keystore key.alias=waman
ちなみに、同ファイルで apk ファイルを出力するフォルダを指定する「out.dir」も設定できますが、これをプロジェクトのルートフォルダに指定する(out.dir=.)と、「ant clean」を実行した際にカレントフォルダ下の全てのファイル、フォルダが削除されてしまいます・・・Oh, my god!
apk ファイルの生成
上記の設定ができれば apk ファイルを生成するのは簡単で、プロジェクトのルートフォルダ上で以下のコマンド
ant release
を実行するだけです。
Buildfile: C:\idea\HelloAndroid\build.xml
[setup] Android SDK Tools Revision 10
[setup] Project Target: Android 2.3.3
[setup] API level: 10
[setup]
[setup] ------------------
[setup] Resolving library dependencies:
[setup] No library dependencies.
[setup]
[setup] ------------------
[setup]
[setup]
[setup] Importing rules file: tools\ant\main_rules.xml
-set-release-mode:
-release-obfuscation-check:
-pre-build:
-dirs:
[echo] Creating output directories if needed...
-aidl:
[echo] Compiling aidl files into Java classes...
-renderscript:
[echo] Compiling RenderScript files into Java classes and RenderScript bytecode...
-resource-src:
[echo] Generating R.java / Manifest.java from the resources...
-pre-compile:
compile:
[javac] Compiling 1 source file to $PROJECT_HOME\bin\classes
-post-compile:
-obfuscate:
-dex:
[echo] Converting compiled files and external libraries into $PROJECT_HOME\bin\classes.dex...
-package-resources:
[echo] Packaging resources
[aapt] Creating full resource package...
-package-release:
[apkbuilder] Creating HelloAndroid-unsigned.apk for release...
-release-prompt-for-password:
[input] Please enter keystore password (store:.keystore):
●●●●●●●●《キーストアのパスワードを入力》
[input] Please enter password for alias 'waman':
●●●●●●●●《鍵パスワードを入力》
-release-nosign:
release:
[echo] Signing final apk...
[signjar] Signing JAR: $PROJECT_HOME\bin\HelloAndroid-unsigned.apk to $PROJECT_HOME\bin\HelloAndroid-unaligned.apk as waman
[signjar]
[signjar] 警告:
[signjar] 署名者の証明書は 6 か月以内に期限切れになります。
[signjar] キーストアのパスワードを入力してください:
[echo] Running zip align on final apk...
[echo] Release Package: $PROJECT_HOME\bin\HelloAndroid-release.apk
BUILD SUCCESSFUL
Total time: 26 seconds途中で「キーストアのパスワード」と「鍵パスワード」の入力を求められます。 この実行が成功すると、以下の apk ファイルが生成されます:
- $PROJECT_HOME/bin/HelloAndroid-release.apk
警告あれこれ
「ant release」を実行するといくつか警告が表示されることがありますが、その対処法を簡単に見ていきます。
minSdkVersion
「minSdkVersion」が設定されていないと以下の警告メッセージが表示されます:
[setup] WARNING: No minSdkVersion value set. Application will install on all Android versions.
「minSdkVersion」を設定するには
- $PROJECT_HOME/AndroidManifest.xml
に以下のような <uses-sdk> ノードを設定します:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> <application> ... </application> <uses-sdk android:minSdkVersion="10"/> </manifest>
debuggable=true
プロジェクトが「デバッグ可能」に設定されていると、以下のような警告が表示されます:
-set-release-mode:
[echo] *************************************************
[echo] **** Android Manifest has debuggable=true ****
[echo] **** Doing DEBUG packaging with RELEASE keys ****
[echo] *************************************************
...
[aapt.exe] Warning: AndroidManifest.xml already defines debuggable (in http://schemas.android.com/apk/res/android); using existing value in manifest.「デバッグ可能」を設定するには、これまた
- $PROJECT_HOME/AndroidManifest.xml
で設定をします。 この XML ファイルの /manifest/application ノードの @debuggable 属性の値を変更します:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> <application ... android:debuggable="false">...</application> </manifest>
属性自体を削除しても構いません。
'includeantruntime' was not set
Ant で普通にビルドを行うと以下のような警告が発せられます:
[javac] C:\android\android-sdk-windows\tools\ant\main_rules.xml:384: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
これは設定の問題ではないようですが(→)、そのままにしておくのは気持ち悪ければ、この警告を消す設定をしておきましょう。 これはプロジェクトの設定ファイルではなく、ANDROID_HOME 下のファイルを設定する必要があります。 以下のファイル
の compile ターゲットの javac タスク(377行目)に以下の属性を付加します:
<javac ... includeantruntime="false">
- 作者: Ed Burnette,日本Androidの会(監訳),長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/01/27
- メディア: 大型本
- 購入: 2人 クリック: 486回
- この商品を含むブログ (18件) を見る
- 作者: Steve Holzner,長瀬嘉秀(監訳),株式会社テクノロジックアート
- 出版社/メーカー: オライリージャパン
- 発売日: 2005/11/18
- メディア: 大型本
- 購入: 2人 クリック: 20回
- この商品を含むブログ (18件) を見る