プライマリ・コンテンツに移動
Oracle® Mobile Application Framework Oracle Mobile Application Frameworkでのモバイル・アプリケーションの開発
2.3.3
E82940-01
目次へ移動
目次

前
次

31 MAFアプリケーションのテストおよびデバッグ

この章では、MAFアプリケーションのテストおよびデバッグについて説明します。

この章の内容は次のとおりです。

31.1 MAFアプリケーションのテストおよびデバッグの概要

MAFアプリケーションをテストまたはデバッグするには、MAFでサポートされるいずれかのプラットフォーム(Android、iOSまたはユニバーサルWindowsプラットフォーム)上のデバイスに、デバッグ・モードでアプリケーションをデプロイします。MAFおよび各プラットフォームでは、JDeveloper開発環境を、デバイスまたは仮想デバイス上で実行されるMAFアプリケーションに接続するために使用できるツールが提供されます。たとえば、AndroidデバイスでMAFアプリケーションをテストする場合は、JDeveloperからAndroidデバイスまたはAndroid Virtual Device (AVD)にMAFアプリケーションをデバッグ・モードでデプロイします。ユニバーサルWindowsプラットフォームおよびiOSでも類似のツールが提供されます。

MAFアプリケーションをデバッグするためのおおまかな手順には、次のタスクが含まれます。

  1. MAFアプリケーションをテスト環境にデプロイするために使用するデプロイメント・プロファイルを構成して、MAFアプリケーションがデバッグ・モードでデプロイされるようにします。

  2. MAFアプリケーションのmaf.propertiesファイルを構成して、デバッグを有効にします。

  3. MAFアプリケーションをテスト環境にデプロイします。

  4. 実行するデバッグ・タスクに適切なツールを使用します。たとえば、MAFアプリケーションでJavaコードをデバッグする場合は、JDeveloperが提供するツールを使用します。MAFアプリケーションのユーザー・インタフェース(HTML、CSSまたはJavaScript)をレンダリングするコードをデバッグする場合は、各プラットフォームでこのタスクのために提供されているツールを使用します。

MAFにはこの他にも、アプリケーションのテストを支援するための機能が用意されています。これには、アプリケーションのパフォーマンスをモニターする機能や、Oracle Mobile Cloud Serviceに分析および診断情報を送信する機能(アプリケーションがこのサービスからのリソースにアクセスする場合)などがあります。

31.2 MAFアプリケーションのテスト

MAFアプリケーションをテストするには、次の2つの方法があります。

  1. モバイル・デバイス上でのテスト: この方法では常に、最も正確な動作が提供されます。アプリケーションのパフォーマンスを測定する場合も、この方法をとる必要があります。ただし、テスト実行者がテスト対象のすべてのデバイスを入手できるとはかぎらないため、デバイスのテストは確実なものとは言えません。

  2. モバイル・デバイス・エミュレータまたはシミュレータ上でのテスト: この方法は通常、よりよいパフォーマンスとより高速なデプロイを提供し、便利です。ただし、デバイスのエミュレータまたはシミュレータは、対応する物理デバイスに近似したものであるとは言え、動作の相違やエミュレートできる機能の制限が存在する場合があります。

通常、両方の方法を組み合せて使用することで、最良の結果が得られます。

31.2.1 iOSデバイス上でアクセシビリティのテストを実行する方法

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」を参照してください。

31.3 コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成

JDeveloperには、Javaプログラムをデバッグ・モードで実行し、標準のブレークポイントを使用してアプリケーションの実行をモニターおよび制御することを可能にするデバッグ・メカニズムが備わっています。詳細は、『Oracle JDeveloperによるアプリケーションの開発』のアプリケーションのデバッグに関する項を参照してください。

MAFアプリケーションはJDeveloper内部で実行できないため、デバッグの方法が異なります。JDeveloperデバッガを使用して、モバイル・デバイスまたはシミュレータ上のJava仮想マシン・インスタンスに接続し、デプロイ済のMAFアプリケーションのJavaの部分を制御します。

MAFでは、デバッグ用のプロジェクトのプロパティが自動的に構成されます(「デバッグ構成に関する必知事項」を参照)。JDeveloperを使用してMAFアプリケーション内のJavaコードをデバッグするために実行する必要のある手順は、次のとおりです。

アプリケーションをテストまたはデバッグするには:

  1. JDeveloperのメイン・メニューから、「実行」→「アクティブな実行構成を選択」をクリックして、アクティブな実行構成を選択します。

  2. 「アプリケーション」ウィンドウで、テストするファイルを右クリックし、「実行」を選択します。

    あるいは、デバッグを有効にした状態でアプリケーションを実行する場合は、「デバッグ」を選択します。

    ヒント:

    「ソース」ビューでMAFアプリケーションのファイルを開き、右クリックして、「実行」または「デバッグ」を選択します。

    注意:

    事前定義済の実行構成セットを持たない既存のアプリケーションを使用する場合は、新しい実行構成を作成します(「デバッグ構成に関する必知事項」を参照)。

詳細は、次を参照してください:

31.3.1 デバッグ構成に関する必知事項

新しいMAFアプリケーションを作成する場合、作成ウィザードでは、デバッグ用にアプリケーション・プロパティが自動的に構成されます。これには、iOSシミュレータまたはAndroidエミュレータやデバイスでMAFアプリケーションの実行またはデバッグを行うために使用できるデフォルトの実行構成の作成が含まれます。これらの実行構成では、JDeveloperの「実行」または「デバッグ」ボタンをクリックすると、MAFアプリケーションの構築、デプロイ、実行またはデバッグができます。JDeveloperの「実行」または「デバッグ」ボタンをクリックし、MAF実行構成を選択すると、実行構成に関連付けられたデプロイメント・プロファイルが実行され、アプリケーションが構築されてターゲット・デバイスにデプロイされます。アプリケーションはデプロイされると、自動的に起動します。「デバッグ」ボタンを選択すると、アプリケーションがデバッガとともに起動します。

実行構成の作成および編集方法の詳細は、「実行構成の作成と構成」を参照してください。

31.3.1.1 実行構成の作成と構成

新しい構成を作成するか、既存の構成を変更するには、次のように「実行構成の編集」ダイアログに入力します(図31-1を参照)。

  1. JDeveloperのメイン・メニューで、「アプリケーション」→「プロジェクト・プロパティ」をクリックして、「プロジェクト・プロパティ」ダイアログを開きます。
  2. 「プロジェクト・プロパティ」ダイアログで、左側のツリーから「実行/デバッグ」ノードを選択します。

    あるいは、「実行」→「アクティブな実行構成を選択」→「実行構成の管理」を選択します。

  3. 新しい実行構成を作成するか、既存の実行構成を変更します。

    共有設定を使用する場合、「共有設定の編集」をクリックして、新しいMAF実行構成の作成または編集ができるダイアログを開きます。「プロジェクトの設定」を使用する場合は、「新規作成」または「編集」をクリックします。共有設定の場合、実行構成はすべてのプロジェクトで共有されます。「共有設定の使用」はデフォルトのオプションであり、この場合、プロジェクトの追加時に存在するMAF実行構成を使用できます。

  4. 「実行構成の編集」ダイアログで、次のように入力します。
    • 左側のツリーから「モバイル実行構成」を選択します。

    • ターゲット・プラットフォームを選択します。

    • デプロイメント・プロファイルを選択します。

    • 最大5桁の長さでポート番号を入力します。この数字は、当初はmaf.propertiesファイルに含まれているjava.debug.port propertyの値によってシードされ、ヒント・テキストとして表示されます。ポートに値が指定されていない場合は、シードされた値が使用されます。

    • iOSの場合、次のオプションを設定します。

      • 「アプリケーション引数」: アプリケーションの実行時の動作をカスタマイズするために、起動時のMAFアプリケーションに渡すことができる引数を入力します。たとえば、-consoleRedirect=/<path>/<to>/log.txtでは、指定されたファイルにログが出力されます。ログ・ファイルを取得するには、パスは絶対パスである必要があります。場所は、現在のユーザーにとって書込み可能である必要があります。

      • 「シミュレータ」: アプリケーションをデプロイする先のシミュレータを選択します。オプションは、インストールされているiOS SDKのバージョンによって異なります。

      • 「iOSバージョン」: シミュレータが使用するiOSのバージョンを選択します。ドロップダウン・メニューには、選択したデバイスがサポートしているiOSのバージョンが表示されます。

    • Androidの場合、次のオプションを設定します。

      • 「ターゲット」: デプロイメント・ターゲット(「エミュレータ」または「デバイス」)を選択します。

      • 「最大試行回数」: 許可する接続試行の最大回数を選択します。

      • 「間隔」(秒): 接続試行間の間隔の長さを秒単位で選択します。

        ヒント:

        Androidデバイスまたはエミュレータの動作が遅いか、またはタイムアウトになる場合、「最大試行回数」または「間隔」を増やして、Javaが初期化し、Androidスターターを強制的に長く待機させるために十分な時間を確保するか、終了する前に試行を増やしてください。

    図31-1 「モバイル実行構成」ダイアログ

    この図は周囲のテキストで説明しています

31.3.2 JavaコードおよびJavaScriptのデバッグを有効にする方法

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.enabledtrueに設定されている場合、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アプリケーションのデバッグ」を参照してください。

31.3.3 MAF AMXコンテンツのデバッグ方法

MAFアプリケーションにMAF AMXコンテンツが含まれている場合は、デバイスまたはエミュレータの構成後、JDeveloperの他のアプリケーションをデバッグするときと同じように、ブレークポイントの設定、変数の内容の表示およびメソッド・コール・スタックのインスペクトを行うことができます。

注意:

デバッグできるのは、JavaコードおよびJavaScriptのみです(「JavaコードおよびJavaScriptのデバッグを有効にする方法」を参照)。EL式または他の宣言要素のデバッグはサポートされていません。

31.4 AndroidプラットフォームにデプロイされたMAFアプリケーションのデバッグ

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コードをデバッグできます。

31.4.1 AndroidプラットフォームでのJavaコードのデバッグ方法

AndroidプラットフォームでMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。

Androidデバイスまたはエミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、「AndroidエミュレータへのAndroidアプリケーションのデプロイ方法」を参照してください。

Androidデバイスまたはエミュレータで実行中のMAFアプリケーションのデバッグを可能にするには、「MAFアプリケーションでのプラグインの使用方法の概要」の説明に従って、ネットワーク情報プラグインが有効であることを確認します

31.4.2 AndroidプラットフォームでのUIコードのデバッグ方法

MAFアプリケーションを開発する際、Androidデバイスでアプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。開発マシンからAndroidデバイスにMAFアプリケーションをデプロイするときに、GoogleのChrome DevToolsを使用して、このコードをデバッグできます。図31-2に、MAFアプリケーションからのAMXページを調べるChrome DevToolsを示します。

図31-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に名前が変更されています。

AndroidデバイスにMAFアプリケーションをデプロイしてUIコードをデバッグするには、次のことを実行する必要があります。

31.5 iOSプラットフォームにデプロイされた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コードをデバッグできます。

31.5.1 iOSプラットフォームでのJavaコードのデバッグ方法

iOSプラットフォームでJDeveloperを使用してMAFアプリケーションのJavaコードをデバッグするには、「コードをデバッグするためのJDeveloperおよびMAFアプリケーションの構成」で説明されているデバッグ手順に従います。

iOSデバイスまたはシミュレータの構成方法、およびデバッグのためのMAFアプリケーションのデプロイ方法については、次を参照してください。

31.5.2 iOSプラットフォームでのUIコードのデバッグ方法

iOS プラットフォームで作業している場合、Safari ブラウザを使用してJavaScriptをデバッグできます。これを行うには、Safariの環境設定を開き、「Advanced」を選択した後、「Show Develop menu in menu bar」を選択して、ブラウザ内の「Develop」メニューを有効にします。

「Develop」メニューが有効になったら、「iPhone Simulator」または「iPad Simulator」を選択し(図31-3および図31-4を参照)、デバッグするUIWebViewを選択します(図31-5を参照)。

注意:

「Develop」メニューにiPhone Simulatorオプションが表示されるか、iPad Simulatorオプションが表示されるかは、どちらのデバイス・シミュレータが起動しているかによって決まります。

featureContentDelay追加ビルド引数を使用して、アプリケーションの最初のページがロードされる前に、カスタムJavaScriptからのログ・メッセージおよびエラーを記録します。この引数は、WebViewにコンテンツが移入されるまでの遅延を指定します。追加ビルド引数-featureContentDelay20に設定します。追加ビルド引数の設定の詳細は、「iOSビルド・オプションの定義」を参照してください。

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

この図は周囲のテキストで説明しています

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

この図は周囲のテキストで説明しています

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

この図は周囲のテキストで説明しています

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

図31-6 リモートWebインスペクタ

この図は周囲のテキストで説明しています

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

この図は周囲のテキストで説明しています

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

図31-8 SafariブラウザでのJavaScriptのデバッグ

この図は周囲のテキストで説明しています

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

この図は周囲のテキストで説明しています

31.6 ユニバーサルWindowsプラットフォームにデプロイされたMAFアプリケーションのデバッグ

UWPにデプロイするMAFアプリケーションのJavaおよびUIコードのデバッグ方法について説明します。

JDeveloperのデバッグ・ツールを使用して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。詳細は、「ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法」を参照してください。

「ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法」の説明に従って、Visual Studioを使用してMAFアプリケーションでJavaScript、HTMLおよびCSSコードをデバッグします。

31.6.1 ユニバーサルWindowsプラットフォームでJavaコードをデバッグする方法

ユニバーサルWindowsプラットフォーム(UWP)にデプロイするMAFアプリケーションでJavaコードをデバッグする方法について説明します。

次の手順を実行して、UWPにデプロイするMAFアプリケーションでJavaコードをデバッグできます。

  1. 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のデバッグを有効にする方法」を参照してください。

  2. 「デバッグ」モードを使用するように、MAFアプリケーションのWindowsデプロイメント・プロファイルを構成します(図31-10を参照)。このダイアログにアクセスするには、「アプリケーション」→「アプリケーション・プロパティ」→「デプロイメント」をクリックします。

    図31-10 MAFアプリケーションのデバッグ・モードの有効化

    このイメージについては周囲のテキストで説明しています。
  3. カスタム・プロジェクトをMAFアプリケーションに追加して、標準のJDeveloperアプリケーションの「実行/デバッグ」構成ダイアログにアクセスできるようにします。このカスタム・プロジェクトをMAFアプリケーションに追加したら、JPDAプロトコルをリスニングする接続を指定して、「リモート・デバッグ」オプションを有効にします。カスタム・プロジェクトでデバッグ・リスナーを開始します。これらのタスクの詳細は、「ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法」を参照してください。

  4. ローカルWindowsマシン・オプションを使用してMAFアプリケーションをデプロイします。詳細は、「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。

Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。

31.6.1.1 ユニバーサルWindowsプラットフォームでMAFアプリケーションのリモート・デバッグを有効にする方法

カスタム・プロジェクトをMAFアプリケーションに追加して、MAFアプリケーションの作成時にMAFアプリケーション作成テンプレートでは表示されない、「実行/デバッグ」構成パネルを表示します。

これらの構成パネルを使用して、UWPにデプロイするMAFアプリケーションのリモート・デバッグを有効にできます。カスタム・プロジェクトを追加して構成したら、カスタム・プロジェクトからデバッグ・リスナーを開始します。
カスタム・プロジェクトを追加してUWPでのMAFアプリケーションのリモート・デバッグを有効にするには:
  1. JDeveloperのメイン・メニューで、「File」→「新規」→「プロジェクト」をクリックし、「新規ギャラリ」ダイアログで「カスタム・プロジェクト」を選択し、「OK」をクリックします。
  2. カスタム・プロジェクトの作成「終了」をクリックし、Project 1という名前のカスタム・プロジェクトを作成します。
    新しいカスタム・プロジェクト(Project 1)が、MAFアプリケーションの「プロジェクト」パネルのApplicationControllerプロジェクトとViewControllerプロジェクトの間に表示されます。
  3. プロジェクトを選択し、JDeveloperのメイン・メニューで「アプリケーション」→「プロジェクト・プロパティ」を選択します。
  4. 「プロジェクト・プロパティ」ダイアログの「実行/デバッグ」ページで、「デフォルト」実行構成を選択し、鉛筆アイコンをクリックして「起動設定」ダイアログを表示し、ここで「リモート・デバッグ」チェック・ボックスを選択します。
  5. 「ツール設定」→「デバッガ」→「リモート」に移動し、図31-11に示すとおりに次のプロパティを構成します。
    1. プロトコル: ドロップダウン・メニューから「JPDAのリスニング」を選択します。
    2. ポート: maf.propertiesファイルでjava.debug.portに構成したポート番号を入力します。
    3. タイムアウト: タイムアウトする秒数を指定します。0はタイムアウトしないことを意味します。
    4. ローカル・アドレス: localhost

    図31-11 UWPにデプロイされたMAFアプリケーションのリモート・デバッグの有効化

    このイメージについては周囲のテキストで説明しています。
  6. 「OK」をクリックして開いているダイアログを閉じます。
  7. 「アプリケーション」ウィンドウの「プロジェクト」パネルで、カスタム・プロジェクト(たとえば、Project 1)を右クリックし、表示されるコンテキスト・メニューから「デバッグ」を選択します。
  8. 「JPDAのリスニング」ダイアログで、接続情報が正しいことを確認し、「OK」をクリックします。
  9. JDeveloperのメイン・メニューで、「Windows」→「プロセス」をクリックし、図31-12に示すようにデバッグ・リスナーが開始されることを確認します。

    図31-12 MAFアプリケーションで開始されるデバッグ・リスナー

    このイメージについては周囲のテキストで説明しています。
Windowsローカル・マシン・デプロイメント・オプションを使用してMAFアプリケーションをデプロイすると、アプリケーションが起動し、JDeveloperとのデバッグ・セッションが確立されます。

31.6.2 ユニバーサルWindowsプラットフォームでUIコードをデバッグする方法

ユニバーサルWindowsプラットフォーム(UWP)でMAFアプリケーションを開発する際、アプリケーションのユーザー・インタフェース(UI)をレンダリングするコードのデバッグが必要になる場合があります。UIをレンダリングするコードには、JavaScript、HTML、CSSなどがあります。Visual Studioを使用してこのコードをデバッグします。

MAFアプリケーション開発で使用するVisual Studioのインストールの詳細は、『Oracle Mobile Application Frameworkのインストール』のユニバーサルWindowsプラットフォーム用の開発ツールの設定に関する項を参照してください。

MAFアプリケーションをデバッグする前に、アプリケーションを開発してデプロイする必要があります。アプリケーションの開発およびデプロイの詳細は、「MAFアプリケーション開発のスタート・ガイド」および「MAFアプリケーションのデプロイ」を参照してください。

UWPにデプロイされているMAFアプリケーションでUIコードをデバッグするには:

  1. デバッグ・モードでMAFアプリケーションをデプロイします。詳細は、「ユニバーサルWindowsプラットフォームへのMAFアプリケーションのデプロイ」を参照してください。
  2. ローカル・マシンにアプリケーションをデプロイしたら、C:\path\to\appRoot\deploy\[DeploymentProfileName]\debug\ディレクトリに移動します。
  3. アプリケーション・アーティファクトが構成されているMafTemplate.slnテンプレート・ファイルをダブルクリックして、Visual Studioで開きます。
  4. Visual Studioで、図31-13に示されているように、CPUの値をx64に設定します。

    図31-13 Visual Studio IDE

    このイメージについては周囲のテキストで説明しています。
  5. 「Script Only」オプションが選択されている場合は、図31-14に示すように、AMXのUIコードをデバッグできます。

    図31-14 Visual Studioワークスペース

    このイメージについては周囲のテキストで説明しています。

31.7 MAFアプリケーションでのロギングの使用および構成

サポートされるすべてのプラットフォームで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デバイスでは、このディレクトリに次のようにアクセスできます。

    1. 「Xcode」→「Devices」とナビゲートします。
    2. 「Installed Apps」セクションのリストからアプリケーションを選択します。
    3. 歯車のアイコンをクリックします。
    4. ダウンロードされたコンテナを選択します。
    5. ダウンロードされた*.xcappdataファイルを右クリックして、「Show Package Contents」を選択します。
    6. 「AppData」→「Documents」→「Logs」を開きます。
    7. 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リファレンスを参照してください。

31.7.1 プロパティ・ファイルを使用したロギングの構成方法

次の例は、ロギングの構成で使用する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: このレベルは、非常に詳細なトレース・メッセージを示します。

警告:

ロギング・レベルの詳細度を選択するときは、SEVEREWARNINGおよび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%

31.7.2 JavaScriptのロギングの使用方法

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リファレンスを参照してください。

31.7.3 埋込みロギングの使用方法

埋込みロギングでは、次の例に示されているとおり、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

31.7.4 iOSプラットフォームでのデバッグおよびロギングにXcodeを使用する方法

MAFプロジェクトの操作にXcodeを使用することは、JDeveloperを使用した次回のデプロイメント中に一部またはすべての変更を失う可能性があるため推奨されませんが、例外的な状況ではこれを使用できます。

始める前に:

アプリケーションをJDeveloperからiOSシミュレータにデプロイします。

生成されたプロジェクトを直接Xcodeで開く手順は次のとおりです。

  1. workspace_directory\deploy\デプロイメント・プロファイル名\temporary_xcode_project\に移動します。

  2. Oracle_ADFmc_Container_Template.xcodeprojというXcodeプロジェクトを開きます。

Xcodeを使用してMAFアプリケーションをデバッグしている場合、IDE内(JDeveloperコンソールまたはXcodeコンソール)ではJavaの出力を表示できません。この出力は、ファイルにリダイレクトされます(「ロギングの使用方法と構成」を参照)。アプリケーションのスキーマに次の引数を追加すると、この動作を無効にし、iOSデバイスまたはシミュレータ上でデバッグを実行するときに、XcodeからJava、JavaScriptおよびObjective-Cのログ出力にリアルタイムでアクセスできるようになります。

-consoleRedirect=FALSE

31.7.5 アプリケーション・ログへのアクセス方法

MAFアプリケーションのアプリケーション・ログ・ファイルをユーザーのデバイスから取得して、MAFアプリケーションで発生している問題を分析できます。これを行う1つの方法は、アプリケーション・ログ・ファイルを、そのデバイス上の場所から、アプリケーションがアプリケーション・ログ・ファイルをデバイスから送信できるディレクトリにコピーすることです。

次の例は、アプリケーション・ログ・ファイルの場所にアクセスし、そのファイルを電子メール・メッセージへの添付が可能な場所にコピーして、ログ・ファイルの内容を分析できる受信者に送信する方法を示しています。

// Create an instance of device manager to access the device’s email functionality later
DeviceManager dm = DeviceManagerFactory.getDeviceManager();

//Construct path to application log file

String path = Utility.ensureTrailingForwardSlash(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DownloadDirectory));
String appName = AdfmfContainerUtilities.getApplicationInformation().getName();
String mobileOS = dm.getOs();

String logFilePath = "";


if ("iOS".equalsIgnoreCase(mobileOS)) {
    logFilePath = path + "/logs/application.log";
} 
else if ("Android".equalsIgnoreCase(mobileOS)) {
    logFilePath = path + "/../../../../" + appName + ".txt";
}


//1. Determine device location to save a copy of the log file 
String mailAccessiblePath =  Utility.ensureTrailingForwardSlash(AdfmfJavaUtilities.getDirectoryPathRoot(AdfmfJavaUtilities.DeviceOnlyDirectory));
String targetFileNameAndPath = mailAccessiblePath + appName + ".log";

//2. Copy file to a location accessible from a mail client
try {
    Utility.copy(new File(logFilePath), new File(targetFileNameAndPath));
} 
catch (IOException e) {
    // If something goes wrong, log the failure to copy.
    Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", "Could not copy file " + logFilePath + " to " + targetFileNameAndPath);
    Utility.ApplicationLogger.logp(Level.SEVERE, this.getClass().getSimpleName(), "sendLogAsMail", e.getLocalizedMessage());
}

//3. Set the attachment property referenced by sendEmail(...)
this.setMailAttachment(targetFileNameAndPath);

//4. Send mail: open the mail client
dm.sendEmail(mailTo, mailCc, mailSubject, mailBody, mailBcc, mailAttachment, mailMimeType);

注意:

アプリケーションをJDeveloperから仮想デバイス(iOSシミュレータまたはAndroidエミュレータ)にデプロイすると、MAFは、アプリケーション・ログ・ファイルではなく、JDeveloperの「ログ」ウィンドウにログ出力を書き込みます。

アプリケーション・ログ・ファイルの場所を取得したら、ユーザーのデバイスからサーバー側に送信するメカニズムを選択します。検討する必要があるオプションとして、REST Webサービスを使用した、アプリケーションに関連付けられているサーバー側の特定の場所へのファイルのアップロードがあります。このオプションでは、ログ・ファイルを電子メール添付ファイルとして送信する別のオプションと比べて、より一貫したユーザー操作性が提供されます。後者のオプションでは、プラットフォーム・デバイス(iOS、Android、UWP)や、電子メール・クライアントがデバイスで構成されている方法に基づいて、異なる動作をとることができます。

MAFアプリケーションのログ・ファイルで取得される詳細レベルは、logging.propertiesファイルの構成エントリによって異なります。ただし、次の例に示すように、たとえばAPIを使用してログ・レベルを実行時に動的に変更している場合は除きます。

Logger l = Utility.ApplicationLogger;
// Select a new log level. Note that OFF disables logging. In our example, we select ALL.
// Level newLevel = Level.<ALL | CONFIG | INFO | FINE | FINER | FINEST | OFF | SEVERE | WARNING>
Level newLevel = Level.ALL;
l.setLevel(newLevel);

31.7.6 ロギングを無効にする方法

ロギング出力がアプリケーション・ログ・ファイルに転送されないように設定できます(この場合、ログ・ファイルは、空白のままになるか、まったく作成されません)。ロギングが無効になると、トレース文はアプリケーション・ログから失われ、stderrおよびstdoutに転送された出力は、すべてnullの場所またはエンド・ユーザーがアクセスできない別の場所にリダイレクトされます。

すべてのロギングを無効にするには、次のようにアプリケーションのadf-config.xmlファイルでdisableLoggingプロパティをtrueに設定します。

<adf-property name="disableLogging" value="true"/>

デフォルトでは、MAFアプリケーションのロギングは有効で、disableLoggingプロパティはfalseに設定されています。

adf-config.xmlファイルの詳細は、「MAFアプリケーションとプロジェクト・ファイルの概要」を参照してください。

31.8 MAFアプリケーションのパフォーマンス測定

MAFは、ユーザーによるMAFアプリケーションのパフォーマンスのモニターおよび測定を支援します。たとえば、アプリケーションで次のイベントの実行にかかる時間を測定できます。

  • ボタンにより起動されたアクションの完了

  • ページのロード

  • RESTコールがレスポンスを返す

また、MAFアプリケーションでモニターする操作の実行時間の平均および標準偏差を示す統計を出力できます。

アプリケーションのlogging.propertiesファイルで次のパフォーマンス・ロガーのロギング・レベルを構成して、パフォーマンス測定を有効にします。次の例でロガーに割り当てられる値は、説明用の値です。使用可能なすべての値の説明は、表31-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

表31-1に、logging.propertiesファイルで設定できる、使用可能なパフォーマンス・モニター・レベルを示します。

表31-1 パフォーマンス・モニター・レベル

レベル 説明
Level.INFO

これは最もおおまかなモニター・レベルです。イベントおよびアクションがモニターされます。このレベルを使用すると、たとえば、ページのロードやエンド・ユーザー・アクションの実行(ボタンのクリックなど)をモニターできます。このモニター・レベルを使用した場合、パフォーマンスへの影響は最小限になります。

Level.FINE
このレベルは、次のカテゴリに分けられる、より多くのパフォーマンス・インジケータをモニターします。
  • JavaScriptおよびレンダリング(システム・レベル)

  • ビジネス・ロジックの処理(アプリケーション・レベル)

  • フレームワークの処理(システム・レベル)

  • 外部データ・アクセス

    • RESTコール(システム・レベル)

    • データベース・アクセス(システム・レベル)

このモニター・レベルを使用するとアプリケーションのパフォーマンスに影響するため、デフォルトでは有効にしないでください。アプリケーションを再構築または調整することを目的として、コードの実行状況に関するインサイトを取得する場合に、このレベルの使用を検討してください。

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ページ間を移動するアプリケーションのサンプル出力は、次のようになります。

例31-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)

31.9 MAFアプリケーションでのWebサービス・コールの検査

MAFアプリケーションが、クライアント・データ・モデルの作成にデザインタイム・サポートを使用して構成されたRESTサービスにアクセスする場合は、再利用可能なアプリケーション機能を追加して、アプリケーションで行われるすべてのRESTコールのリクエストとレスポンスの詳細を表示できます。クライアント・データ・モデルの詳細は、「MAFアプリケーションでのクライアント・データ・モデルの作成」を参照してください。

アプリケーションにこの機能を追加するには、次の手順を実行します。

  1. JDeveloperで、「アプリケーション」メニューに移動し、「アプリケーションのプロパティ」オプションを選択します。「アプリケーションのプロパティ」ダイアログが表示されます。
  2. 「アプリケーションのプロパティ」ダイアログで、「ライブラリとクラスパス」オプションをクリックします(図31-15を参照)。

    図31-15 「アプリケーションのプロパティ」ダイアログ

    前後のテキストでこのイメージを説明しています
  3. 「アプリケーションのプロパティ」ダイアログで、「JAR/ディレクトリの追加」ボタンをクリックします。「アーカイブまたはディレクトリの追加」ダイアログが表示されます。
  4. 「アーカイブまたはディレクトリの追加」ダイアログで、ディレクトリ./jdevinstall/jdeveloper/jdev/extensions/oracle.maf/FARs/CDMに移動し、WebServiceCallsFeature.jarファイルを選択し、「開く」ボタンをクリックします(図31-16を参照)。

    図31-16 「アーカイブまたはディレクトリの追加」ダイアログ

    前後のテキストでこのイメージを説明しています
  5. WebServiceCallsFeature.jarファイルが、「ライブラリとクラスパス」の下に表示されます。「OK」をクリックして「アプリケーションのプロパティ」ダイアログを閉じます。
  6. maf-application.xmlファイルをエディタで開き、「機能参照」オプションを選択します。右側の緑のプラス・アイコンをクリックし、「機能ID」ドロップダウン・リストからoracle.maf.impl.cdm.wscallsを選択します(図31-17を参照)。

    図31-17 maf-application.xmlファイル

    前後のテキストでこのイメージを説明しています
  7. MAFアプリケーションをデプロイして、Webサービス・コールを検査できるアプリケーション機能を表示します(図31-18を参照)。

    図31-18 RESTコールの表示

    前後のテキストでこのイメージを説明しています
  8. リスト内のいずれかのRESTコールをクリックして、すべてのリクエストとレスポンスの詳細を表示できます。