
frameworks
文章平均质量分 86
天花板之恋
在coding的路上
展开
-
Android14(U)文件扫描源码探究
以上代码是对扫描到的文件做的逻辑处理,首先会获取文件的mediatype类型,然后再根据文件的路径去媒体数据库查找,看是否之前已经存在了该数据项。首先会把MediaProvider里面的多媒体数据全部查询出来,然后对游标获取的数据做逐个对比,使用Arrays.binarySearch函数,去查看数据库中读取的id是否在本次扫描缓存的id集合中,如果不存在,那么返回的值就会小于0,就把这个数据库中读取出来的id放入mUnknownIds集合中,即这个id需要在后续从MediaProvider数据库中被删除。原创 2024-09-02 16:34:40 · 1046 阅读 · 0 评论 -
Activity的创建过程源码分析
一、概述Activity的启动过程,涉及到多个进程以及跨进程通信IPC,总体的时序图如下所示,后面们会分步讲解。二、源码分析过程1.Activity A 发起startActivity,如下:会调用到Instrumentation的execStartActivity方法:这里我们看到,调用了ActivityTaskManager提供的远程接口,并且传入了一堆参数进去,主要的参数有intent、token、whoThread。intent我们都知道这是表示一个意图,也就是我们想要启动的Activi原创 2022-06-11 11:35:21 · 3245 阅读 · 0 评论 -
Android HeadSetClient端通话的传递
Android源代码中,如果通话状态有改变,会沿着这样的顺序传递:蓝牙chip >> HCI接口 >> BlueDroid协议栈 >> Bluetooth >> 广播传递 >> Telecom ,下面重点介绍一下数据在Bluetooth内的传递过程:通话状态有改变,会通过NativeInterface这个类里面的onCallSetup方法回调通知:public class NativeInterface { ......... p原创 2021-09-24 14:59:22 · 1668 阅读 · 0 评论 -
Android HeadSet端的通话建立过程
蓝牙的HFP协议定义了两个角色,一个是HF端,如蓝牙耳机、车机端等免提设备;一个是AG端,通常指的就是手机端。在Android系统里面,也有对应的两个Profile,HF端对应HeadsetClient Profile,而AG端对应Headset Profile。下面我们就通过拨号指令,梳理Headset端的处理过程。首先来看一下整体的流程图:1.首先拨号的指令在HF端发出,经过两端蓝牙chip的信号传递,到达AG侧的协议栈中,在协议栈经过解析之后,已经明确了此为一个拨号的请求,于是就会通过JNI层原创 2021-09-22 14:50:23 · 1666 阅读 · 0 评论 -
BluetoothHeadSetClient的framework修改
1.概述:BluetoothHeadSetClient是Android系统中对于HFP协议HF端的定义,HFP协议AG端则是BluetoothHeadSet相关的定义。通常情况下,手机对应的是AG端;而类似于车机、蓝牙耳机等设备,对应的是HF端。Android原生的SDK是针对手机开发的,所以会发现在原生API中找不到BluetoothHeadSetClient相关的定义,这个时候我们就要去源码一探究竟了。2.修改源码可以看到源码中对BluetoothHeadSetClient是做了隐藏的:(an原创 2021-08-04 14:55:29 · 1477 阅读 · 2 评论 -
Settings的蓝牙搜索过程分析
1.界面触发扫描在Android原生的系统设置里面,点击添加新设备的“加号”按钮后,就会触发BluetoothScanningDevicesGroupPreferenceController的状态改变,然后去开启扫描:protected void updateState(PreferenceGroup preferenceGroup) { super.updateState(preferenceGroup); if (shouldEnableScanning()) {原创 2021-07-28 11:23:51 · 719 阅读 · 0 评论 -
Android系统开启蓝牙源码分析(下)
上篇博客我总结了Android打开蓝牙分为4个阶段,第一阶段就是打开蓝牙的方法从APP调到systemServer再到Bluetooth协议栈,最后走到了hardware蓝牙硬件设备。如下图绿色虚线的流程:经过了硬件的一些列操作,正真打开了蓝牙设备,下面继续分析。第二阶段:(对应图中蓝色虚线流程)在蓝牙打开成功之后,JNI层会通过JniCallbacks的stateChangeCallback方法把消息回调给AdapterService处理,AdapterService则继续把消息给到状态机处理:原创 2021-07-23 20:11:45 · 2166 阅读 · 3 评论 -
Android系统开启蓝牙源码分析(上)
Android系统的蓝牙打开过程,涉及到APP应用层、framework框架层和Bluetooth协议栈层,总体的流程图可以参考如下:可以看到,开启的流程大致分为4个阶段:第一阶段: (对应图中绿色虚线流程)应用软件调用BluetoothAdapter的enable()方法,通过Binder远程调用到BluetoothManagerService里面对应的enable方法:@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) pu原创 2021-07-23 15:23:09 · 2979 阅读 · 2 评论 -
Bluetooth HFP连接过程分析
class BluetoothService extends SystemService {private BluetoothManagerService mBluetoothManagerService;public BluetoothService(Context context) { super(context); mBluetoothManagerService = new BluetoothManagerService(context);} public void on原创 2021-04-07 11:48:41 · 2908 阅读 · 0 评论 -
Dialog源码分析
我们先看一下Dialog的构造函数://构造函数Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) { if (createContextThemeWrapper) { if (themeResId == Resources.ID_NULL) { final TypedValue outValue原创 2020-11-09 10:54:18 · 209 阅读 · 0 评论 -
Activity、Window、View、ViewRootImpl的理解
概述:对于题目中的几个对象,我们可以简单地理解为Activity封装了Window,而Widnow又封装了View,而View又是通过ViewRootImpl把它添加WindowManagerService中去的。要较详细的分析,我们可以先从Activity的启动开始分析。源码分析:一个Activity开始启动的时候,会在ActivityThread中调用handleLaunchActivityhandleLaunchActivity(ActivityClientRecord r,原创 2020-11-09 10:04:29 · 764 阅读 · 2 评论 -
多媒体MediaScanner机制探究学习
概述:MediaScanner和媒体文件扫描有关,例如music的歌曲专辑名、播放时长,图片的大小、MINE类型等,都是它扫描得到的。我们应用程序通过MediaStore接口查询媒体数据库得到的多媒体数据也和MediaScanner有关,因为数据库里面的数据都是MediaScanner添加的。总体关系如下图:MediaScanner大体分为四个部分MediaScannerReceiver:...原创 2019-09-05 14:55:30 · 445 阅读 · 0 评论 -
Vold和MountService关系探究
1、VoldVold是Volume Daemon的缩写,它是Android平台中外部存储系统的管控中心,包括SD卡的拔插事件检测、SD卡挂载、卸载、格式化等等。2、MountServiceMountService运行在system_server进程,它会和Vold交互,一方面它接受Vold的消息并处理,比如应用程序常监听的ACTION_MEDIA_MOUNTED/ACTION_MEDIA_...原创 2019-09-03 20:26:27 · 369 阅读 · 0 评论 -
Handler机制中线程切换和消息阻塞再剖析
1、Handler是如何实现线程转换的? 如果要理解知识点,我们必须要清楚MessageQueue、Looper、和Handler的内在联系和运行机制。总体来说,Looper.prepare()方法为当前线程创建了一个Looper对象和一个MessageQueue对象,然后把他们放到线程的本地存储区ThreadLocal里面,Looper.loop()方法变开始不断从MessageQue...原创 2018-08-26 00:22:08 · 3327 阅读 · 1 评论 -
关于Binder机制的学习和理解
1、Android为什么选用Binder? 虽然Linux已经存在很多IPC的方式,比如Socket、管道、消息队列、共享内存等,但是这些方式还是存在一些不足的地方。 a、首先传统的IPC机制没有安全措施,接收方无法获取对方进程的进程ID或者UID,完全需要依靠上层的协议,比如用户密码这些来保护。但是Android系统为每一个应用程序都分配了用户ID(UID),通过UID可以甄别进程的身份,控...原创 2018-08-14 17:01:09 · 694 阅读 · 0 评论 -
Android AudioFocus音频焦点机制学习和理解
1、为什么会有音频焦点机制? 我们android系统里面会安装各种多媒体软件,如果不制定一个有效合理的规则,各个应用各自为政,那么可能就会出现各种播放器、软件的混音。音频焦点机制规定某一时刻只能有一个应用获取到声音的焦点,这个时候就可以发出声音。当然,在这个应用获取到焦点之前,需要通知其他所用的应用失去焦点。2、使用音频焦点//获取焦点AudioManager mAudio...原创 2018-08-17 16:32:56 · 13629 阅读 · 0 评论