Androidモバイルアプリ監視(Java)
概要
ManageEngine Android用モバイルAPMインサイトSDKは、実際のユーザーデバイス上でのネイティブAndroidアプリケーションのパフォーマンスと安定性を監視するのに役立ちます。アプリケーションの振る舞いに関する実用的なインサイトを提供し、JavaとKotlinの両方のアプリケーションとのシームレスな統合をサポートします。
SDKが監視するもの
アプリケーションの正常性とパフォーマンスに関する詳細なインサイトを取得します。
- アプリケーションのクラッシュ:致命的および非致命的なクラッシュの両方を、詳細な診断情報とともに即座に検出し分析します。
- ANR(アプリケーションが応答しない)イベント:ユーザーエクスペリエンスに影響を与えるUIのフリーズやメインスレッドのブロックを特定します。
- ネットワークリクエストのパフォーマンス:さまざまなネットワーク条件下でのAPIの応答時間、失敗、レイテンシーを追跡します。
- カスタムトランザクションとログ:より深いトラブルシューティングのために、ビジネスに不可欠なイベントをキャプチャーします。
- ユーザーセッションのインサイト:実際のユーザーがアプリをどのように操作しているかを理解し、セッションレベルで問題を特定します。
SDKで実現できること
SDKを統合すると、次のことが可能になります。
- ビジネストランザクションの追跡:ログイン、チェックアウト、オンボーディングなどの主要なフローのパフォーマンスを測定します。
- HTTPコールの自動監視:ユーザーに影響が及ぶ前に、遅いAPIやバックエンドのボトルネックを検出します。
- リアルタイムでのクラッシュのキャプチャー:安定性の問題を積極的に特定し、より迅速に解決します。
- 画面とフラグメントの追跡:画面の読み込み時間とユーザーのナビゲーションパターンを理解します。
- 特定ユーザーのタグ付けと追跡:推測に頼らずに、個々のユーザーの問題をデバッグします。
- 環境の分離:本番、ステージング、QA、開発ビルドを個別に監視します。
- 特定のコールや画面の除外:重要でないテレメトリを除外して、重要なものだけに集中します。
- テレメトリデータの手動フラッシュ:必要なときにパフォーマンスデータを即座に送信できるようにします。
前提条件
| 要件 | 最小 |
|---|---|
| Android SDK(compileSdk) | API 21(Lollipop)以上 |
| Java | 1.8以上 |
| AndroidX | 必須(gradle.propertiesでandroid.useAndroidX=true) |
| ManageEngine Applications Manager - モバイルアプリ監視 | 有効なAppKeyを持つアクティブな監視 |
利用開始
ManageEngine APMインサイトAndroid SDKをAndroidアプリに追加する前に、モバイルアプリ監視を作成し、Applications ManagerのWebから設定ファイル(apm_config.json)をダウンロードする必要があります。
- (存在しない場合)resディレクトリー内にrawという名前の新しいAndroidリソースディレクトリーを作成します。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ファイルに追加します。
Groovy(build.gradle)
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 アプリケーションコンテキスト。
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MEAPMInsight.initMonitoring( this );
}
}
2. クラッシュレポートの有効化
ManageEngine APMインサイトSDKは、すべての未捕捉の例外を自動的にキャプチャーします。各クラッシュレポートには、発生タイムスタンプと完全なスタックトレースが含まれており、根本原因の分析に役立ちます。
MEAPMInsight.enableErrorReporting();
3. ANR監視の有効化
ANR(アプリケーションが応答しない)イベントを検出します。これは、メイン(UI)スレッドが長時間ブロックされ、Androidがユーザーに「アプリが応答していません」というダイアログを表示する状況です。ANR監視は、以下のAPIを使用して有効にする必要があります。
// デフォルトのタイムアウト(5秒)
MEAPMInsight.startANRWatching();
// カスタムタイムアウト// メインスレッドが3秒以上ブロックされた場合にANRを報告
MEAPMInsight.startANRWatching(3000);
//ANR監視を停止
MEAPMInsight.stopANRWatching();
}
4. フラグメント追跡の有効化
オプション1:グローバルに有効化
MEAPMInsight.enableFragmentSupport();
オプション2:特定のアクティビティでのみ有効化
特定のアクティビティでのみフラグメント追跡を有効にしたい場合は、それらのアクティビティ内でライフサイクルコールバックを手動で登録します。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getSupportFragmentManager();
.registerFragmentLifecycleCallbacks(
new 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インターセプターが追加されている場合)OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new 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("Transaction_Name")を使用してトランザクションを開始し、完了時にstop()を呼び出します。
トランザクションは次のとおりです。
- スレッドセーフ:異なるスレッド間で開始および停止できます。
- 単一使用:各トランザクションインスタンスは一度だけ開始および停止できます。
- 名前による平均化:同じ名前のトランザクションはグループ化されます。
同じ操作が同じトランザクション名を使用して複数回実行されると、SDKはそれらの発生にわたる平均実行時間を記録します。
ビジネス操作を正確に追跡するために、明確で一貫性のある名前を使用してください。
/**
* トランザクション
*
* @param {String} transactionName
* ビジネス操作全体を表す意味のある名前。
*
* コンポーネント
*
* @param {String} componentName
* 測定対象のサブ操作を表す説明的な名前。
*
* @param {int} componentType
* 事前定義されたコンポーネントタイプ(例:Component.TYPE_HTTP)。
*/
Transaction transaction = Apm.startTransaction("List Articles");
// 事前定義されたHTTPコンポーネントを開始
Component httpComponent = transaction.startComponent(Component.TYPE_HTTP);
// カスタムコンポーネントを開始
Component articlesComponent = transaction.startComponent("Download Articles");
// 記事をダウンロード
transaction.stopComponent(articlesComponent);
for (Article article : articles) {
Component 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に渡します。
/**
@param {List<String>} listOfUrls
*/
MEAPMInsight.excludeHttpCalls(Arrays.asList("example.com"));
3. 画面の除外
カスタム画面を追跡から除外するには、画面名のリストを以下のAPIに渡します。
/*
* param
* List<String> listOfScreens
*/
MEAPMInsight.excludeScreens(Arrays.asList("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を使用します。
List<String> customSensitiveKeys = Arrays.asList("x-custom-token", "account_id", "ssn");
MEAPMInsight.addSensitiveParams(customSensitiveKeys);
6. ProGuard / R8ルール
コードの難読化を使用する場合は、次のルールをproguard-rules.proファイルに追加してください。
-keep class manageengine.mobileapm.android.apm.** { *; }
-dontwarn manageengine.mobileapm.android.apm.**