2016-08-01 14 views
0

私はHALモジュールの寿命と使い方について混乱しています。伝統的に、HALモジュールは、様々な機能へのフックのセットとして実装され、共有ライブラリにコンパイルされます。 libhardwareにリンクしている2つのアプリケーションがあり、どちらもコードのどこかにhw_get_module()を呼び出しているとします。Android:HALモジュールのインスタンスが1回だけありますか?

struct my_audio_stream { 
    struct audio_stream base;  /* base HAL */ 
    int count; 
} 

struct audio_module HAL_MODULE_INFO_SYM = { 
    .base = 
     .common = { 
      .tag = HARDWARE_MODULE_TAG, 
      .module_api_version = AUDIO_MODULE_API_VERSION_0_1, 
      .hal_api_version = HARDWARE_HAL_API_VERSION, 
      .id = AUDIO_HARDWARE_MODULE_ID, 
      .name = "USB audio HW HAL", 
      .author = "The Android Open Source Project", 
      .methods = &hal_module_methods, 
     }, 
} 

1つのアプリケーションでカウント変数をインクリメントすると、他のアプリケーションに表示されますか?つまり、my_audio_streamモジュールのグローバルインスタンスは1つだけですか?

答えて

1

hw_get_module()は最終的にそれを呼ばれる特定のプロセスのためのライブラリをロードしますdlopen()

dlopen()を呼び出します。 .text(実行可能コード)は共有オブジェクトのプロセス間で共有されますが、プロセスごとに.so(グローバル/静的オブジェクトの場合など)に必要なストレージが割り当てられます。

2つのプロセスがhw_get_module()を呼び出した場合、.soで宣言されたグローバルこれらのプロセス間で共有することはできません。

1つのプロセスで増分されたカウントは、他のプロセスでは認識されません。

Androidは、HALモジュールのインスタンスを1つだけロードし、永遠に内部的に使用します。 (Audio Serverのインスタンスは1つだけです)

アプリケーション/プロセスからHALの内部にアクセスする必要がある場合は、HALにある種のIPCを実装する必要があります。

関連する問題