Android NDKのデバッグは容易になった・・・はずなのに
Androidアプリは基本的にSDKを利用し、Java言語で記述します。ですが、Android NDKを利用することでC/C++言語でもアプリを記述できるのは周知のとおりです。
最初は「できるやつだけついてこい」的にほとんど整備されていなかったNDKの開発環境ですが、最近ではEclipseとの連携が可能になり、更にはコマンドラインベースだったデバッグもEclipseを使ってGUI上でできるようになっています。
- Add Native Supportを設定する
- Debug As -> Native Application
- エディタ上でブレークポイントを設定
- あとはステップ実行なり変数のウォッチなりが簡単にできる
そのおかげで、あんどろいどたん(Google Play)を始めとして最近の案件はAndroid NDKを多く利用していたわけですが、唐突に次のようなコンソールに出力されるようになり、デバッガが接続できなくなりました。
[2013-03-17 21:36:50 - アプリ名] Unknown Application ABI: [2013-03-17 21:36:50 - アプリ名] [2013-03-17 21:36:50 - アプリ名] Unable to detect application ABI's
対症療法
しばらくの間は「アルェ〜、ナンデナンデ!?」状態で仕方なくprintfデバッグをしてたわけですが、次の条件でデバッガが接続できることがわかりました。
無駄だったこと
効果的だったこと
ですが、boost等の重いライブラリを利用していると、clean起動する度にインデクサーがガリガリと幾千のファイルをチェックしてしまうため、ストレスがマッハです。
デバッガが接続できるアプリ・できないアプリがあった
つい最近わかったことは、同一のEclipse環境・端末環境でもデバッグできるあぷり・できないアプリがあるということです。
チェックしてみると、比較的規模の大きな案件でビルドしたアプリは接続できず、小さいアプリは接続できるということでした。
原因
いろいろ調べた結果、(今のところ)理由は次の一点でした。
- Android.mk/Application.mkで自分で作ったファイル(共通のmkファイル等)をincludeするとデバッガが接続できない
- どちらか(もしくは両方)にincludeがあるとエラーが発生する
- include先に書いてある内容をコピペして、includeしないようにすればおk
# ダメなApplication.mk APP_MODULES := sample include shared_application.mk ------ # shared_application.mkの中身 APP_STL:=gnustl_static APP_ABI := armeabi-v7a
# 問題ないApplication.mk APP_MODULES := sample # コピペして持ってくれば大丈夫 APP_STL:=gnustl_static APP_ABI := armeabi-v7a
反省
「本来includeは使わねーよwwww」とか、私が知らないだけでmakefileのルールに則ってないのかもしれませんが、共通部分をどっかにまとめとこう的なことはしばらく考えないほうがよさそうです。