Android向けモバイルアプリ監視(Kotlin)
概要
ManageEngineモバイルAPMインサイトSDK for Androidは、実際のユーザーデバイス上でのネイティブAndroidアプリケーションのパフォーマンスと安定性を監視するのに役立ちます。これにより、アプリの動作に関する実用的なインサイトが得られ、JavaとKotlinの両方のアプリケーションとのシームレスな統合がサポートされます。
SDKが監視するもの
アプリケーションの健全性とパフォーマンスに関する詳細なインサイトを得ることができます:
- アプリケーションのクラッシュ:詳細な診断情報とともに、致命的なクラッシュとそうでないクラッシュの両方を即座に検出し、分析します。
- ANR(アプリケーションが応答しない)イベント:ユーザーエクスペリエンスに影響を与えるUIのフリーズやメインスレッドのブロックを特定します。
- ネットワークリクエストのパフォーマンス:さまざまなネットワーク条件下でのAPIの応答時間、障害、レイテンシーを追跡します。
- カスタムトランザクションとログ:より深いトラブルシューティングのために、ビジネスに不可欠なイベントをキャプチャします。
- ユーザーセッションのインサイト:実際のユーザーがアプリをどのように操作しているかを理解し、セッションレベルで問題を切り分けます。
SDKで実現できること
SDKを統合すると、以下のことが可能になります:
- ビジネストランザクションの追跡:ログイン、チェックアウト、オンボーディングなどの主要なフローのパフォーマンスを測定します。
- HTTPコールの自動監視:遅いAPIやバックエンドのボトルネックを、ユーザーに影響が及ぶ前に検出します。
- リアルタイムでのクラッシュのキャプチャ:安定性の問題を積極的に特定し、より迅速に解決します。
- 画面とフラグメントの追跡:画面の読み込み時間とユーザーのナビゲーションパターンを理解します。
- 特定のユーザーのタグ付けと追跡:推測に頼ることなく、個々のユーザーの問題をデバッグします。
- 環境の分離:本番、ステージング、QA、開発ビルドを個別に監視します。
- 特定のコールや画面の除外:重要でないテレメトリを除外することで、重要なものだけに集中します。
- テレメトリデータの手動フラッシュ:必要に応じてパフォーマンスデータを即座に送信します。
前提条件
| 要件 | 最小値 |
|---|---|
| Android SDK(compileSdk) | API 21(Lollipop)以降 |
| Kotlin(該当する場合) | 1.8+ |
| AndroidX | 必須(gradle.propertiesでandroid.useAndroidX=true) |
| ManageEngine Applications Manager - モバイルアプリ監視 | 有効なAppKeyを持つアクティブな監視 |
はじめに
ManageEngine APMインサイトAndroid SDKをAndroidアプリに追加する前に、モバイルアプリ監視を作成し、Applications ManagerのWebから設定ファイル(apm_config.json)をダウンロードする必要があります。
- 新しいAndroidリソースディレクトリーをresディレクトリー内にrawという名前で作成します(存在しない場合):app/src/main/res/raw/
- ダウンロードした設定ファイルを、内容を変更したり名前を変えたりせずにrawフォルダーに配置します:app/src/main/res/raw/apm_config.json
- 自己署名サーバー証明書の追加(本番環境では非推奨):DEMコレクターが自己署名(デフォルトでバンドルされている)SSL証明書を使用している場合、安全な接続を確立するために、その証明書をAndroidプロジェクトに追加する必要があります。そのためには、DEMコレクターがインストールされているディレクトリー(/conf/sslcerts)からapm_cert.cerファイルをコピーし、同じrawフォルダーに追加します:app/src/main/res/raw/apm_cert.cer
- モバイルAPM
SDKをアプリレベルのbuild.gradle(またはbuild.gradle.kts)ファイルに追加します。
Groovy(build.gradle)
dependencies { implementation "com.manageengine.apminsight:mobileapm:3.0.0" }Kotlin DSL(build.gradle.kts)
dependencies { implementation("com.manageengine.apminsight:mobileapm:3.0.0") } - リポジトリーのURLをsettings.gradleファイルに含めます。
dependencyResolutionManagement { repositories { google() mavenCentral() maven { url = uri("https://maven.zohodl.com/") content { includeGroup("com.manageengine.apminsight") } } } }
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
SDKの設定と計測
1. SDKの初期化
/**
* ME APMインサイトエージェントを初期化します。
* @param context アプリケーションコンテキスト。
*/
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
MEAPMInsight.initMonitoring( context = this )
}
}
2. クラッシュレポートの有効化
ManageEngine APMインサイトSDKは、すべての未捕捉の例外を自動的にキャプチャします。各クラッシュレポートには、発生時刻と完全なスタックトレースが含まれており、根本原因の分析に役立ちます。
MEAPMInsight.enableErrorReporting()
3. ANR監視の有効化
Application Not Responding(ANR)イベント、つまりメイン(UI)スレッドが長時間ブロックされ、Androidがユーザーに「アプリが応答していません」というダイアログを表示する状況を検出します。ANR監視は、initMonitoring()の後に以下のAPIを使用して有効にする必要があります。
// デフォルトのタイムアウト(5秒)
MEAPMInsight.startANRWatching()
// カスタムタイムアウト// メインスレッドが3秒以上ブロックされた場合にANRをレポート
MEAPMInsight.startANRWatching(3000)
// ANR監視の停止
MEAPMInsight.stopANRWatching()
}
4. フラグメント追跡の有効化
オプション1:グローバルに有効化
MEAPMInsight.enableFragmentSupport()
オプション2:特定のアクティビティでのみ有効化
フラグメント追跡を特定のアクティビティでのみ有効にしたい場合は、それらのアクティビティ内でライフサイクルコールバックを手動で登録します:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager.registerFragmentLifecycleCallbacks(
MEAPMInsightFragmentLifecycleCallbacks(),
true
)
}
5. 環境の設定
以下のAPIを使用して、開発、デバッグ、本番、リリースなどのさまざまな環境設定にわたるデータをフィルタリングするためのカスタム環境詳細を設定できます。
/**
*@param {String} environment
デバッグ、リリース、ベータリリースなどのカスタム環境タイプ。
*/
MEAPMInsight.setEnvironment("release")
6. カスタムユーザーIDの設定
テレメトリを特定のユーザーに関連付けます。SDKは、ユーザーIDを保存または送信する前に自動的にハッシュ化(SHA-256)します。デフォルトでは、SDKによって一意のユーザーIDが生成されます。ユーザーIDをカスタマイズしたい場合は、以下の構文を実装することで可能です。これは、特定のユーザーに固有のメトリクスを追跡したり、問題をデバッグしたりする場合に便利です。
/**
*@param {String} userId
*/
MEAPMInsight.setUserId("user_12345")
7. HTTPコール追跡
SDKは、追加の設定なしで、以下のライブラリを通じて実行されるネットワークリクエストを自動的に監視します:
java.net.HttpURLConnectionjavax.net.ssl.HttpsURLConnectionOkHttp(SDKインターセプターが追加された場合)val client = OkHttpClient.Builder() .addNetworkInterceptor(MEAPMInsightInterceptor()) .build()
アプリケーションがカスタムのネットワークレイヤーや自動的に監視されないライブラリを使用している場合は、以下のAPIを使用してHTTPコールを手動で追跡できます:
/**
* @param {String} url
* 完全なリクエストURL。
*
* @param {String} requestMethod
* 使用されたHTTPメソッド(例:GET、POST、PUT、DELETE)。
*
* @param {long} startTime
* ミリ秒単位のリクエスト開始時刻。
* System.currentTimeMillis()を使用して取得できます。
*
* @param {long} loadTime
* リクエストの完了にかかった合計時間(ミリ秒単位)。
*
* @param {int} responseCode
* サーバーから返されたHTTP応答ステータスコード。
*
* @param {String} screen
* HTTPコールが開始された画面の名前。
*/
Apm.addHttpCalls(
"https://www.example.com",
"GET",
System.currentTimeMillis(),
526,
200,
"PaymentScreen"
);
8. 画面追跡
デフォルトでは、SDKはすべての画面(Activity)を自動的にキャプチャします。画面が自動的に検出されない場合は、以下のAPIを使用して手動で追跡できます:
/**
*@param {String} screenName
*@param {String} orientation
*@param {long} loadTime 読み込み時間(ミリ秒単位)
*@param {long} startTime 開始時刻(ミリ秒単位)
*/
Apm.addScreen("DetailScreen", "portrait", 50, 1642743078700)
ビジネスレベルの監視
1. トランザクション
長時間実行される操作の前にApm.startTransaction("トランザクション名")を使用してトランザクションを開始し、操作が完了したらstop()を呼び出します。
トランザクションは以下の特徴を持ちます:
- スレッドセーフ:異なるスレッド間で開始および停止できます。
- 単一使用:各トランザクションインスタンスは一度だけ開始および停止できます。
- 名前による平均化:同じ名前のトランザクションはグループ化されます。
同じ操作が同じトランザクション名で複数回実行される場合、SDKはそれらの発生にわたる平均実行時間を記録します。
ビジネス操作を正確に追跡するために、明確で一貫した名前を使用してください。
val transaction = Apm.startTransaction("List Articles")
// 事前定義されたHTTPコンポーネントを開始
val httpComponent = transaction.startComponent(Component.TYPE_HTTP)
// カスタムコンポーネントを開始
val articlesComponent = transaction.startComponent("Download Articles")
// 記事をダウンロード
transaction.stopComponent(articlesComponent)
for (article in articles) {
val thumbnailComponent = transaction.startComponent("Download Thumbnail")
// サムネイルをダウンロード
transaction.stopComponent(thumbnailComponent)
}
// HTTPコンポーネントを停止
transaction.stopComponent(httpComponent)
// トランザクションを停止
Apm.stopTransaction(transaction)
高度な制御
1. データのフラッシュ
以下のAPIを使用して、記録されたテレメトリデータを次回のスケジュールされたアップロードサイクルを待たずに、すぐにサーバーにアップロードします。デフォルトでは、SDKは60秒間隔でデータをアップロードします。
MEAPMInsight.flush()
2. HTTPコールの除外
特定のURLを追跡から除外するには、それらのURLのリストを以下のAPIに渡します。
MEAPMInsightexcludeHttpCalls(listOf("example.com", "test.com"))
3. 画面の除外
カスタム画面を追跡から除外するには、画面名のリストを以下のAPIに渡します。
MEAPMInsight.excludeScreens(listOf("customScreenName"))
4. 監視の停止
以下のAPIを使用して、すべてのデータ収集(画面、HTTPコール、トランザクション、クラッシュ、ANR検出)を停止します。
MEAPMInsight.stopMonitoring()
5. 機密データのマスキング
SDKは、既知の機密クエリパラメーターとヘッダーの値を自動的にマスクし、サーバーにデータが送信される前に*****に置き換えます。以下のキーは自動的にマスクされます:
- apikey, api_key, apitoken, api_token
- authorization, auth, token, access_token, refresh_token, auth_token, secret, client_secret
- username, user, email, password, passwd, pass
- sessionid, session_id, session_token
カスタムの機密キーを追加するには、以下のAPIを使用します:
MEAPMInsight.addSensitiveParams(listOf("x-custom-token", "account_id", "ssn"))
6. ProGuard / R8ルール
コードの難読化を使用する場合は、以下のルールをproguard-rules.proファイルに追加してください:
-keep class manageengine.mobileapm.android.apm.** { *; }
-dontwarn manageengine.mobileapm.android.apm.**