チュートリアル

1. AndroidでDT10を使う為のドライバ作成

1.1. サンプルドライバのダウンロード
対応OS 接続方式 言語 イベントID出力方式 ダウンロード
Android OS ファイル書き出し Java ドライバ対応方式 ダウンロード
※カーネル情報出力ポイント挿入専用のドライバになります。
アプリ側の「イベントID出力方式」の設定では、必ず「カーネル情報出力ポイント挿入」を選択してください。
1.2. カーネルへDT10のドライバを追加する

1. $(kernel)/drivers/miscフォルダ下に、「dt_datawriting_drv.c」ファイルをコピーし、Makefileを修正します。

obj-$(CONFIG_SCHED_HMP)    += cci400.o
obj-$(CONFIG_MIPI_LLI)     += mipi-lli/

#for DT10
obj-y               += dt_datawriting_drv.o

※ドライバの修正内容については「Linux kernelデータ取得用ファイル書き出しドライバ」をご参考ください。

1.3. SHARED_LIBRARYの登録

AndroidOS側からカーネルのprocファイルシステムへwriteするドライバを「Shared Library」として登録します。
1. $(android)/externalフォルダにdt10_libフォルダを作成し, 「Android.mk」と「dt10drv.c」ファイルをコピーします。

 external/dt10_lib/
      ├── Android.mk
      └── dt10drv.c									

2.「core.mk」ファイルにモジュール登録します。

$vi ./my-android-git/build/target/product/core.mk
PRODUCT_PACKAGES := \
…
libdt10drv \ 
1.4. Android Third Party APIの登録

Java領域からデータを取得するため、Java用ドライバをAndroid Third Party APIとして登録します。

1. $(android)/frameworks/base/core/java/android/utilフォルダへ「DtTestPointDriver.java」ファイルをコピーします。
2. $(android)/frameworks/base/core/jniフォルダへ「android_util_DtTestPointDriver.cpp」ファイルをコピーします。
3. $(android)/frameworks/base/core/jni/Android.mk ファイルを以下のように修正します。

LOCAL_SRC_FILES:= \
	ActivityManager.cpp \
	AndroidRuntime.cpp \
	…
	android_util_DtTestPointDriver.cpp \
	…
 
LOCAL_SHARED_LIBRARIES := \
	…
	libharfbuzz_ng \
	libdt10drv \
	libz						

4. $(android)/frameworks/base/core/jni/AndroidRuntime.cpp ファイルを以下のように修正します。

namespace android {
 
/*
 * JNI-based registration functions.  Note these are properly contained in
 * namespace android.
 */
extern int register_android_content_AssetManager(JNIEnv* env);
extern int register_android_util_EventLog(JNIEnv* env);
extern int register_android_util_Log(JNIEnv* env);
extern int register_android_util_DtTestPointDriver(JNIEnv *env);
extern int register_android_content_StringBlock(JNIEnv* env);
extern int register_android_content_XmlBlock(JNIEnv* env);
extern int register_android_emoji_EmojiFactory(JNIEnv* env);
	…
 
static const RegJNIRec gRegJNI[] = {
    REG_JNI(register_android_debug_JNITest),
    REG_JNI(register_com_android_internal_os_RuntimeInit),
    REG_JNI(register_android_os_SystemClock),
    REG_JNI(register_android_util_EventLog),
    REG_JNI(register_android_util_Log),
    REG_JNI(register_android_util_FloatMath),
    REG_JNI(register_android_util_DtTestPointDriver),
    REG_JNI(register_android_text_format_Time),
    REG_JNI(register_android_content_AssetManager),
	…						
1.5. ProcFileOutputファイル追加

ProdFileOutputは、カーネルのメモリに格納されているテストポイントのデータをファイルに書き出すアプリケーションです。
通常アプリとして作成し、端末へインストールすることも可能ですが、こちらではOS内部のアプリとして追加する方法を説明します。

1. $(android)/externalフォルダにDT10ProcFileOutputフォルダを生成し、
「ProcFileOutput.c」と「Android.mk」ファイルをコピーします。

  external/DT10ProcFileOutput/ 
   ├── Android.mk
   └── ProcFileOutput.c								

※ビルドした後、端末の/system/binフォルダ下に「ProcFileOutput」ファイルが存在します。

2. カーネル及びAndroidのビルド

2.1. カーネルのビルド

カーネルを再ビルドし、dt10のドライバが正しくコンパイルされたかを確認します。
「dt_datawriting_drv.o」ファイルが生成されていれば、ビルドは正しく完了しています。

$make –j4
2.2. Androidのビルド

android.util.DtTestPointDriverという新しいクラスをAndroid OSに追加している為、
AndroidのAPIをアップデートする必要があります。

$source build/envsetup.sh
$lunch PRODUCT_BOARD-eng
$make update-api
$make								

※PRODUCT_BOARDには端末にて断りますので、ご使用の端末のものを指定してください。

「Shard Library」が正しく登録された場合は、「libdt10drv.so」が生成されます。
update-apiにてAndroid APIが正しく登録された場合は、「$(android)/frameworks/base/api/current.txt」ファイルに
DtTestPointDriverクラスが登録されています。

3. テストポイント挿入

3.1. Native領域へテストポイント挿入止

Native領域(C/CPP)へテストポイントを挿入する場合は、登録した「Shared Library」を使用するように
「Android.mk」ファイルを修正する必要があります。
以下のようにテストポイントを挿入したソースコードがあるフォルダの「Android.mk」ファイルを修正します。

LOCAL_SHARED_LIBRARIES := \
libdt10drv \
3.2. Javaファイルのテストポイント挿入

C/CPPファイルの場合は「DT_xxx.h」というヘッダファイル生成され、その中にテストポイント用APIが
宣言されている為、設定は不要ですが、Javaの場合はDtTestPointDriverクラスをImportする必要があります。
以下の設定でDtTestPointDriverクラスを自動でImportするように設定します。
1. 「ファイル」→「プロジェクト設定」を選択し、プロジェクト設定ダイアログを表示します。
2. 「ソースファイルのプロパティ」→「Java」タブを選択し、インポートの設定内容を以下画面のように設定します。

android-devices1

3.3. カーネルのcontext_switch情報

以下のページを参考にしてください。
https://hldc.co.jp/support/by-product/dt10-dts/tutorial/advanced/dt10-mastering-skills/skill2/skill2-2/

4. データ取得方法

4.1. データ取得の開始/停止

Android Targetをブート後、procファイルシステムを制御してデータ取得を開始/停止できます。

root@android:/ # echo 2 > /proc/dt10proc ★Buffer初期化
[146.235717] [DT10] Buffer Clear.
 
root@android:/ # echo 1 > /proc/dt10proc ★データ取得開始
[140.325677] [DT10] Trace Start.
—> 端末を操作してデータを取得
root@android:/ # echo 0 > /proc/dt10proc ★データ取得停止
[146.235717] [DT10] Trace Stop.
 
root@android:/ # ProcFileOutput ★カーネルのバッファ内容を「Convert.DAT」ファイルへ書き出す
>>>270 bytes saved.

データを取得し、保存された「Convert.DAT」ファイルをadb経由でPCへコピーします。

hldc0055@hldc0055-ubuntu:~/OdroidXU$ adb pull /sdcard/Convert.DAT .
3 KB/s (270 bytes in 0.077s)
hldc0055@hldc0055-ubuntu:~/OdroidXU$
4.2. Convert.DATファイルのImport

1. DT10で「ファイル」→「インポート」→「「ファイル書き出し」で取得したレポートデータ…」を選択します。

android-devices2

2. 「追加」ボタンをクリックし、「Convert.DAT」ファイルを選択します。

android-devices3

3. 「データフォーマット…」ボタンを選択します。

android-devices4

4. 1レコードのバイトサイズを18Byteに設定し、「時間データを絶対時間として扱う」にチェックします。

android-devices5

5. マルチコア環境の場合は「ターゲットCPU:マルチコア」をチェックし、インポート後、
レポートデータをすぐ表示したい場合は「インポート完了後に最新のテストレポートを開く」をチェックします。

android-devices6

6. インポートが完了したら、テストレポートが表示されます。

android-devices7