モバイルアプリケーションのプロフェッショナルなデバッグと診断は、コード内のエラーを発見して修正するためのモバイル開発に不可欠なスキルです。JetBrains Developer Ecosystem(2024)によると、開発者は作業時間の最大30%をコードのデバッグに費やしています。IT Sectrは、デバッグツールを適切に使用することでバグ発見時間を40%削減する独自の診断プラクティスを開発しました。
重要ポイント
モバイルアプリケーションは、DebugとReleaseの2つの主要な構成でビルドされます。Debugビルドにはデバッグシンボルが含まれ、コードの最適化は行われず、一時的な署名が使用されます。これにより、ブレークポイントの設定、変数の検査、コードのステップ実行が可能になります。
モバイル開発におけるReleaseビルドは、App StoreとGoogle Play向けの最終バージョンです。Releaseはコードを最適化し、不要なシンボルとログを削除し、プロダクション証明書でアプリに署名します。Releaseでのデバッグは不可能です。バグがReleaseでのみ再現する場合は、Crashlyticsなどのクラッシュレポーターが必要です。
モバイルアプリの正しい戦略:開発にはDebug、公開前のテストにはRelease。IT Sectrは、リリースの2〜3日前にテストデバイスでReleaseビルドを実行し、Debugモードでは現れない問題(コードの難読化やProGuard/R8エラーなど)を特定することを推奨します。
Debuggable=falseは、AndroidManifestでのReleaseに必須の設定です。iOSのDebugとReleaseは、Xcodeのビルドスキームによって異なります。DebugにはDebug実行可能ファイルが含まれ、Releaseには含まれません。iOSにはTestFlight(クラッシュレポート付き)とApp Storeの構成もあります。
Android Studioは、Androidプラットフォーム上のモバイルアプリケーションをデバッグおよび診断するための完全なツールセットを提供します。LogcatはAndroidシステムログコンソールであり、ログを表示するための主要ツールで、レベル(Verbose、Debug、Info、Warn、Error)、プロセス、タグでフィルタリングできます。
Logcatは、デバイスまたはエミュレーター上のすべてのプロセスのログを表示します。各ログには優先度レベル、タグ、メッセージがあります。デバッグメッセージにはLog.d(TAG、message)、エラーにはLog.eを使用します。タグによるフィルタリングは、数千のシステムメッセージの中から自分のログを見つける最良の方法です。
Androidでのモバイル開発におけるログ出力の例:
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate started");
try {
initComponents();
Log.i(TAG, "Components initialized successfully");
} catch (Exception e) {
Log.e(TAG, "Failed to init components", e);
}
}
Layout Inspector — Android用のビジュアルUIデバッガー。View階層、各要素の属性、画面上の位置を表示します。実行中のアプリケーションでレイアウトパラメータ、パディング、マージン、表示設定、テキストサイズを確認できます。
Database Inspector — Android Studio内で直接SQLiteデータベースを表示・編集できます。すべてのテーブルの内容を表示し、SQLクエリの実行とリアルタイムでのデータ変更が可能です。RoomクエリとContentProviderのデバッグに不可欠なツールです。
Network Inspector — アプリケーションのすべてのHTTPリクエストを追跡し、URL、ヘッダー、リクエストとレスポンスの本文、実行時間、ステータスコードを表示します。REST APIのデバッグ、シリアル化の正確性の確認、低速リクエストの検出に役立ちます。
Androidでのモバイルアプリケーションの包括的なデバッグと診断には、リストされたすべてのツールの習熟が必要です。Android Studioは、これらを単一のIDEにまとめて効率を高めます。
Xcodeは、iOS上のモバイルアプリケーションをデバッグおよび診断するための同様のツールセットを提供します。ConsoleはiOS版のLogcatに相当し、カテゴリとレベル(OSLogType)でグループ化されたシステムおよびアプリケーションのログを表示します。
Memory Graph Debuggerは、retain cyclesとメモリリークを検出するためのビジュアルツールで、メモリ内のすべてのオブジェクトとその参照を示すグラフを表示します。赤いノードはリーク(解放されるべきだがまだメモリに残っているオブジェクト)を示します。
Memory Graphの使用方法:アプリを実行し、XcodeでDebug Memory Graphボタンをクリックし、オブジェクトを選択してその受信参照を検査します。Retain cycleは循環依存として表示されます。オブジェクトAがオブジェクトBを保持し、オブジェクトBがオブジェクトAを保持している状態です。解決策は、クロージャでweak参照またはunowned参照を使用することです。
View Hierarchy DebuggerはiOS版のLayout Inspectorに相当し、階層、制約、属性を含む画面上のすべてのUIViewの3D視覚化を表示します。任意の要素を選択して、その位置、色、サイズ、レイアウト制約を確認できます。
Heap Dumpはアプリケーション全体のメモリのスナップショットであり、その分析により解放されていないオブジェクトを発見し、各クラスのメモリ使用量を推定できます。Xcodeでは、Heap DumpはDebug NavigatorのMemory Reportから利用できます。
LLDBは、C、Objective-C、Swiftアプリケーション用の低レベルデバッガで、ブレークポイント、ウォッチポイント、アセンブリダンプ、動的な変数変更をサポートします。LLDBのpo(print object)コマンドは、メモリ内の任意のオブジェクトの説明を出力します。
Watchpointは変数の値が変更されたときにトリガーされるブレークポイントで、誰がいつオブジェクトフィールドの値を変更するかを追跡するのに役立ちます。特定の行で発動するブレークポイントとは異なり、ウォッチポイントはメモリの変更時に発動します。
iOSでのプロフェッショナルなデバッグと診断には、Xcodeの経験とメモリ管理の理解が必要です。Appleは各デバッグツールの完全なドキュメントを提供しています。
プロキシツールは、モバイルアプリケーションのネットワーク問題を診断するために不可欠です。Charles Proxyはモバイル開発で最も人気のあるHTTPプロキシで、アプリとサーバー間のリクエストをインターセプト、表示、変更できます。
Charles Proxyは中間者として機能します。デバイスをCharlesのプロキシ(通常はコンピューターのIP、ポート8888)として構成します。CharlesはすべてのHTTPおよびHTTPSリクエストを表示し、ヘッダー、本文、Cookie、実行時間を確認できます。SSL Proxyingにより、分析のためにHTTPSトラフィックを復号化できます。
Charlesの機能:Breakpoints(編集のためのリクエスト一時停止)、Rewrite(自動リクエスト変更)、Map Local(ローカルファイルによるレスポンス置換)。Map Localは実際のAPIなしでのテストに不可欠で、サーバーレスポンスの代わりに事前準備したJSONを返します。
Proxymanは、よりクリーンなインターフェース、優れたM1/M2サポート、プライバシー保護を備えたmacOS向けのCharlesの現代的代替品です。インターセプト、SSLプロキシ、リクエスト編集、自動トラフィック変更のスクリプトなど、同じ機能をサポートします。
Wiresharkは、深いネットワーク診断のためのプロフェッショナルなトラフィックアナライザーで、すべてのOSI層(TCP、DNS、TLSハンドシェイク、ICMP)を分析します。低速接続、DNS問題、低レベルのネットワークエラーの診断に使用されます。
StethoはFacebookによるライブラリで、Chromeブラウザを介してAndroidアプリをデバッグし、Chrome DevTools経由でデータベース、ネットワークリクエスト、View Hierarchy、Shared Preferencesを表示できます。FlipperはStethoの後継で、iOSサポートとプラグインアーキテクチャを備えています。
APIクライアントは、アプリ自体を実行せずにモバイルアプリケーションのバックエンドをデバッグおよび診断するために使用されます。Postmanは、コレクション、テスト、自動化を備えた最も人気のあるAPIクライアントで、GET、POST、PUT、DELETEリクエストの送信、ヘッダー、Cookie、環境変数の管理ができます。
Insomniaは、より高速なインターフェース、組み込みのGraphQLサポート、優れたコレクション管理を備えたPostmanの軽量なオープンソース代替品です。プラグイン(テーマ、エクスポート、さまざまな言語でのコード生成)をサポートします。
Httpieは、読みやすい出力を持つコマンドラインHTTPクライアントで、ターミナルにカラー化されたJSONレスポンス、ヘッダー、ステータスを直接表示します。GUIアプリケーションを開かずに迅速なAPIチェックに適しています。
Httpieの使用例:
http POST https://api.example.com/v1/users \
"Authorization: Bearer token123" \
name="John" email="john@example.com"
IT Sectrは、API分析およびドキュメント作成用のPostmanと迅速なチェック用のHttpieの組み合わせを推奨します。SwaggerまたはOpenAPI仕様からPostmanコレクションをインポートすると、テストするエンドポイントがサーバーのドキュメントと一致することが保証されます。
| ツール | プラットフォーム | デバッグタイプ | 無料 | 最適な用途 |
|---|---|---|---|---|
| Logcat | Android | ロギング | + | アプリおよびシステムログの表示 |
| Layout Inspector | Android | UI/View | + | View階層と属性の確認 |
| Memory Graph | iOS | メモリ | + | メモリリーク診断 |
| View Hierarchy | iOS | UI/View | + | UIViewの3D可視化 |
| Charles Proxy | iOS/Android | ネットワーク | 30日間トライアル | HTTP/HTTPSトラフィックのインターセプト |
| Proxyman | iOS/Android | ネットワーク | +(制限付き) | macOS用モダンHTTPプロキシ |
| Wireshark | 全プラットフォーム | ネットワーク(詳細) | + | 全OSI層の分析 |
| Postman | 全プラットフォーム | API | + | REST/GraphQL APIテスト |
| Insomnia | 全プラットフォーム | API | + | GraphQL対応のPostman代替 |
| LLDB | iOS/macOS | 低レベル | + | ステップデバッグ、アセンブリ |
よくある質問
Debugビルドにはデバッグシンボルが含まれ、コードは最適化されず、一時的な署名が使用されます。Releaseビルドはコードを最適化し、ログを削除し、難読化し、プロダクション証明書で署名します。DebugはUSBまたはエミュレーターでインストールされ、ReleaseはApp StoreまたはGoogle Playを介してインストールされます。
Android StudioのMemory Profilerを使用します。割り当ておよび解放されたオブジェクトとGCイベントが表示されます。Heap Dumpを取得し、解放されていないオブジェクトを分析します。finish()後もメモリに残っているActivityとFragmentのインスタンスを探します。LeakCanaryを使用すると、ライブラリが自動的にリークを検出します。
コンピューター:CharlesでSSL Proxyingを有効にします(Proxy → SSL Proxying Settings)。デバイス:Charles CA証明書(chls.pro/ssl)をインストールし、設定で信頼します。iOS 13+では、General → About → Certificate Trust Settingsで証明書の信頼を有効にします。Android 7+では、network_security_config.xmlの設定が必要です。
ブレークポイントは特定のコード行で実行を停止します。ウォッチポイントは変数の値が変更されたときに実行を停止します。ブレークポイントは行に到達するたびに発動し、ウォッチポイントは追跡対象のメモリへの変更時に発動します。ウォッチポイントは予期しないフィールド変更を見つけるのに役立ちます。
Apollo DevTools(ブラウザ拡張機能)またはGraphQL対応のInsomniaを使用します。CharlesとProxymanはGraphQLリクエストを通常のHTTP POSTとしてインターセプトし、クエリ、変数、レスポンスを表示できます。詳細なデバッグには、Apollo Client Developer Toolsを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。