本サイトでは、アフィリエイト広告およびGoogleアドセンスを利用しています。

Android の .so ネイティブデバッグ (2020Late)

Android で .so によるライブラリを作成して、それを Java, Kotlin, Unity (Mono) などから使うという場面もあると思います。このとき、 so の作成者と利用者が異なる場合、so の作成プロジェクトと利用プロジェクトが異なる場合がよくあります。

Android Studio を用いて 1つのプロジェクトで .so を作成して使うまでが完結している場合、 スムーズに .so のデバッグができるようになっています。そんな場面ばかりではないので、同一PC で so は生成しているが、プロジェクトは別という状況を想定してデバッグの手順を構築してみます。

以前は eclipse とプラグインを用いて、ネイティブデバッグの環境構築をしたものです。 Android Studio を用いて1つのプロジェクトで閉じていれば簡単にデバッグもできるようになっている現在、便利に整ってきたなぁと思うところがあります。

ネイティブライブラリ (.so) の準備

デバッグするにあたり、ネイティブライブラリ (.so) にデバッグのシンボルを含めるようにしておくことが必要です。

  • Android Studio なら デバッグビルドを選択
    • このときデバッグ用の so は次のフォルダに出力されている模様
    • build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a など
  • Visual Studio を用いている場合なら “デバッガーシンボル情報のパッケージ化 : Yes” となるようにしておく
    • プラグインのバージョンによっては不要かも?
  • デバッグのために最適化は OFF にしておく
  • makefile などで生成させている場合、デバッグ用の情報が付くようにしておきます
    • “-g” オプションや “-O0” など

Android Studio の設定 / デバッグ

Android Studio でネイティブデバッグをする際には、デバッグ構成の設定を変更します。

  • Debug Type には “Native Only” を指定
  • Symbol Directories にはデバッグシンボルを持つ so を配置してある場所

起動済みのアプリに対して、 デバッガーをアタッチすることでネイティブライブラリを呼び出したときにブレークポイントを設定できるようになります。

Android Studio なしのデバッグ (Ubuntu にて)

Android Studio を使わずにシンプルな環境でのデバッグにトライしてみました。

  • Ubuntu 18.04 (ちょっと古めです)
    • Android SDK の他、NDK と lldb をインストール済み
    • Android Studio はインストールしていない
  • Android 側には lldb_server を配置済み

Android 側で lldb_server を動かした後で、 Ubuntu 側で lldb を起動し、以下のコマンドを実行します。

$ lldb
(lldb) platform select remote-android
(lldb) platform connect connect://localhost:1234

lldb server で起動したポート番号と合わせるようにしてください。
繋がらないようならば、 adb でポート転送の指定も必要になるかもしれません。

続いて Android 側で対象アプリケーションを起動し、そのプロセス番号を調べてアタッチします。

(lldb) attach (プロセス番号)

うまくアタッチできると次の画面で示すように一旦停止するようです。実行の再開には “c” コマンドです。この例では Unity を用いたアプリで試したためか、動作停止まで少々時間を要しました。

今回 USB 接続の adb が繋がっている状態でいずれも確認しています。 ネットワーク接続状態の端末で、同様のことができるかは未確認です。

所感など

lldb の簡単な使い方としては次のページがちょうど良さそうです。

  • https://qiita.com/edo_m18/items/9b6be35907433e1c743e

理想としては Android Studio を使わず、VSCode で LLDB を使ってのデバッグ環境ができればよかったのですが、うまく動作させることが叶わずでした(現時点においては)。LLDB で繋がってさえしまえば、とりあえずソースコードレベルのデバッグやアセンブラの確認など調査できることが増えるので、ネイティブコードのデバッグには役立つのではないでしょうか。

Androidプログラミング
すらりんをフォローする
すらりん日記
タイトルとURLをコピーしました