1. 程式人生 > >Android framework回顧(3)binder利用及IBinder BpRefbase IInterface INTERFACE 之間關係

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

status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index, audio_devices_t device){
    const sp<IAudioPolicyService>& 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 <uint32_t>(stream));
    data.writeInt32(index);
    data.writeInt32(static_cast <uint32_t>(device));
    remote()->transact(SET_STREAM_VOLUME, data, &reply);//(2)
    return static_cast <status_t> (reply.readInt32());

}

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

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


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

用setStreamVolumeIndex分析資料的流向。

如下圖:


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