2009年09月05日

Android NDKのデバッグ手法

前回のエントリー

●高度なデバッグ方法
組み込みプレスVol.16によくまとまっておりますので、こちらを参考にしてください。

を、Android NDK&Windows向けに解説してくれ、との要望がありましたので、作ってみました。
詳細は、上記の組み込みプレスVol.16を確認していただくとして、その差分を掲載させていただきます。
(とは言っても、このエントリーだけも構築はできると思いますが、何をやっているかの詳細は本書をご確認ください。。)



●Android.mkで実行ファイルを作る
まず、デバッグするために実行ファイルを作らなくてはなりません。
sharedライブラリのままでは、実行出来ませんからね。

Android上で実行可能なファイルは、Android.mkで作成可能です。
具体的には、main関数を作成の上、Android.mk内を下記のように変更するだけです。

include $(BUILD_SHARED_LIBRARY) ⇒ include $(BUILD_EXECUTABLE)



●Eclipse CDTを準備する
Eclipse CDTから、ダウンロードしてください。
Androidの開発用Eclipse に、追加インストールしても問題ありませんが、プラグインを増やすとどんどんとEclipseが重くなっていきますので、別に用意するのも手です。




●Cygwinの準備を整える
Android NDKがインストール済みであれば、下記の作業をするだけです。

・C:\cygwin\bin\cygwin1.dll を C:\Windows\System32 にコピーする
・C:\cygwin\binを、Windows の環境変数 PATH に含める




●Default Launcherを設定する
下記の通りにメニューを追って、変更してください。

Window
Preferences
Run/Debug
Launching
Default Lanchers
内の

C/C++ Application [Debug]
Preferred Launcher
を、

Standard Create Process Launcher

にする




●コンパイル用スクリプトを設定する
・「build.bat」を作成する
ただたんに、makeしただけでは、Android NDKをコンパイルすることは出来ません。Android NDKディレクトリに移動した上で、makeする必要があります。
そこで、それを行うスクリプトを作成します。
今回は、「build.bat」という名前で作成します。

set PROG=%1

cd [Android NDKへのpath]

make APP=%PROG%




・「build.bat」をEclipseに設定する
下記の通りにメニューを追って、変更してください。

Project
Properties
C/C++ Build
内の

Builder Settingsタブ
Build command

に独自バッチファイル「build.bat」を指定する。



「build.bat」は、引数として、Android.mkのモジュール名を要求しますので、それを指定します。

Behaviourタブ

Build on resource save(Auto Build)
Build(Incremental build)

に、Android.mkのモジュール名を入力する。
※ここでは、「ecTest」としてあります。



●Android NDK用のIncludeファイルがあるディレクトリを指定する
要は、bionicのIncludeファイルを指定します。

Project
Properties
C/C++ General
Paths and Symbols
内の

Includes
に、Android NDK用のIncludeファイルがあるディレクトリを「それぞれ」指定します。
android-ndk-x.x\build\platforms\android-1.5\arch-arm\usr\include
android-ndk-x.x\build\platforms\android-1.5\common\include

を追加。

Add to all configurations
Add to all languages
Is a workspace path
は、必要に応じてチェックします。
意味がわからないなら、付けてしまいましょう。




●実行用スクリプトを設定する
・「launch.bat」を作成する
Android NDKで作成した実行ファイルをAndroidエミュレータや実機で動作させるには、ちょっとした仕掛けが必要です。
そこで、実行用のスクリプトを作成します。

set PROG=%1

cd [Android NDKへのpath]

adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb shell /data/%PROG% "$@"
※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。


・「launch.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。

Run
External Tools
External Tools Configurations

選択します。

Program
に新規追加します。

独自スクリプト「launch.bat」を追加します。

Arguments

に、Android.mkのモジュール名を入力します。



●デバッグ用スクリプトを設定する
・「prepare.bat」を作成する
デバッグを行うには、gdbserver を起動する必要があります。
そこで、それを自動的に行うためのスクリプトを作成します。

set PROG=%1

cd [Android NDKへのpath]
adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb forward tcp:5039 tcp:5039
adb shell gdbserver tcp:5039 /data/%PROG% "$@"
※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ 5039ポートは、待ち受けポートとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。




・「prepare.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。

Run
External Tools
External Tools Configurations

選択します。

Program
に新規追加します。

独自スクリプト「prepare.bat」を追加します。

Arguments

に、Android.mkのモジュール名を入力します。



●gdbserverを設定する
Eclipseが利用するデバッガとして、gdbserverを利用するための設定を行います。
タブが何個かネストしておりますので、わかりにくいかもしれませんが、がんばって設定してください。




・mainの設定

Run
Run Configurations

を選択します。

C/C++ Application
に新規追加します。

Mainタブ

C/C++ Application
に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm\[Android NDKモジュール名]」を追加します。




・Debuggerの設定

Debuggerタブ

Debugger
の設定を

gdbserver Debugger
に変更します。
Dubugger Options
の GDB debugger
に「[Android NDKへのpath]\build\prebuilt\windows\arm-eabi-4.2.1\bin\arm-eabi-gdb.exe」を追加します。




・Shared Librariesの設定

Shared Librariesタブ

に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm」を追加します。




・Connectionの設定

Connectionタブ

Type
の設定を
TCP
に変更します。

Port number
の設定を 5039
に変更します。




●デバッグ用スクリプトをEcliseで実行可能なように設定する
いままで作ってきた各種実行用スクリプトをEclipseから実行出来るようにします。




・Eclipseのスクリプト設定画面を開く


Run

Run Configurations

選択します。



Launch Group

に、後述する2つのモノを新規追加します。



・実行用Launch Groupを登録する

[Eclipse用実行用スクリプト] mode:run
を新規追加します。



・デバッグ用Launch Groupを登録する

[Eclipse用デバッグ用スクリプト] mode:run
[Eclipse用GDB設定] mode:debug
を新規追加します。





●起動
これで、あとは、Androidのエミュレータなり、実機なりを起動して、実行すればOKです。
下記のように、main関数で停止した状態で起動します。


Creative Commons License
This weblog is licensed under a Creative Commons License.