| Oracle® Mobile Application Framework Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発 2.3.0 E77212-01 |
|
![]() 前 |
![]() 次 |
この章の内容は次のとおりです。
MAFアプリケーションをテストまたはデバッグするには、MAFでサポートされるいずれかのプラットフォーム(Android、iOSまたはユニバーサルWindowsプラットフォーム)上のデバイスに、デバッグ・モードでアプリケーションをデプロイします。MAFおよび各プラットフォームでは、JDeveloper開発環境を、デバイスまたは仮想デバイス上で実行されるMAFアプリケーションに接続するために使用できるツールが提供されます。たとえば、AndroidデバイスでMAFアプリケーションをテストする場合は、JDeveloperからAndroidデバイスまたはAndroid Virtual Device (AVD)にMAFアプリケーションをデバッグ・モードでデプロイします。ユニバーサルWindowsプラットフォームおよびiOSでも類似のツールが提供されます。
MAFアプリケーションをデバッグするためのおおまかな手順には、次のタスクが含まれます。
MAFアプリケーションをテスト環境にデプロイするために使用するデプロイメント・プロファイルを構成して、MAFアプリケーションがデバッグ・モードでデプロイされるようにします。
MAFアプリケーションのmaf.propertiesファイルを構成して、デバッグを有効にします。
MAFアプリケーションをテスト環境にデプロイします。
実行するデバッグ・タスクに適切なツールを使用します。たとえば、MAFアプリケーションでJavaコードをデバッグする場合は、JDeveloperが提供するツールを使用します。MAFアプリケーションのユーザー・インタフェース(HTML、CSSまたはJavaScript)をレンダリングするコードをデバッグする場合は、各プラットフォームでこのタスクのために提供されているツールを使用します。
MAFにはこの他にも、アプリケーションのテストを支援するための機能が用意されています。これには、アプリケーションのパフォーマンスをモニターする機能や、Oracle Mobile Cloud Serviceに分析および診断情報を送信する機能(アプリケーションがこのサービスからのリソースにアクセスする場合)などがあります。
MAFアプリケーションをテストするには、次の2つの方法があります。
モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。
モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。
通常、両方の方法を組み合せて使用することで、最良の結果が得られます。
iOSデバイス用に開発されたMAFアプリケーションのアクセシビリティをテストするには、次の方法を組み合せて使用してください。
iOSデバイス・シミュレータ上でアクセシビリティ・インスペクタを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』のVoiceOverを使用したデバイスでのアクセシビリティのテストに関する項を参照してください。
iOSデバイス上でVoiceOverを使用してテストする。
詳細は、iOS Developer Libraryにある『Accessibility Programming Guide for iOS』の「Using VoiceOver to Test Your Application」を参照してください。
JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、『Oracle JDeveloperによるアプリケーションの開発』のアプリケーションのデバッグに関する項を参照してください。
MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。
MAFでは、デバッグ用のプロジェクトのプロパティが自動的に構成されます(「デバッグ構成に関する必知事項」を参照)。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。
アプリケーションをテストまたはデバッグするには:
JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。
「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。
あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。
ヒント:
「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。
注意:
事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します(「デバッグ構成に関する必知事項」を参照)。
詳細は、次を参照してください:
新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。
実行構成の作成および編集方法の詳細は、「実行構成の作成と構成」を参照してください。
maf.propertiesファイルでは、JVMの起動パラメータおよびMAFのWebビューを指定して、JavaコードおよびJavaScriptのデバッグを有効にできます。maf.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。
MAF実行構成を実行すると、maf.propertiesファイルに次のデバッグ・プロパティが自動的に設定されます。
java.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。
警告:
java.debug.enabledがtrueに設定されている場合、JVMは、デバッガが接続を確立するのを待ちます。デバッガが接続に失敗すると、MAF AMXアプリケーション機能のロードが失敗します。
java.debug.port: 実行対象のMAF実行構成で構成されているポート番号に設定します。
javascript.debug.enabled: デバッグ・セッションを行う場合はtrueに設定し、実行セッションを行う場合はfalseに設定します。Androidにのみ適用されます。
注意:
iOSシミュレータまたはiOSデバイスでMAFアプリケーションが実行されている場合、JavaScriptデバッグを有効にするためにはjavascript.debug.enabledプロパティは必要ありません。
maf.propertiesファイルの内容は、次のようなものです。
java.debug.enabled=true java.debug.port=8000 javascript.debug.enabled=true
JDeveloperを使用してJavaコードをデバッグする方法については、「MAFアプリケーションのデバッグ」を参照してください。
MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。
注意:
デバッグできるのは、JavaコードおよびJavaScriptのみです(「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。
AndroidにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
Javaコードをデバッグするには、アプリケーションでmaf.propertiesファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、「AndroidプラットフォームでのJavaコードのデバッグ方法」の説明に従って、MAFアプリケーションをデバッグ・モードでデプロイし、Javaコードをデバッグできます。
UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.propertiesファイルを構成します(javascript.debug.enabled=true)。このタスクを完了したら、「AndroidプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。
AndroidプラットフォームでJDeveloperを使用してMAFアプリケーションのJavaコードをデバッグするには、「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。
Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、「AndroidエミュレータへのAndroidアプリケーションのデプロイ方法」を参照してください。
Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、「MAFアプリケーションでのプラグインの使用方法の概要」の説明に従って、ネットワーク情報プラグインが有効であることを確認します
MAFアプリケーションを開発する際、Androidデバイスでアプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。開発マシンからAndroidデバイスにMAFアプリケーションをデプロイするときに、GoogleのChrome DevToolsを使用して、このコードをデバッグできます。図29-2に、MAFアプリケーションからのAMXページを調べるChrome DevToolsを示します。
図29-2 MAFアプリケーションからのAMXページを調べるChrome DevTools

使用するための要件を含む、Chrome DevToolsの詳細は、Google DevelopersのサイトでChrome DevToolsを使用したAndroidでのリモート・デバッグに関する項を参照してください。
Oracle Mobile Platform YouTubeチャンネルの「Android上のOracle MAFアプリケーションでのHTMLのデバッグ」ビデオで、AndroidでUIコードをデバッグする方法の概要も参照してください。後者のビデオではcvm.propertiesファイルに言及していることに注意してください。このファイルは、現在のリリースではmaf.propertiesに名前が変更されています。
maf.propertiesファイルを構成して、javascript.debug.enabled=trueというエントリを含めます。
maf.propertiesファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。 デバッグ・モードでデプロイします。詳細は、「MAFアプリケーションのデプロイ」を参照してください。
iOSにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
Javaコードをデバッグするには、その前に、アプリケーションでmaf.propertiesファイルを構成し、JDeveloperで実行構成を作成します。これらのタスクの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」および「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」を参照してください。これらのタスクを完了したら、アプリケーションをiOSデバイスにデバッグ・モードでデプロイして、Javaコードをデバッグできます。デバッグ・モードでのデプロイ方法の詳細は、「iOSプラットフォームでのJavaコードのデバッグ方法」を参照してください。
UIコード(JavaScript、HTMLおよびCSS)をデバッグするには、アプリケーションでmaf.propertiesファイルを構成します(javascript.debug.enabled=true)。このタスクを完了したら、「iOSプラットフォームでのUIコードのデバッグ方法」の説明に従って、UIコードをデバッグできます。
iOSプラットフォームでJDeveloperを使用してMAFアプリケーションのJavaコードをデバッグするには、「MAFアプリケーションのデバッグ」で説明されているデバッグ手順に従います。
iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。
iOS プラットフォームで作業している場合、Safari ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの環境設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします。
「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図29-3および図29-4を参照)、デバッグするUIWebViewを選択します(図29-5を参照)。
注意:
「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。
featureContentDelay追加ビルド引数を使用して、アプリケーションの最初のページがロードされる前に、カスタムJavaScriptからのログ・メッセージおよびエラーを記録します。この引数は、WebViewにコンテンツが移入されるまでの遅延を指定します。追加ビルド引数-featureContentDelayを20に設定します。追加ビルド引数の設定の詳細は、「iOSビルド・オプションの定義」を参照してください。
図29-3 Safariブラウザの「Develop」メニューを使用したiPhone Simulator上でのデバッグ

図29-4 Safariブラウザの「Develop」メニューを使用したiPad Simulator上でのデバッグ

図29-5 Safariブラウザの「Develop」メニューを使用したUIWebViewの選択

図29-6および図29-7は、CSS、DOMおよびHTMLをデバッグ中のSafariのリモートWebインスペクタを示しています。
図29-6 リモートWebインスペクタ

図29-7 実行時にリモートWebインスペクタによって解析されたAMXページ

図29-8および図29-9は、Safariブラウザでのブレークポイントを使用したJavaScriptのデバッグを示しています。
図29-8 SafariブラウザでのJavaScriptのデバッグ

図29-9 実行時にデバッグされたAMXページ

UWPにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。
JDeveloperのデバッグ・ツールを使用して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。詳細は、「ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法」を参照してください。
「ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法」の説明に従って、Visual Studioを使用してMAFアプリケーションでJavaScript、HTMLおよびCSSコードをデバッグします。
ユニバーサルWindowsプラットフォーム(UWP)にデプロイするMAFアプリケーションでJavaコードをデバッグする方法について説明します。
次の手順を実行して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。
MAFアプリケーションのmaf.propertiesファイル・エントリを構成して、デバッグを有効にします。maf.propertiesファイルに次の値が存在することを確認します。
java.debug.enabled=true java.debug.port=8000 java.debug.mode=client java.debug.host=localhost
maf.propertiesファイルの詳細は、「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照してください。
デバッグ・モードを使用するように、MAFアプリケーションのWindowsデプロイメント・プロファイルを構成します(図29-10を参照)。このダイアログにアクセスするには、をクリックします。
図29-10 MAFアプリケーションのデバッグ・モードの有効化

カスタム・プロジェクトをMAFアプリケーションに追加して、標準のJDeveloperアプリケーションの「実行/デバッグ」構成ダイアログにアクセスできるようにします。このカスタム・プロジェクトをMAFアプリケーションに追加したら、JPDAプロトコルをリスニングする接続を指定して、「リモート・デバッグ」オプションを有効にします。カスタム・プロジェクトでデバッグ・リスナーを開始します。これらのタスクの詳細は、「ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法」を参照してください。
ローカルWindowsマシン・オプションを使用してMAFアプリケーションをデプロイします。詳細は、「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。
Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。
カスタム・プロジェクトをMAFアプリケーションに追加して、MAFアプリケーションの作成時にMAFアプリケーション作成テンプレートでは表示されない、「実行/デバッグ」構成パネルを表示します。
ユニバーサルWindowsプラットフォーム(UWP)でMAFアプリケーションを開発する際、アプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。Visual Studioを使用してこのコードをデバッグします。
MAFアプリケーション開発で使用するVisual Studioのインストールの詳細は、『Oracle Mobile Application Frameworkのインストール』のユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。
MAFアプリケーションをデバッグする前に、アプリケーションを開発してデプロイする必要があります。アプリケーションの開発およびデプロイの詳細は、「MAFアプリケーション開発のスタート・ガイド」および「MAFアプリケーションのデプロイ」を参照してください。
UWPにデプロイされているMAFアプリケーションでUIコードをデバッグするには:
サポートされるすべてのプラットフォームでMAFアプリケーションのロギングを有効にするには、JavaScript (「JavaScriptのロギングの使用方法」を参照)および埋込みコード(「埋込みロギングの使用方法」)で、単一ファイルへのログ出力を含む単一構成を使用します。このログ出力には、System.out.printlnおよびSystem.err.println文によって生成された出力が含まれます。
デフォルトのMAFのロギング・プロセスは、次のとおりです。
アプリケーションの起動時、ロギングが開始されます。
アプリケーションの以前の実行で生成された既存のログ・ファイルが削除され、現在の実行の内容のみが使用可能になります。
アプリケーションをiOSデバイス・シミュレータ上で実行している場合、Javaロギング出力へのアクセスに使用できるファイルは、出力のリダイレクションに伴って生成された直後に、その名前と場所が通知されるファイルのみです。このファイルの一般的な場所として、/Users/<userid>/Library/Developer/CoreSimulator/Devices/<device_id>/data/Containers/Data/Application/<container_id>/application.log (<device_id>と<container_id>の参照は、アプリケーションのインストール時にiOSによって作成されたUUIDの長い文字列を表します)などがあります。これらの参照の値は予測できないので、複数のシミュレータまたはアプリケーションがインストールされている場合は、デプロイメント時に使用されるシミュレータに対応するフォルダを特定することは困難です。デプロイメントにJDeveloperを使用する場合は、ログ出力を既知の場所に向けるように自動的に-consoleRedirectオプションが設定されます。iOS用のMAFの実行構成で、「実行構成の編集」→「モバイル実行構成」ダイアログを使用してそれを設定し、その実行構成をデプロイメントまたはiOSデバイス・シミュレータ上でのMAFアプリケーションの実行に使用する場合は、構成された場所にログ・ファイルが作成され、その内容がJDeveloperのコンソールに表示されます。「実行構成の編集」→「モバイル実行構成」ダイアログを使用して値を設定していない場合、または通常のデプロイメント(たとえば、iOS用のMAF実行構成を使用しないなど)を選択する場合は、ログ・ファイルは<appRoot>/<deployRoot>/<iOSProfileName>/log<appName>.logファイルに作成され、その内容がJDeveloperのコンソールに表示されます。詳細は、「実行構成の作成と構成」を参照してください。
注意:
ログ・ファイルを取得するには、パスは絶対パスである必要があり、場所は現在のユーザーにとって書込み可能である必要があります。
iOSデバイス上でアプリケーションを実行している場合、コンソール出力は、アプリケーションのDocuments/logsディレクトリにあるapplication.logファイルにリダイレクトされます。iOSデバイスでは、このディレクトリに次のようにアクセスできます。
*.xcappdataファイルを右クリックして、「Show Package Contents」を選択します。application.logファイルをダブルクリックします。Androidでは、出力は、アプリケーションと同じ名前のテキスト・ファイルにフォワードされます。出力ファイルの場所は/sdcardです。この場所が存在していないか、読取り専用として構成されている場合、ログ出力は、アプリケーションの書込み可能データ・ディレクトリに再ルーティングされます。ログ・ファイルの内容は、AndroidのLogcatユーティリティ(http://developer.android.com/tools/debugging/debugging-log.htmlを参照)でレプリケートされます。JDeveloperを使用してMAFアプリケーションをAndroidデバイスまたはエミュレータにデプロイする場合は、JDeveloperでLogcatからログ出力が表示されます。
iOSおよびAndroidの両方で、デプロイメントの直後に、ログ出力がJDeveloperの実行またはデバッグ・ログのページに表示されます。通常のデプロイメントの場合、アプリケーション・ログが個別の「ログ」ページに表示されるのに対し、デプロイ・ログは「デプロイ・ログ」ページに表示されます。MAFアプリケーションのビルド、デプロイおよび起動に「実行/デバッグ」実行構成を使用する場合は、「アプリケーション」ウィンドウの「プロセス」タブにある「終了」オプションで、ログのリダイレクトを実行するプロセスとともにMAFアプリケーションを終了します。「ログの表示」オプションで、次の図に示すようにログ・ページを表示できます。

MAFアプリケーションのビルド、デプロイおよび起動にデプロイメント・プロファイルを使用する場合は、「プロセス」タブの「終了」オプションでは、ログ・リダイレクト・プロセスのみが終了し、MAFアプリケーションの実行は続きます。
logging.propertiesファイルは自動的に作成され、「アプリケーション・リソース」のDescriptors/META-INFディレクトリ内に配置されます(「ロギングの使用方法と構成」を参照)。この場所は、アプリケーション・ファイル・システム内の<application_name>/src/META-INFの場所に対応しています。このファイルでは、すべてのログ出力でjava.util.logging.ConsoleHandlerおよびSimpleFormatterを使用することが定義され、ログ・レベルがSEVEREに設定されます。このファイルを編集して、別のロギング動作を指定できます(「プロパティ・ファイルを使用したロギングの構成方法」を参照)。
注意:
MAFアプリケーションでは、java.util.loggingパッケージからのロガーを使用することはできません。
MAFのロガーは、次のとおりoracle.adfmf.util.Utilityクラスで宣言されます。
public static final String APP_LOGNAME = "oracle.adfmf.application"; public static final Logger ApplicationLogger = Logger.getLogger(APP_LOGNAME); public static final String FRAMEWORK_LOGNAME = "oracle.adfmf.framework"; public static final Logger FrameworkLogger = Logger.getLogger(FRAMEWORK_LOGNAME);
MAFアプリケーションで使用するロガーは、ApplicationLoggerです。
oracle.adfmf.util.logging.Traceクラスのメソッドを使用することもできます。
詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
次の例は、ロギングの構成で使用するlogging.propertiesファイルを示しています。
# default - all loggers to use the ConsoleHandler .handlers=java.util.logging.ConsoleHandler # default - all loggers to use the SimpleFormatter .formatter=java.util.logging.SimpleFormatter oracle.adfmf.util.logging.ConsoleHandler.formatter= oracle.adfmf.util.logging.PatternFormatter oracle.adfmf.util.logging.PatternFormatter.pattern= [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE% #configure the framework logger to only use the adfmf ConsoleHandler oracle.adfmf.framework.useParentHandlers=false oracle.adfmf.framework.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.framework.level=SEVERE #configure the application logger to only use the adfmf ConsoleHandler oracle.adfmf.application.useParentHandlers=false oracle.adfmf.application.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.application.level=SEVERE
oracle.adfmf.util.logging.ConsoleHandlerは、カスタム・フォーマッタの受信者としての役割を果たします。
oracle.adfmf.util.logging.PatternFormatterでは、ログ・メッセージの出力を可能にする、次の高度なフォーマット・トークンが許可されています。
%LEVEL%: ロギング・レベル。
%LOGGER%: 出力が書き込まれるロガーの名前。
%CLASS%: ログに記録されるクラス。
%METHOD%: ログに記録されるメソッド。
%TIME%: ロギング・メッセージが送信された時間。
%MESSAGE%: 実際のメッセージ。
使用可能なロギング・レベルは、次のとおりです。
SEVERE: 重大な障害を示すメッセージ・レベルです。
WARNING: 潜在的な問題を示すメッセージ・レベルです。
INFO: 情報メッセージのメッセージ・レベルです。
FINE: トレース情報を提供するメッセージ・レベルです。
FINER: このレベルは、かなり詳細なトレース・メッセージを示します。
FINEST: このレベルは、非常に詳細なトレース・メッセージを示します。
警告:
ロギング・レベルの詳細度を選択するときは、SEVERE、WARNINGおよびINFOレベルで出力の詳細度を上げると、アプリケーションのパフォーマンスに悪影響を及ぼすことに留意してください。
logging.propertiesファイルで定義されているロガーは、oracle.adfmf.util.Utilityクラスから取得されるロガーと一致します(「ロギングの使用方法と構成」を参照)。ロギング・レベルも一致します。INFOよりも詳細なロギング・レベルを使用する場合は、ConsoleHandlerのロギング・レベルを、次の例に示されているものと同じレベルに変更する必要があります。
oracle.adfmf.util.logging.ConsoleHandler.formatter= oracle.adfmf.util.logging.PatternFormatter oracle.adfmf.util.logging.ConsoleHandler.level=FINEST oracle.adfmf.util.logging.PatternFormatter.pattern= [%LEVEL%-%LOGGER%-%CLASS%-%METHOD%]%MESSAGE%
JavaScriptは、console.log or.error/.warn/.infoに出力を書き込みます。この出力は、System.outユーティリティによってファイルにリダイレクトされます。
メッセージを指定することで、ログの出力をカスタマイズできます。次のJavaScriptコードでは、"Message from JavaScript"出力が生成されます。
<script type="text/javascript" charset="utf-8">
function test_function() { console.log("Message from JavaScript"); }
</script>
ロギング・ファイルに定義されているプロパティを利用するには、adf.mf.logパッケージ、およびそれによって提供されるApplicationロガーを使用する必要があります。
使用可能なロギング・レベルは、次のとおりです。
adf.mf.log.level.SEVERE
adf.mf.log.level.WARNING
adf.mf.log.level.INFO
adf.mf.log.level.CONFIG
adf.mf.log.level.FINE
adf.mf.log.level.FINER
adf.mf.log.level.FINEST
ロギングをトリガーするには、adf.mf.log.Applicationロガーのlogpメソッドを使用し、そのメソッドのパラメータで次のものを指定します。
ロギング・レベル
文字列としての現在のクラス名
文字列としての現在のメソッド
文字列としてのメッセージ文字列
次の例は、MAFアプリケーションでlogpメソッドを使用する方法を示しています。
adf.mf.log.Application.logp(adf.mf.log.level.WARNING, "myClass", "myMethod", "My Message");
logpメソッドを実行すると、次の出力が生成されます。
[WARNING - oracle.adfmf.application - myClass - myMethod] My Message
詳細は、Oracle Mobile Application Framework JSDocリファレンスを参照してください。
埋込みロギングでは、次の例に示されているとおり、java.util.logging.Loggerを使用します。EmbeddedClassはプロジェクトで定義されるJavaクラスを表します。
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.adfmf.util.logging.*;
...
Utility.ApplicationLogger.logp(Level.WARNING,
EmbeddedClass.class.getName(),
"onTestMessage",
"embedded warning message 1");
Logger.getLogger(Utility.APP_LOGNAME).logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 2");
Logger.getLogger("oracle.adfmf.application").logp(Level.WARNING,
this.getClass().getName(),
"onTestMessage",
"embedded warning message 3");
このコードによって生成される出力は、次のとおりです。
[WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 1 [WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 2 [WARNING - oracle.adfmf.application - EmbeddedClass - onTestMessage] embedded warning message 3
MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。
始める前に:
アプリケーションをJDeveloperからiOSシミュレータにデプロイします。
生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。
workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。
Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。
Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール)ではJavaの出力を表示できません。この出力は、ファイルにリダイレクトされます(「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。
-consoleRedirect=FALSE
次のAPIを使用して、アプリケーションのログ情報にアクセスできます。
oracle.adfmf.framework.api.PerfMon
oracle.adfmf.framework.api.LogEntry
oracle.adfmf.util.HOTS
詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderrおよびstdoutに転送された出力は、すべてnullの場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。
すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xmlファイルでdisableLoggingプロパティをtrueに設定します。
<adf-property name="disableLogging" value="true"/>
デフォルトでは、MAFアプリケーションのロギングは有効で、disableLoggingプロパティはfalseに設定されています。
adf-config.xmlファイルの詳細は、「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。
MAFは、ユーザーによるMAFアプリケーションのパフォーマンスのモニターおよび測定を支援します。たとえば、アプリケーションで次のイベントの実行にかかる時間を測定できます。
ボタンにより起動されたアクションの完了
ページのロード
RESTコールがレスポンスを返す
また、MAFアプリケーションでモニターする操作の実行時間の平均および標準偏差を示す統計を出力できます。
logging.propertiesファイルで次のパフォーマンス・ロガーのロギング・レベルを構成して、パフォーマンス測定を有効にします。次の例でロガーに割り当てられる値は、説明用の値です。指定可能なすべての値の説明は、表29-1を参照してください。oracle.adfmf.amx.useParentHandlers=false oracle.adfmf.amx.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.adfmf.amx.level=SEVERE # used to control what monitors are captured in the list of monitors oracle.maf.performance.monitor.captured.level = FINEST # used to control what monitors are reported in the dumpStatistics oracle.maf.performance.monitor.reported.useParentHandlers=false oracle.maf.performance.monitor.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.maf.performance.monitor.reported.level = FINEST # used to control what monitor observations (start/stop times) are logged. oracle.maf.performance.monitor.observations.reported=false oracle.maf.performance.monitor.observations.reported.handlers=oracle.adfmf.util.logging.ConsoleHandler oracle.maf.performance.monitor.observations.reported.level = FINEST
パフォーマンス測定が完了したら、MAFにより、アプリケーションのパフォーマンスの測定中に収集されたデータを確認できます。次の例は、MAFにより、パフォーマンスのモニター後に生成される出力の抜粋を示しています。この例では、モニターによって5件のProcess AMX eventが検出され、実行時間の平均は1435.5ミリ秒、標準偏差は1990.567…でした。
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS: Monitor 'com.company.WorkBetter.**Perf_Monitor**.Springboard.Container.Process AMX event' description: 'Time to process event' observations: 5 mean: 1435.4 standard deviation: 1990.5674567821106
表29-1で、logging.propertiesファイルで設定できるパフォーマンス・モニター・レベルについて説明します。
表29-1 パフォーマンス・モニター・レベル
| レベル | 説明 |
|---|---|
Level.INFO |
これは最もおおまかなモニター・レベルです。イベントおよびアクションがモニターされます。このレベルを使用すると、たとえば、ページのロードやエンド・ユーザー・アクションの実行(ボタンのクリックなど)をモニターできます。このモニター・レベルを使用した場合、パフォーマンスへの影響は最小限になります。 |
Level.FINE |
このレベルは、次のカテゴリに分けられる、より多くのパフォーマンス・インジケータをモニターします。
このモニター・レベルを使用するとアプリケーションのパフォーマンスに影響するため、デフォルトでは有効にしないでください。アプリケーションを再構築または調整することを目的として、コードの実行状況に関するインサイトを取得する場合に、このレベルの使用を検討してください。 |
Level.FINER |
AMXページでのノードの処理、データ変更イベントまたはEL式の実行時間といった重大なパフォーマンスの問題をモニターする場合に使用します。 |
Level.FINEST |
アプリケーションのパフォーマンスをデバッグする場合に、このモニター・レベルを使用します。 |
logging.properitesで指定したモニター・レベルは、アプリケーションを初めて起動するときに有効になります。 注意:
MAFでは、oracle.adfmf.framework.apiパッケージのPerfMonクラスに、実行時にパフォーマンス・モニター・レベルを変更するために使用できるいくつかのsetPerformanceMonitorメソッドが用意されています。詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。logging.propertiesファイルでのモニター・レベルの指定に加え、パフォーマンス・データを収集するモニターをアプリケーションに追加することもできます。MAFでは、Javaクラスoracle.adfmf.performance.Monitor (モニター)を使用してパフォーマンス・データを収集します。モニターは、開始および停止でき、監視を追加できるストップ・ウォッチです。監視を追加すると、モニターを使用して特定の測定の標準偏差などを把握できます。各モニターに、一意のIDとオプションの説明があります。
モニターでは、イベントの継続時間やイベントの発生回数を測定するために使用できるいくつかのaddObservation()メソッドが公開されています。継続時間を測定する場合は、イベントの前にモニターを開始します。イベントが発生したら、モニターからaddObservation()メソッドを呼び出します。これによりモニターが停止します。継続時間は、start()メソッドからaddObservation()メソッドまでの時間です。停止されなかったモニターは再開できます。開始していないモニターは停止できません。そのようなモニターを停止しようとすると、エラーが記録されます。
イベントの発生回数を測定するモニターは、開始または停止する必要はありません。次の例に示すように、モニターを停止しないaddObservation(double duration)メソッドを使用します。このモニターは、パフォーマンスを測定しているアプリケーションでのJSONシリアライズの発生回数を計測します。durationパラメータは、モニターが最後に監視を追加してからの時間を示します。
次の例は、イベントの継続時間を測定するモニターの作成方法を示しています。この例では、このモニターによって生成される統計情報のサンプルも示しています。
import oracle.adfmf.performance.Monitor;
....
public void measurePerformance()
{
Monitor monitor = null;
try
{
//// Check that the appropriate monitor level is set before you create the monitor
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.INFO))
{
monitor = MonitorFactory.getInstance().getMonitor("REST call", Level.INFO, "REST call timing");
monitor.start();
}
//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation();
}
}
}
public void countCalls()
{
Monitor monitor = null;
try
{
if (Utility.PerformanceMonitorCaptured.isLoggable(Level.FINE))
{
monitor = MonitorFactory.getInstance().getMonitor("Call count", Level.FINE, "Count number of calls");
monitor.start();
}
//
// Perform your custom logic here:
//
}
finally
{
if (monitor != null)
{
monitor.addObservation(1);
}
}
}
アプリケーションでパフォーマンス・データを収集するモニターを作成するには、データを収集するためのパフォーマンス・モニター取得レベルを有効にするようにlogging.propertiesファイルを構成します。前述の例で、アプリケーションのlogging.propertiesファイルに次のエントリが含まれていない場合、MAFではモニターのパフォーマンス・データを収集しません。
# used to control what monitors are captured in the list of monitors oracle.maf.performance.monitor.captured.level = FINEST
モニター(oracle.adfmf.performance.Monitor)の詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
モニターに加え、MAFではoracle.adfmf.performance.Story (ストーリ)も提供されます。ストーリを使用すると、パフォーマンス・データの収集を開始および終了できます。ストーリのパフォーマンス・データの収集が終了すると、ストーリの開始時に割り当てたストーリIDを使用して収集されたパフォーマンス・データの階層ビューがMAFに表示されます。階層ビューには、ストーリ中に実行されたイベントの個別のタイミング測定が示されます。さらに、ストーリの終了時に、MAFによってシステムの状態(HOTS)チェックポイントが実行されます。このHOTSチェックポイントの一環として、ストーリ中に収集されたすべてのモニター・データの標準偏差が計算されるため、個別のストーリ・イベントが統計的にどのように測定されているかに関するインサイトを得ることができます。その後、すべてのモニター・データがMonitorFactoryからクリアされます。
注意:
oracle.adfmf.util.HOTS.checkpoint()メソッドを呼び出すことで、ストーリとは関係なく、HOTSチェックポイントを実行できます。これにより、JVMにより使用された合計メモリー、空きメモリー、使用済メモリー(合計から空きメモリーを引いたもの)およびアクティブな機能の数といったアプリケーションの情報が判別されます。checkpoint()によって返されるデータのサンプルを次に示します。HOTS.memory.used (N/A) count: 1.0335056E7 HOTS.memory.free (N/A) count: 1.365112E7 HOTS.memory.total (N/A) count: 2.3986176E7 HOTS.memory.max (N/A) count: 4.9152E7 HOTS.threads.active (N/A) count: 20.0 HOTS.features.active (N/A) count: 6.0
次の例は、ストーリID (**Perf_Monitor**)でストーリを開始し、ストーリを停止するメソッドを公開するマネージドBeanを示しています。このストーリは、パフォーマンスを測定するアプリケーションのUIのボタンから開始および終了できます。たとえば、ページのロードを測定する場合は、そのページに移動する前にストーリを開始するためのUIボタンと、ページがロードされたらストーリを終了する別のボタンを公開します。
package mobile;
import oracle.adfmf.amx.event.ActionEvent;
import oracle.adfmf.performance.Story;
public class PerfBean
{
public PerfBean()
{
super();
}
public void startStory(ActionEvent ae)
{
Story.startStory("**Perf_Monitor**");
}
public void endStory(ActionEvent ae)
{
Story.endStory();
}
}
logging.propertiesファイルで指定したパフォーマンス・モニター・レベルによって、ストーリによって取得されるデータの量が決定されます。つまり、logging.propertiesファイルのoracle.maf.performance.monitor.reported.level = FINESTエントリは、INFOエントリよりも詳細なストーリを生成します。ストーリが終了すると、ストーリ中に取得されたすべてのパフォーマンス・データがタイミングに基づいてソートされます。モニターが記録された時間が、測定対象のイベントが実行された時間と異なる場合があるため、このソートによって、JavaScriptイベントに対応するモニターの監視が正しい時間で示されます。次にMAFは、次の例に示すように、ソートされたレコードを反復処理し、目的の出力を生成します。
MAFによって、アプリケーションのログ・ファイルにストーリが書き込まれます。AMXページ間を移動するアプリケーションのサンプル出力は、次のようになります。
例29-1 ストーリを使用して生成されるMAFパフォーマンス・モニター・データ
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book) at 1452728427473
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) at 1452728427416
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop]
PERFMON-JAVA STOP: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb2 (Time to process event) took: 14897.0ms
(started at 1452728427416)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start]
PERFMON-JAVA START: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) at 1452728442323
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (Time to process event) took:
586.0ms (started at 1452728442323)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) at 1452728442441
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Load page /view2.amx
(Time to fully render the page) took: 468.0ms (started at 1452728442441)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) at 1452728450665
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Evaluate method expression #{myBean2.endStory}
(UserSpace) took: 78.0ms (started at 1452728450665)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - start] PERFMON-JAVA START:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event) at 1452728450626
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Container.Process AMX event Page: /view2.amx
event of type action on node cb2 (Time to process event)
took: 85.0ms (started at 1452728450626)
[INFO - oracle.maf.performance.monitor.observations.reported - Monitor - stop] PERFMON-JAVA STOP:
**Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (Story Book)
took: 23367.0ms (started at 1452728427473)
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Process AMX event'
description: 'Time to process event' observations: 3
mean: 5189.333333333333 standard deviation: 8410.817102596711
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Container.Load page'
description: 'Time to fully render the page' observations: 1
mean: 468.0 standard deviation: NaN
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Evaluate
method expression' description: 'UserSpace' observations: 1 mean: 78.0
standard deviation: NaN
[INFO - oracle.maf.performance.monitor.reported - MonitorFactory - dumpStatistics] PERFMON-JAVA STATS:
Monitor 'com.company.aPerfMonDocApp.**Perf_Monitor**.Navigation.Embedded.Story'
description: 'Story Book' observations: 1 mean: 23367.0 standard deviation: NaN
1452728427473 0001.0001 [0000] Start: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor** (INFO)
1452728442323 0002.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (INFO)
1452728442441 0003.0003 [0002] Start: **Perf_Monitor**.Navigation.Container.Load page /view2.amx (INFO)
1452728442909 0003.0003 [0002] Stop: **Perf_Monitor**.Navigation.Container.Load page /view2.amx
(took = 468.0) started at 1452728442441 (INFO)
1452728442909 0002.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view1.amx event of type action on node cb1 (took = 586.0)
started at 1452728442323 (INFO)
1452728450626 0004.0002 [0001] Start: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (INFO)
1452728450665 0005.0003 [0004] Start: **Perf_Monitor**.Navigation.Embedded.Evaluate
method expression #{myBean2.endStory} (INFO)
1452728450711 0004.0002 [0001] Stop: **Perf_Monitor**.Navigation.Container.Process AMX event Page:
/view2.amx event of type action on node cb2 (took = 85.0)
started at 1452728450626 (INFO)
1452728450743 0005.0003 [0004] Stop: **Perf_Monitor**.Navigation.Embedded.Evaluate method
expression #{myBean2.endStory} (took = 78.0)
started at 1452728450665 (INFO)
1452728450840 0001.0001 [0000] Stop: **Perf_Monitor**.Navigation.Embedded.Story **Perf_Monitor**
(took = 23367.0) started at 1452728427473 (INFO)
Oracle Mobile Cloud Service (MCS)によってホストされるREST WebサービスにアクセスするMAFアプリケーションからの診断情報を挿入する方法について説明します。
REST WebサービスにアクセスするMAFアプリケーションは、RestServiceAdapterを使用してこれらのサービスにアクセスします。アプリケーションがMCSによってホストされるRESTサービスにアクセスする場合に、MCS Diagnosticsを使用してMCSによってホストされるRESTサービスへのアプリケーションのコールをモニターまたはデバッグ(あるいはその両方)するには、McsRestServiceAdapterを作成して次の情報をMCSに送信します。
モバイル診断セッションID
この属性は、特定のデバイスにアプリケーション・セッションをマップします。アプリケーションではこの情報を、Oracle-Mobile-DIAGNOSTIC-SESSION-ID HTTPリクエスト・ヘッダーを介して送信します。
モバイル・デバイスID
MCSに送信されたREST APIリクエストを、リクエストを行った物理デバイスに関連付けます。モバイル・アプリケーションではこの情報を、Oracle-Mobile-Device-ID HTTPリクエスト・ヘッダーを介して提供します。
クライアント・リクエスト時間
アプリケーションがリクエストを送信する直前に、クライアント側で取得されたAPIコールのタイム・スタンプを示します。モバイル・アプリケーションではこの情報を、HTTPリクエスト・ヘッダーのOracle-Mobile-CLIENT-REQUEST-TIME属性を使用して提供します。
Oracle-Mobile-Diagnostic-Session-ID: 19975 Oracle-Mobile-Device-ID: d09379504b0a3247 Oracle-Mobile-Client-Request-Time: 2016-02-09T09:03:17.777Z
次の例は、McsRestServiceAdapterの作成方法を示しています。
... import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory; import oracle.maf.api.dc.ws.rest.RestServiceAdapter; ... RestServiceAdapterFactory factory = RestServiceAdapterFactory.newFactory(); RestServiceAdapter mcsRestServiceAdapter = factory.createMcsRestServiceAdapter();
アダプタの作成の詳細は、「WebサービスにアクセスするためのRESTサービス・アダプタの作成」を参照してください。
MCSでホストされる1つ以上のモバイル・バックエンド(MBE)を持つMAFアプリケーションは、アプリケーションの使用状況に関する分析情報をMCS Analyticsに送信できます。
MAFがMCSに送信するために生成する分析情報は、アプリケーションのライフサイクルとエンド・ユーザーのMAFアプリケーションとの相互作用に関する情報を提供します。MAFでは、分析イベントをMAFフレームワーク・イベントとビジネス・イベントに分類します。MAFフレームワーク・イベントのレスポンスとして取得された情報をMCSに送信するには、アプリケーションのlogging.propertiesファイルでプロパティを構成します。MAFフレームワーク・イベントの例には、アプリケーションの起動、アクティブ化や機能ナビゲーションなどの機能イベント、ユーザー認証イベントなどがあります。分析情報をMCSに送信するようにアプリケーションを構成している場合、MAFではこれらのイベントをデフォルトで記録します。
次の例は、エンド・ユーザーが保護されたアプリケーション機能(secure-feature-1およびsecure-feature-2)に移動する前に、ログイン・アプリケーション機能(LF1)にリダイレクトされたときに発生するFeatureNavigation MAFフレームワーク・イベントについて、MAFが生成し、MCSに転送するペイロードを示しています。MAFでは、分析情報を送信するように構成されているMAFアプリケーションがアクティブ化されたときに開始するセッション内のすべてのMAFフレームワーク・イベントを記録します。MAFアプリケーションが非アクティブ化されるとセッションが終了します。次の例では、sessionIDプロパティによってセッションが示されています。
MAFアプリケーションをデバッグ・モードでデバイスにデプロイしている場合、JDeveloperの「ログ」ウィンドウにこのペイロードが表示されます。
"name":"FeatureNavigation", "properties":{"SourceId":"null","DestinationId":"LF1"}, "type":"custom", "timestamp":"2015-11-06T20:35:27.384Z",
"sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"
"name":"FeatureNavigation", "properties":{"SourceId":"LF1","DestinationId":"secure-feature-1"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"
"name":"FeatureNavigation", "properties":{"SourceId":"secure-feature-1","DestinationId":"secure-feature-2"}, "type":"custom",
"timestamp":"2015-11-06T20:35:27.384Z", "sessionID":"com.company.MafAnalytics_736ad3d4-3443-4f65-8378-4e653ade2d30_160121114922"
ビジネス・イベントは、ユーザー(アプリケーション開発者)がアプリケーションで定義するイベントです。ユーザーは、MAFのoracle.maf.api.analytics.AnalyticsUtilitiesで提供されているAPIを使用して、イベントの分析情報を取得します。MAFでは、ApplicationFeaturesデータ・コントロールでデータ・コントロール・メソッド(fireEventListener)も公開しています。このデータ・コントロール・メソッドをAMXページにドラッグ・アンド・ドロップして、定義したイベントをリスニングするようにメソッドを構成できます。これらのAPIを使用して、MAFフレームワーク・イベントからMCSに分析を送信することもできます。
MAFでは、コンテキスト・イベント情報(デバイス・モデル、国、タイムゾーンなど)をMCSまたはその他の希望するリポジトリに送信することもできます。
MCS以外のリポジトリに分析を送信することもできます。
詳細は、次を参照してください。
分析情報を取得するMAFフレームワーク・イベント(MAFで提供されるMAFフレームワーク・イベントについて説明します。)
拡張およびカスタマイズできるoracle.maf.api.analyticsパッケージのクラスの詳細は、Oracle Mobile Application Framework Java APIリファレンスを参照してください。
MAFでは、新しいMAFアプリケーションのlogging.propertiesファイルに、MAFアプリケーションからMCS Analyticsに分析情報を送信するように構成する必要があるプロパティを移入します。
次の例は、新しいMAFアプリケーションの作成時にlogging.propertiesファイルに含まれている、すぐに使用できるエントリを示しています。
# Configure the analytics logger # Analytics events are logged only if oracle.maf.api.analytics.level=ALL # Set to OFF or any level other than ALL to disable analytics oracle.maf.api.analytics.level=ALL oracle.maf.api.analytics.handlers=oracle.maf.api.analytics.LoggerAnalyticsHandler, oracle.maf.api.analytics.McsAnalyticsHandler oracle.maf.api.analytics.custom.level=INFO oracle.maf.api.analytics.LoggerAnalyticsHandler.level=INFO # Configure MCSHandler oracle.maf.api.analytics.McsAnalyticsHandler.level=INFO oracle.maf.api.analytics.McsAnalyticsHandler.connectionId=Mcs_Connection_Id oracle.maf.api.analytics.McsAnalyticsHandler.batchSize=25 oracle.maf.api.analytics.McsAnalyticsHandler.offlineWrite=false oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=false oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider
前述の例に示したプロパティの中で、connectionIdのみが必須です。表29-2で、オプションのプロパティについて説明します。connectionIdプロパティでは、MCS MBEへの有効な接続を定義します。アプリケーションのconnection.xmlで定義したconnectionIdを、このプロパティの値として使用してください。有効なconnectionIdを指定しない場合、MAFからMCSにイベントが送信されません。かわりに、MAFでは、デバイスで許可されるイベントの最大数に達するまで、これらのイベントをディスクに追加します。
アプリケーションのconnection.xmlファイルの有効なconnectionIdでは、MAFアプリケーションのMBEへの登録時に生成されるMBEのID (oracle-mobile-backend-id)とアプリケーション・キー(oracle-mobile-application-key)が使用されます。MAFは、MCSへの接続を作成するHTTPヘッダーにこれら2つの値を追加します。これらの値は、MAFアプリケーションが分析イベントを送信するMBEと、分析イベントの発生元のアプリケーションを識別します。
注意:
3つすべてのプラットフォーム(Android、iOSおよびユニバーサルWindowsプラットフォーム)について、MCSでMAFアプリケーションをクライアントとして登録する必要はありません。1つのプラットフォームについてMAFアプリケーションを登録し、生成されたアプリケーション・キーをoracle-mobile-application-keyの値として使用します。MCS MBEへの接続でHTTP基本認証タイプを使用している場合は、oracle/wss_http_token_client_policyを接続に関連付けます。Oauthを使用する接続の場合は、oracle/http_oauth2_token_mobile_client_policyを接続に関連付けます。正しいポリシーを接続に関連付けないと、MAFでMCSに分析イベントがフラッシュされません。セキュリティ・ポリシーの接続との関連付けの詳細は、「セキュアなWebサービスへのアクセス」を参照してください。
次の例は、前述のプロパティの値が設定されたアプリケーションのconnections.xmlファイルの抜粋を示しています。
<References xmlns="http://xmlns.oracle.com/adf/jndi">
<Reference name="Mcs_Connection_Id" className="oracle.adf.model.connection.url.HttpURLConnection"
adfCredentialStoreKey="McsLoginConn" xmlns="">
...
<RefAddresses>
<XmlRefAddr addrType="Mcs_Connection_Id">
<Contents>
<urlconnection name="Mcs_Connection_Id" url="http://mcs_instance.oracle.com:7201"/>
...
</Reference>
<Reference name="McsLoginConn" className="oracle.adf.model.connection.adfmf.LoginConnection"
adfCredentialStoreKey="McsLoginConn" partial="false" manageInOracleEnterpriseManager="true"
deployable="true" xmlns="">
<Factory className="oracle.adf.model.connection.adfmf.LoginConnectionFactory"/>
<RefAddresses>
<XmlRefAddr addrType="adfmfLogin">
<Contents>
<login url="http://mcs_instance.oracle.com:7201/mobile/platform/users/login"/>
<logout url="http://mcs_instance.oracle.com:7201/mobile/platform/users/logout"/>
<customAuthHeaders>
<header name="oracle-mobile-backend-id" value="0e4a9dfa-046a-4aaa-b8dd-331044ad81f4"/>
<header name="oracle-mobile-application-key" value="be53201a-8674-48d7-96d0-bb02f4cd06c5"/>
</customAuthHeaders>
...
</References>
logging.propertiesファイルで次のオプション・エントリを構成して、説明されている機能を実装します。
表29-2 MAFアプリケーションからの分析の転送を管理するためのオプション・プロパティ
| プロパティ | 説明 |
|---|---|
| batchSize | MAFアプリケーションが関連付けられているMCSインスタンスにイベントを送信する前に、ローカルに保存されるイベントの数を決定するオプションのプロパティ。イベントはバッチでMCSにアップロードされます。最大バッチ・サイズの制限(65)があります。batchSizeが指定されないか、上限の65を超えている場合は、デフォルトのbatchSizeの25が適用されます。 |
| offlineWrite | イベントのオフライン・バッファリングを有効にするかどうかを決定するオプションのプロパティ。デバイスがオフラインであるか、クライアントがMCSとの接続を確立できないときに、イベントが生成される場合があります。そのようなイベントが失われないようにするには、offlineWriteプロパティを構成します。接続が再確立されると、保存されたこれらのイベントがMAFによってMCSにフラッシュされます。offlineWriteプロパティは、そのようなイベントをディスクにキャッシュして、オフラインの間バッファリングできるようにします。MAFでは、最大250個のイベントがサポートされます。イベントはローリング方式で保存されます。つまり、MAFには最後の250個のイベントが保存されます。このため、常に最新のイベントがオフラインでバッファリングされます。MAFでは、batchSizeに達しているかどうかにかかわらず、アプリケーションが非アクティブ化された場合にもMCSにイベントをフラッシュします。デフォルトでは、offlineWriteは無効になっています。有効にするには、Trueに設定してください。 |
| recordUsername | ユーザー名を取得するかどうかを決定するオプションのプロパティ。Trueに設定すると、ユーザーが保護された機能にログインしたときに、MAFによってユーザー名が取得されます。アプリケーションに保護された機能が含まれていない場合、またはユーザーが保護された機能にログインしていない場合は、ユーザー名はnullのままになります。アプリケーションに保護された機能が複数含まれている場合は、その機能にログインするために使用された資格証明(ユーザー名)に基づいてユーザー名が更新されます。取得されたユーザー名は、コンテキスト・イベントのフィールドの1つとして送信されます。したがって、ユーザー名を取得する予定の場合は、recordUsernameプロパティがTrueで、contextProviderClassNameにコンテキスト・イベントを生成するための有効なクラス名が指定されるようにlogging.propertiesを構成してください。たとえば、oracle.maf.api.analytics.McsAnalyticsHandler.recordUsername=trueです。 |
| contextProviderClassName | オプション。コンテキスト・イベントが生成されたときに、このプロパティの値を指定します。指定する値によって、MCSのコンテキスト・イベントを生成するクラスが決定されます。コンテキスト・イベントには、タイムゾーン・オフセット、地理的位置、デバイス情報などの情報が含まれます。recordUsernameがTrueに設定されている場合は、ユーザー名が含まれることもあります。contextProviderClassNameプロパティは、デフォルトでは無効になっています。次の例は、このプロパティを有効にする方法を示しています。oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider |
MAFでは、MCSにイベントを送信するために使用できるAPIをoracle.maf.api.analytics.AnalyticsUtilitiesで提供しています。
AnalyticsUtilitiesクラスは、次のAPIを提供します。
public static void fireEvent(Level level, String category, String eventName)
// Send an event without a payload
public static void fireEvent(Level level, String category, String eventName, JSONObject payload)
// Send an event with a JSON payload
level: The logging level of the event. Set to any standard level supported by Java logging.
category: The category of the event. Set to 'custom' for all events except context,
sessionStart(MAF Framework event) and sessionEnd(MAF Framework event). Set the latter events to 'system'.
eventName: Provide your own event name if you do not use an event provided in the AnalyticsUtilities class.
Throws an exception if null.
payload: A JSONObject that contains key-value pairs for custom events. The JSONObject must be of type String.
No other data type is supported.
このAPIを使用する前に、MCSに分析を転送するために必要な値をアプリケーションのlogging.propertiesファイルに構成します。たとえば、MCSのconnectionIDを指定します。
次の例は、このAPIを使用して、MAFアプリケーションからMCSに分析を送信する方法を示しています。
// Sending events from your application.
// The following logs event when there is no payload to register for an event.
AnalyticsUtilities.fireEvent(Level.WARNING, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS");
// The following logs event when there is a JSON payload to send for a custom event.
try
{
JSONObject payload = new JSONObject();
payload.put("PAYLOAD_VIDEONAME", getFileName());
payload.put("PAYLOAD_ACTION", getAction());
// Creating a custom event 'EVENT_VIDEO_ACTIONS' of level INFO
AnalyticsUtilities.fireEvent(Level.INFO, AnalyticsUtilities.CATEGORY_CUSTOM, "EVENT_VIDEO_ACTIONS" , payload);
}
catch(Throwable t)
{
// log the error
}
ユーザーとの相互作用に基づいて、イベントを取得する異なるログ・レベルを設定できます。たとえば、エンド・ユーザーが再生アクションを実行する場合、前述の例のEVENT_VIDEO_ACTIONSイベントをINFOレベルに設定できます。または、失敗した場合にイベントを取得するには、WARNINGレベルに設定できます。ロギング・レベルはlogging.propertiesファイルで管理します。たとえば、EVENT_VIDEO_ACTIONSイベントのロギングを管理するには、logging.propertiesファイルを次のように構成します。
// Set to WARNING to log events for the play action. Set to INFO (or a lower level) // to log events for the play action plus failure events oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=WARNING // Disable logging of EVENT_VIDEO_ACTIONS oracle.maf.api.analytics.custom.EVENT_VIDEO_ACTIONS.level=OFF
MAFアプリケーションでは、コンテキスト・イベントを取得して、収集された情報をMCSまたはMCS以外のリポジトリに送信できます。
コンテキスト・イベントは、別のコンテキスト・イベントが記録されるまでの、後続のイベントのコンテキストを定義します。イベントは、MAFフレームワーク・イベントから、またはアプリケーションで定義するイベントから記録できます。
表29-3に、MAFアプリケーションからコンテキスト・イベントを送信するJSONオブジェクトのキーと値のペアで、MCSが受け入れるキー名を示します。MCSでは、すべてのプロパティが文字列型である必要があります。次の表に示すすべてのプロパティはオプションです。
注意:
MCSでは、緯度および経度の情報が、市区町村、都道府県、国および郵便番号に変換されます。緯度および経度(latitudeおよびlongitude)の情報を指定するか、またはlocality、region、postalCodeおよびcountryを指定し、両方は指定しないでください。
表29-3 コンテキスト・イベント情報をMCSに送信するための有効なキー名
| キー名 | 説明 |
|---|---|
| userName | コンテキスト・イベントが記録されたときに、保護された機能にログインしていたデバイスのユーザー。 |
| timezone | UTCからのデバイスのオフセット(秒) |
| model | デバイスのモデル名 |
| osName | デバイスのオペレーティング・システム名 |
| osVersion | デバイスのオペレーティング・システムのバージョン |
| latitude | デバイスのGPS緯度 |
| longitude | デバイスのGPS経度 |
| locality | デバイスの地域 |
| region | デバイスのリージョン |
| postalCode | デバイスの郵便番号 |
| country | デバイスの国 |
MAFアプリケーションからMCSにコンテキスト・イベント情報を送信するには、logging.propertiesファイルで次のエントリを構成します。
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName= oracle.maf.api.analytics.McsContextProvider
このエントリがlogging.propertiesファイルに構成されている場合、表29-3に示されているコンテキスト・イベント情報がMAFからMCSに送信されます。MAFアプリケーションからMCSにユーザー名を送信する場合は、logging.propertiesファイルでrecordUsernameをTrueに設定する必要もあります。
定義したフィールドを含むコンテキスト・イベントを生成するには、logging.propertiesファイルで次のエントリを構成します。
oracle.maf.api.analytics.McsAnalyticsHandler.contextProviderClassName=oracle.maf.demo.CustomContextProvider
ここで、oracle.maf.demo.CustomContextProviderはoracle.maf.api.analytics.ContextProviderを実装するクラスです(例29-2を参照)。生成されるコンテキスト・イベントには、タイムゾーン、キャリアおよびメーカーの情報が含まれます。
例29-2 コンテキスト情報を送信するカスタム・コンテキスト・プロバイダ
package oracle.maf.demo;
import java.util.Date;
import java.util.TimeZone;
import oracle.maf.api.analytics.ContextProvider;
import oracle.adfmf.json.JSONObject;
public class CustomContextProvider
implements ContextProvider
{
public CustomContextProvider()
{
super();
}
public JSONObject generateContext()
{
JSONObject myCustomCtx = new JSONObject();
//
// TimeZone - Mobile device's offset from UTC in seconds
//
Date date = new Date();
int offset = TimeZone.getDefault().getOffset(date.getTime()) / 1000;
try
{
myCustomCtx.put("timezone", new Integer(offset).toString());
myCustomCtx.put("carrier", "AT&T");
myCustomCtx.put("manufacturer", "Apple");
}
catch(Exception ex)
{
ex.printStackTrace();
}
return myCustomCtx;
}
}
MAFアプリケーションでは、MCS以外のリポジトリに分析を送信できます。
これを行うには、次の例に示すように、oracle.maf.api.analytics.McsAnalyticsHandlerを拡張するカスタム・クラスを作成して、processEvent()メソッドをオーバーライドします。
package oracle.maf.demo;
import java.io.IOException;
import oracle.adfmf.framework.exception.AdfException;
import oracle.adfmf.json.JSONArray;
import oracle.adfmf.resource.CDCErrorBundle;
import oracle.adfmf.util.ResourceBundleHelper;
import oracle.maf.api.analytics.McsAnalyticsHandler;
import oracle.maf.api.dc.ws.rest.RestServiceAdapter;
import oracle.maf.api.dc.ws.rest.RestServiceAdapterFactory;
public class CustomHandler extends McsAnalyticsHandler
{
public CustomHandler()
{
super();
}
//
// Establish the connection to a different repository and flush the events.
//
protected void processEvents() throws AdfException
{
// Extract the events to be flushed
_events = super.getEvents();
RestServiceAdapter restAdapter = RestServiceAdapterFactory.newFactory().createRestServiceAdapter();
restAdapter.clearRequestProperties();
// Get valid connectionId of the repository.
restAdapter.setConnectionName(getConnectionId());
restAdapter.setRequestMethod(RestServiceAdapter.REQUEST_TYPE_POST);
restAdapter.addRequestProperty("Content-Type", "application/json");
restAdapter.setRequestURI(_ANOTHER_REPOSITORY_URI);
restAdapter.setGenerateAnalyticsEvents(false);
// make REST call to send events
try
{
String responseMessage = restAdapter.send(_events.toString());
}
catch (IOException ex)
{
throw new AdfException(AdfException.ERROR, ResourceBundleHelper.CDC_ERROR_BUNDLE,
CDCErrorBundle.ERR_ANALYTICS_FLUSH_EVENTS, new Object[] { ex });
}
}
private JSONArray _events = new JSONArray();
private static final String _ANOTHER_REPOSITORY_URI = "_repository_uri";
}
logging.propertiesファイルでカスタム・クラスを登録する必要もあります。たとえば、CustomHandlerを登録するには、次の例に示すようにlogging.propertiesを構成します。
# Configure the analytics logger oracle.maf.api.analytics.level=ALL oracle.maf.api.analytics.handlers=oracle.maf.demo.CustomHandler oracle.maf.api.analytics.custom.level=INFO # Configure CustomHandler oracle.maf.demo.CustomHandler.level=INFO oracle.maf.demo.CustomHandler.connectionId=RepositoryConn oracle.maf.demo.CustomHandler.batchSize=7 oracle.maf.demo.CustomHandler.offlineWrite=true oracle.maf.demo.CustomHandler.recordUsername=false oracle.maf.demo.CustomHandler.contextProviderClassName=oracle.maf.api.analytics.McsContextProvider
MAFでは、分析情報を取得する様々なMAFフレームワーク・イベントを提供しています。
これらのイベントは2つのカテゴリ(カスタムおよびシステム)にグループ化されます。アプリケーションのlogging.propertiesファイルを構成して、アプリケーションからMCSにこれらのイベントが送信されるようにします。まず、MCSのconnectionIDを指定して、分析情報の送信を有効にするようにアプリケーションのlogging.propertiesファイルを構成します。次に、送信するイベントを指定します。この後者のタスクには、次の表の情報を使用します。
表29-4に、アプリケーションからMCSに分析情報を送信するようにlogging.propertiesファイルで構成できる、MAFフレームワーク・イベント(カスタム・カテゴリ)を示します。各イベントは、OFFに設定するか、そのイベントのロギングが有効になるレベルより高いロギング・レベルに設定することで無効にできます。
表29-4 MAFフレームワーク・イベント(カスタム・カテゴリ)
| イベント名 | ロギング・レベル | ロギングの有効化または無効化 |
|---|---|---|
UpdateAuthenticationStatus |
FINE |
|
FeatureNavigation |
INFO |
|
Login |
INFO |
|
LoginCallback |
FINER |
|
Timer |
警告および期限切れ操作の場合はINFO 調整操作の場合はFINE |
|
Logout |
INFO |
|
LogoutCallback |
FINER |
|
PageNavigation |
INFO |
|
FeatureTransition |
INFO |
|
ApplicationTransition |
INFO |
|
RESTWebService |
INFO |
|
表29-5に、アプリケーションからMCSに分析情報を送信するようにlogging.propertiesファイルで構成できる、MAFフレームワーク・イベント(システム・カテゴリ)を示します。
表29-5 MAFフレームワーク・イベント(システム・カテゴリ)
| イベント名 | ロギング・レベル | 説明 |
|---|---|---|
sessionStart |
INFO | このイベント名は、MAFアプリケーションがアクティブ化され、分析情報の記録を開始したときに開始されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。 |
sessionEnd |
INFO | このイベント名は、MAFアプリケーションが非アクティブ化され、分析情報の記録を停止したときに停止されるセッションを識別するために予約されています。このイベント名を使用するイベントをMAFアプリケーションで定義しないでください。 MAFでは、 |
context |
INFO | コンテキスト・イベント情報を送信します(たとえば、デバイスのタイムゾーン、キャリアおよびメーカー)。次のようにこのイベントを有効にします。oracle.maf.api.analytics.McsAnalyticsHandler
.contextProviderClassName=oracle.maf.api
.analytics.McsContextProvider
コンテキスト・イベント情報の詳細は、「Oracle Mobile Cloud Serviceにコンテキスト・イベントを送信する方法」を参照してください。 |