倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

「はじめての Android」開発環境 〜without IDE 編〜 : 署名&パッケージング

以前の記事で IDE を使わずに Android アプリ開発プロジェクトを構築する方法をみました。 今回はそのプロジェクトから署名された apk ファイルを生成する方法を見ていきます(一覧)。

記事概要:

  1. (必要なら)鍵の生成 (keytool)
  2. 鍵の設定 (build.properties)
  3. apk ファイルの生成 (ant release)
  4. 警告あれこれ

以下、プロジェクトのルート・フォルダは「$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">

初めてのAndroid 第3版

初めてのAndroid 第3版


Ant 第2版

Ant 第2版