Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android framework回顧(3)binder利用及IBinder BpRefbase IInterface INTERFACE 之間關系

Android framework回顧(3)binder利用及IBinder BpRefbase IInterface INTERFACE 之間關系

編輯:關於Android編程

status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index, audio_devices_t device){
const sp& aps = AudioSystem::get_audio_policy_service();//
if (aps == 0) return PERMISSION_DENIED;
return aps->setStreamVolumeIndex(stream, index, device); //(1)
}
virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, int index, audio_devices_t device){
Parcel data, reply;
data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
data.writeInt32(static_cast (stream));
data.writeInt32(index);
data.writeInt32(static_cast (device));
remote()->transact(SET_STREAM_VOLUME, data, &reply);//(2)
return static_cast (reply.readInt32());

}

我在追查音量設置問題是,從(1)追到(2),就不知道怎麼追查了,
grep -r setStreamVolumeIndex . 搜到AudioPolicyService,裡面也有setStreamVolumeIndex這個函數,貌似會調用到這裡。
打印log發現果然會走到這裡,可是代碼怎麼走到這裡的呢?這就需要我們了解binder原理。

如下圖:是IBinder BpRefbase IInterface INTERFACE 之間關系圖。

\

有了此圖,雖然看不出binder是怎麼實現的,但是我們就能大致binder是怎麼利用的。

用setStreamVolumeIndex分析數據的流向。

如下圖:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20141023/2014102308594111.png" alt="">

有一個關鍵點,就 是AudioPolicyService,是怎麼傳遞到aps裡面的mRemote裡面的,就是通過重寫的interface_cast傳遞的。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved