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传递的。

时间: 2024-08-04 02:19:12

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->set

Android framework回顾 sp 和 wp sp对象

用MediaPlayer说明sp的实现.sp是一个模板类,T是RefBase的子类.只要继承于RefBase的类都可以使用sp.binder类也继承RefBase类,binder的实现离不开RefBase. 用如下代码说说我遇到的疑惑. 201 static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) 202 { 203     Mutex::Autolock l(sLock); 204     MediaPlayer*

Android Framework 记录之二

原文地址:http://blog.csdn.net/banketree/article/details/24982021 接着上次的记录,续写. 23.services目录 文件 描述 class AlarmManagerService extends IAlarmManager.Stub { //定时管理服务 public class AppOpsService extends IAppOpsService.Stub {  // 程序选项服务 public class AppsLaunchFa

Android Framework 分析---PackageManager 分析

在windowphone,ios和android中到目前为止,还是android的市场份额最大.个人认为除了google开源外,广大开发者早就了android的霸主地位.各位兄弟姐妹开发出各种各样的apk,才组成android的广阔天下.本篇主要分析一下android系统是针对处理这些apk的,主要涉及到pm这块的代码.分析这种底层服务,最好从android的开启启动流程中开始分析.因为这样才能更清楚的了解服务的启动流程. 1.在SystemServer.java 中启动PM android 开

如何从C++代码直接访问android framework层的WifiService

说到底,Java层的service就是就C++层的binder的封装,所以从原理上来讲通过C++代码直接访问android framework层的service是完全可能的,这篇文章以访问WifiService为例,讲解如何去实现这个功能. 费话少说,直接上代码: WifiTest.cpp #include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadSt

[Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

博客首页:http://www.cnblogs.com/kezhuang/p/ 关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下 <[Android FrameWork 6.0源码学习] Window窗口类分析> 本章博客是接着上边那篇博客分析,目的是为了引出分析ViewRootImpl这个类.现在只是分析完了Window和ActivityThread的调用过程 从ActivityThread到WindowManager再到ViewRoo

怎样从C++代码直接訪问android framework层的WifiService

说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiService为例,解说怎样去实现这个功能. 费话少说.直接上代码: WifiTest.cpp #include <sys/types.h> #include <unistd.h> #include <grp.h> #include <binder/IPCThreadSt

Android Framework中的线程Thread及它的threadLoop方法

当初跟踪Camera的代码中的时候一直追到了HAL层,而在Framework中的代码看见了若干个Thread.它们普遍的特点就是有一个threadLoop方法.按照字面的意思应该是这个线程能够循环处理数据.对应我想到到了java上层中的HandlerThread,这个估计也差不多,但当时心里总有一个疙瘩,想弄清楚它到底是怎么循环起来的. Android中java世界的Thread 先来看看java是怎么创建一个线程的.这个是最舒服的,也是我最熟悉的. new Thread(new Runnabl

[Android][Framework]Activity启动流程

开始 从Launcher点击一个App图标,会触发如下动作: LauncherActivity.java protected void (ListView l, View v, int position, long id) { Intent intent = intentForPosition(position); startActivity(intent);} 走到了 Activity.java 的startActivity相关方法: public void startActivity(Int