メモ代わり

Feed Rss

Windows 環境にて Android アプリを Eclipse と Cygwin を使わずにビルドする。

07.26.2011, know how, by .

ノート PC や、低スペック PC 、自動ビルド環境のためにポータブルな開発環境を用意したい人向けです。

なるべく余計なものをインストールせずにコマンドプロンプトのみで完結する環境を目指し、実機での動作確認まで行います。
CMake を使い、 NDK を使ったライブラリのビルドから apk の署名まで行ってみます。

準備

インストールが必要なもの

  • JDK
  • VisualStudio

JDK は 64bit 版もあります。

ダウンロード必要なもの

インストーラでない zip パッケージをダウンロードしてください。

CMake toolchain file は Google Code 内 Mercurial のリポジトリから取得するのがベストですが、 Windows でソレは面倒なので、 ココの右側から Raw ファイルを取得してください。

  • CMake
  • Android SDK
  • Android NDK
  • Apache Ant
  • CMake toolchain file

Android SDK をダウンロードしたら、 SDK Manager を実行し、開発したい Android バージョンの Platform Tools をダウンロードしてください。

設定

それぞれのツールのコマンドを実行するためにパスの設定から行います。

パスの設定は環境変数の PATH にセミコロンで追加していきます。入力欄が一行なので横長になってしまいますが、根気良くパスを通しましょう。 nmake は VisualStudio 付属のコマンドラインツールから起動することで PATH の設定せずに使えます。

だいたいのツールはインストール先、もしくは展開先の bin ディレクトリ内にあります。 Android SDK ツールのパスは tools 内に設定します。

cmake --version
nmake /?
keytool
jarsigner
android -h
ant -h

これらのコマンドが動作すれば PATH の設定は完了です。次に他の環境変数を設定します。

JAVA_HOME    // JDK インストール先ディレクトリ、 ant に必要
ANDROID_NDK   // Android NDK ディレクトリ、 cmake に必要
ANDROID_TOOLCHAIN_CMAKE   // Android 用 CMake Toolchain file の場所、 cmake に必要

NDK ビルド

Linux 環境にて CMake を使った方法とほぼ同じです。 .so ライブラリを作ります。

まずビルド対象として、ここのサンプルを利用します。 Mercurial にて hg clone するか、ダウンロードしてください。

コマンドに最初にダウンロードした android.toolchain.cmake ファイルへのパスと NMake 利用を指定します。

D:\android-cmake\samples\hello-gl2>mkdir build
D:\android-cmake\samples\hello-gl2>cd build
D:\android-cmake\samples\hello-gl2\build>cmake .. -DCMAKE_TOOLCHAIN_FILE=%ANDROID_TOOLCHAIN_CMAKE% -G"NMake Makefiles"
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: D:/android/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gcc.exe
-- Check for working C compiler: D:/android/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gcc.exe -- works

省略

-- Configuring incomplete, errors occurred!

D:\android-cmake\samples\hello-gl2\build>cmake .. -DCMAKE_TOOLCHAIN_FILE=%ANDROID_TOOLCHAIN_CMAKE% -G"NMake Makefiles"
-- Configuring done
-- Generating done
-- Build files have been written to: D:/android-cmake/samples/hello-gl2/build

CMake 一回目は失敗します。 ABI が見つからないためだと思いますが、どうせ OS アーキテクチャが著しく違うため実行できません。構わずもう一度同じコマンドを実行すると CMake が完了します。
環境変数 ANDROID_LEVEL を android-4 などのように使えるレベルを変更することもできます。

続けて、

D:\android-cmake\samples\hello-gl2\build>nmake

Microsoft(R) Program Maintenance Utility Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

Scanning dependencies of target gl2jni
[100%] Building CXX object jni/CMakeFiles/gl2jni.dir/gl_code.cpp.o
Linking CXX shared library ..\..\libs\armeabi-v7a\libgl2jni.so
[100%] Built target gl2jni

D:\android-cmake\samples\hello-gl2\build>cd ..

完了です。ビルド時オプションは cmake 時に設定します。ファイルを追加などするときは CMakeLists.txt を編集し、 cmake しなおします。

apk 作成

Android プロジェクトを作ります。まずインストール済みの Android Platform を確認します。

D:\android-cmake\samples\hello-gl2>android list targets
Available Android targets:
id: 1 or "android-3"
     Name: Android 1.5
     Type: Platform
     API level: 3
     Revision: 4
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2 or "android-4"
     Name: Android 1.6
     Type: Platform
     API level: 4
     Revision: 3
     Skins: HVGA, QVGA, WVGA800 (default), WVGA854
id: 3 or "android-7"
     Name: Android 2.1-update1
     Type: Platform
     API level: 7
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 4 or "android-8"
     Name: Android 2.2
     Type: Platform
     API level: 8
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 5 or "android-9"
     Name: Android 2.3.1
     Type: Platform
     API level: 9
     Revision: 2
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 6 or "android-10"
     Name: Android 2.3.3
     Type: Platform
     API level: 10
     Revision: 1
     Skins: HVGA, QVGA, WQVGA400, WQVGA432, WVGA800 (default), WVGA854
id: 7 or "android-11"
     Name: Android 3.0
     Type: Platform
     API level: 11
     Revision: 1
     Skins: WXGA (default)
id: 8 or "android-12"
     Name: Android 3.1
     Type: Platform
     API level: 12
     Revision: 2
     Skins: WXGA (default)
id: 9 or "android-13"
     Name: Android 3.2
     Type: Platform
     API level: 13
     Revision: 1
     Skins: WXGA (default)

インストールされているだけ出ます。もし何もでないときは SDK Manager.exe を実行し、インストールしてください。

今回のサンプルの場合、 Android プロジェクトできているので、アップデートします。もし Android2.2 向けに作るのであれば、上記リストにて id4 なので、

D:\android-cmake\samples\hello-gl2>android update project -p . -t 4
Updated default.properties
Updated local.properties
File build.xml is too old and needs to be updated.
Updated file D:\android-cmake\samples\hello-gl2\build.xml
Updated file D:\android-cmake\samples\hello-gl2\proguard.cfg

android コマンドの使い方はここにあります。

続いて、

D:\android-cmake\samples\hello-gl2>ant release
Buildfile: D:\android-cmake\samples\hello-gl2\build.xml
    [setup] Android SDK Tools Revision 12
    [setup] Project Target: Android 2.2
    [setup] API level: 8
    [setup]
    [setup] ------------------

省略

     [echo] Please sign D:\android-cmake\samples\hello-gl2\bin\GL2JNIActivity-unsigned.apk manually
     [echo] and run zipalign from the Android SDK tools.

release:

BUILD SUCCESSFUL
Total time: 4 seconds

apk ができました。 apk はそのままでは使えないので署名して実機にインストールします。

署名と実行

まず鍵を作ります。この鍵は使いまわすことができます。

D:\android-cmake\samples\hello-gl2>keytool -genkey -v -keyalg RSA -keystore .\keystore -alias watey -validity 36500
キーストアのパスワードを入力してください:  ←自分だけのパスワード入力、あとで使うので忘れないように。
新規パスワードを再入力してください:  ←同じものを入力
姓名を入力してください。
  [Unknown]:  family
組織単位名を入力してください。
  [Unknown]:  unknown
組織名を入力してください。
  [Unknown]:  wates
都市名または地域名を入力してください。
  [Unknown]:  tokyo
州名または地方名を入力してください。
  [Unknown]:  kanto
この単位に該当する 2 文字の国番号を入力してください。
  [Unknown]:  jp
CN=family, OU=unknown, O=wates, L=tokyo, ST=kanto, C=jp でよろしいですか?
  [no]:  yes

36,500 日間有効な 1,024 ビットの RSA の鍵ペアと自己署名型証明書 (SHA1withRSA) を
生成しています
        ディレクトリ名: CN=family, OU=unknown, O=wates, L=tokyo, ST=kanto, C=jp
 の鍵パスワードを入力してください。
        (キーストアのパスワードと同じ場合は RETURN を押してください):  ←何も入力せず ENTER
[.\keystore を格納中]

keystore ファイルに鍵が格納されています。 -alias は自分にあわせて変更してください。

そして署名します。

D:\android-cmake\samples\hello-gl2>jarsigner -verbose -keystore .\keystore bin\GL2JNIActivity-unsigned.apk watey
キーストアのパスワードを入力してください:  ←鍵生成時に入力したパスワード
   追加中: META-INF/MANIFEST.MF
   追加中: META-INF/WATEY.SF
   追加中: META-INF/WATEY.RSA
  署名中: AndroidManifest.xml
  署名中: resources.arsc
  署名中: classes.dex
  署名中: lib/armeabi-v7a/libgl2jni.so

パラメータに鍵ファイル、 apk ファイル、 鍵の alias を指定します。

出来上がったファイルは LAN から参照可能な共有ディレクトリに置き、 Android のファイラから指定したり、 Web 上に設置し、ダウンロードすることでインストールできます。

実行すると緑の三角形と背景が黒から白へ変化していく事が確認できます。

署名の自動化

default.properties ファイルに署名に必要なパラメータを記述しておく事で ant 時に署名もできます。

key.store= keystore ファイルへのパス
key.store.password=keystore ファイルのパスワード
key.alias= エイリアス名
key.alias.password= エイリアスのパスワード

おまけ

D:\android-cmake\samples\hello-gl2>mkdir vc10

D:\android-cmake\samples\hello-gl2>cd vc10

D:\android-cmake\samples\hello-gl2\vc10>cmake ..
-- Building for: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10
-- Check for working C compiler using: Visual Studio 10 -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler using: Visual Studio 10
-- Check for working CXX compiler using: Visual Studio 10 -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/android-cmake/samples/hello-gl2/vc10

D:\android-cmake\samples\hello-gl2\vc10>HelloGL2.sln

こうすることで比較的お手軽に VisualStudio で編集できます。また NMake 用 Makefile をプロジェクトに設定すると VisualStudio 上からビルドできます。ビルドスクリプトを組めば apk 作成まででき、ヘッダファイルのパスを追加することでインテリセンスも適切に動作します。

その他

この CMake のサンプルをベースに変更していくのが楽ですが、 android create project コマンドを利用すると ant 向けのプロジェクトファイル一式できあがります。あとは CMakeLists.txt を書く事で .so もバッチリできます。

CMakeLists.txt を書いておけば Makefile と .sln が楽にできます。プロジェクトの構成が変わったときは cmake しなおしてください。