2012年7月29日日曜日

Android に関する備忘録集

はじめに

ここに書いてあることは、夢です。目が覚めたら、全て忘れてしまうことでしょう。

動作環境

  • Windows Vista Business 64bit SP2
  • AMD Phenom II X4 955 3.2GHz
  • Tegra Android Developer Pack 1.0r8
    • Android SDK r18
    • Android NDK r8
    • JDK 6u24
    • Cygwin 1.7
    • Eclipse 3.7.1
    • CDT 8.0.0
    • ADT 15.0.0
    • Apache Ant 1.8.2
    • NVIDIA Debug Manager for Eclipse 12.0.0
    • Tegra Sample Code
「Tegra Android Developer Pack 1.0r8」のインストールは、”E:\appli\NVPACK”に行っている。


Standalone Toolchain

要は、configure や make を使って、Android 用にビルドを行うためのツール群。
以下のように、適当なディレクトリ(ここでは、「/tmp/my-android-toolchain」ディレクトリ)に Toolchain コマンド群をインストール。--platform に指定するバージョンは、適宜変更すること。
${NDKROOT}/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=/tmp/my-android-toolchain

configure や make 用の設定。面倒なので、「.bashrc」で設定するようにした。
export SYSROOT=${NDKROOT}/platforms/android-14/arch-arm
export PATH=/tmp/my-android-toolchain/bin:${NDKROOT}:${PATH}

ビルド

ビルド時に、よく利用する設定。ビルド対象によって、指定内容が変わるので、試行錯誤が必要。

configure

CFLAGS='-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon'
LDFLAGS='-Wl,--fix-cortex-a8'

CC=arm-linux-androideabi-gcc
LD=arm-linux-androideabi-ld

./configure --host=arm-linux-androideabi --cross-prefix=arm-linux-androideabi-
「-mfpu=neon」は、Tegra3 などの NEON に対応した CPU の場合に指定する。(Tegra2 は未対応なので注意)
configure で、「--cross-prefix」が、指定できる場合、「CC」や「LD」などの指定が、不要となる。

トラブルその1

configure を実行すると
$ ./configure --host=arm-linux-androideabi
configure: WARNING: if you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used
checking build system type... i686-pc-cygwin
checking host system type... Invalid configuration `arm-linux-androideabi': system `androideabi' not recognized
configure: error: /bin/sh ./config.sub arm-linux-androideabi failed
となる場合がある、詳細は、まったく承知していないが、以下のファイルが古いため、Android 用のクロスコンパイルに対応していないことが、原因のようだ。
「config.guess」
「config.sub」

「config.sub」ファイルの中身を見てみると、7行目に「timestamp='2009-11-20'」とかあった。確かに古い。
これらのファイルを、Android 用クロスコンパイルに対応したものに、差し替えると大丈夫なようだ。
こうしてみる。えぃ!
$ autoreconf -if
再びファイルを確認したら、「timestamp='2012-01-01'」となっていた。

あ、でも、当てずっぽうでやってるので、鵜呑みにしないように。

Cygwin

ホームディレクトリに「.bash_profile」および「.bashrc」ファイルを作成。改行は、unix 形式(LF)にすること。

【~/.bash_profile】

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

【~/.bashrc】

# global setting
if [ -f /etc/bashrc ]; then
  . /etc/bashrc
fi

# User specific setting

export ANDROID_NDK_ROOT=`/usr/bin/cygpath ${ANDROID_NDK_ROOT}`
export NDKROOT=`/usr/bin/cygpath ${NDKROOT}`

export SYSROOT=${NDKROOT}/platforms/android-14/arch-arm
export PATH=/tmp/my-android-toolchain/bin:${NDKROOT}:${PATH}

ndk-gdb

起動方法

ndk-gdb を PATH に追加
$ export PATH=/cygdrive/e/appli/NVPACK/android-ndk-r8/:$PATH

デバック対象のプロジェクトにカレントディレクトリを移動
$ cd /cygdrive/e/work/Repositories/git/helloCollada/helloCollada/

ndk-gdb を起動
$ ndk-gdb --start

トラブルその1

ndk-gdb が、以下のように起動できない場合。
awk: 致命的: ソースファイル `/cygdrive/e/work/Repositories/git/helloCollada/helloCollada/E:\appli\NVPACK\android-ndk-r8/b
uild/awk/check-awk.awk' を読み込み用に開けません (No such file or directory)
ERROR: Could not run '/usr/bin/awk' command. Do you have it installed properly?
Cygwin 上で、ndk-gdb を起動するときには、以下のように環境変数を上書きする。以下の環境変数は、「Tegra Android Developer Pack」のインストール時に自動的に設定されるものだが、Windows 形式の PATH となっている。これを、Cygwin 形式の PATH に設定し直す。
$ export ANDROID_NDK_ROOT=`/usr/bin/cygpath ${ANDROID_NDK_ROOT}`

トラブルその2

ndk-gdb  --start で起動した後、so ファイルが読み込めない場合。
Error while mapping shared library sections:
libxxxx.so: No such file or directory.
その他多くの so ファイルも同様

libc.so および対象プロジェクトの so ファイルは、読み込まれないと困る。(それ以外は、読み込めなくて、問題ない)
読み込まれる定義をするファイルが、対象プロジェクトの「obj/local/armeabi[-v7a]」ディレクトリにある、「gdb.setup」ファイルとなる。これを開いて、1行目にある記述が so ファイルを読み込むディレクトリ指定。
set solib-search-path ・・・・
ただし、このファイルは、ndk-gdb 起動時に毎回自動生成されるので、これを修正してもだめ。
元となるファイルは、ビルド(ndk-build)時に作成される「libs/armeabi[-v7a]」ディレクトリの「gdb.setup」ファイル。
しかし、問題は、ディレクトリの設定ではなく、改行コード(CRとLF)が、混在していることだった。
元凶は、「gdb.setup」ファイルを生成するときに、echo コマンドを使っているのだが、Standalone Toolchain の echo を使っているらしく、こいつが悪さをするようだ。
したがって、Cygwin の echo を使うように、ビルド時のオプションに「HOST_ECHO=echo」を追加した。
${CYGWIN_HOME}/bin/bash ${NDKROOT}/ndk-build HOST_ECHO=echo NDK_DEBUG=1 V=1
これで、LF 改行のみのファイルとなった。

ndk-gdb  --start で、起動したあと、(相変わらず、「libxxxx.so: No such file or directory.」が、たくさん表示されるが・・・)
(gdb) info share
とすると、libc.so と対象プロジェクトの so ファイルの「Syms Read」項目が、「Yes」になっていることで、シンボルの読み込みに、成功したことを確認できる。