- 博客(77)
- 资源 (5)
- 收藏
- 关注
原创 Android11 SplashScreen 的显示和退出流程
首先对surface进行赋值并清空一些变量,startingSurface是前面通过createStartingSurface得到的SplashScreenSurface对象,然后调用SplashScreenSurface的remove方法。应用的启动到显示到屏幕是需要一定的时间的,为了提升用户的体验,google加入了启动窗口,也就是SplashScreen。可以看出,SplashScreen的添加和系统窗口的添加是一样,都是调用addView去添加一个窗口。
2024-07-12 15:17:30 1152
原创 Android11 应用启动流程
这是因为在启动新进程那条调用链上,如果上一个应用还没暂停,就不会继续往下执行,所以应用暂停完成之后,需要再次调用确保真正启动应用的地方会继续往下执行。Android 11 在AMS和Activity之间的跨进程通讯有变动,现在是采取事物的方式,scheduleTransaction用于传递事务,注意第三个参数,最终导致PauseActivityItem的execute方法被执行。也是采用事物的方式,和应用进程相互通信,最后去执行Activity 的 onCreate,onResume生命周期。
2024-07-10 17:50:19 942
原创 Android11 窗口动画
首先创建LocalAnimationAdapter对象,LocalAnimationAdapter对象中的mSpec成员是WindowAnimationSpec对象,WindowAnimationSpec对象中的mAnimation成员是上一步创建的Animation 对象。首先创建leash图层,然后调用LocalAnimationAdapter的startAnimation继续处理,注意传入的mInnerAnimationFinishedCallback参数,后续动画完成后会回调里面的方法。
2024-07-09 18:22:48 1001
原创 Andorid 11 InputDispatcher FocusedApplication设置过程分析
在Input ANR中,有一类ANR打印的reason 为 “xx does not have a focused window” ,表明 输入事件 5s 内,只有FocusedApplication,而没找到focused window。本文分析下FocusedApplication的设置过程。key事件的传输过程中,去查找焦点app时,就是在该容器中查找。setFocusedApp被几处地方调用,最常见的就是打开应用时,在realStartActivityLocked方法里面调用。
2024-07-08 15:07:22 516
原创 Android13 WMS窗口层级树
首先也是创建临时的叶子PendingArea,leafType默认为LEAF_TYPE_TOKENS,在typeOfLayer方法中,对于IME和Application 有处理,将其leafType设为LEAF_TYPE_TASK_CONTAINERS和LEAF_TYPE_IME_CONTAINERS。注意对于这两种类型,有特殊的处理,mSkipTokens设置为了true,后续将临时的结构树转成真正的层级树的时候有用。构建层级树的核心就是该方法,来分步分析它。经过这一步,此时结构树的构造结果如下。
2024-06-23 17:58:08 1183
原创 Android11 以Window的视角来看FallbackHome的启动
所以经过以上的调用流程,创建了一个home Task,其实home Task就是ActivityStack对象,然后挂载到DefaultTaskDisplayArea下。注释1处,parent为前面创建的FallbackHome Task,mStartActivity为前面创建的ActivityRecord,将ActivityRecord设置为FallbackHome Task的孩子。注释1处创建FallbackHome Task,mTargetStack为前面创建的home Task。
2024-06-17 13:55:08 949 1
原创 Android11 AudioTrack和Track建立联系
对于是客户端创建的内存,客户端使用 StaticAudioTrackClientProxy来管理,对于AudioFlinger创建的内存,使用AudioTrackClientProxy来管理。对于是客户端创建的内存,使用 StaticAudioTrackServerProxy 来管理,对于AudioFlinger创建的内存,使用AudioTrackServerProxy来管理。可以看出,共享内存可以由客户端申请,也可以由AudioFlinger申请。客户端通过mProxy来管理。
2024-06-03 17:20:43 588 1
原创 Android11 AudioTrack 创建过程
首先,通过声音属性,从mProductStrategies中找到strategy,然后根据strategy,找到对应的device。mOutputs中,支持该device的output可能有多个,通过getOutputsForDevices把它们找出来,然后调用selectOutput从中选择一个最符合的。综上,找到output的流程为: audio_attributes_t >>> strategy >>> device >>> output。2,根据device,找到output。
2024-06-03 15:12:04 565
原创 Android 11 Audio strategy配置解析
注释2处,创建ProductStrategy对象时,传入的名字就是gOrderedStrategies中各元素的名字,如:“STRATEGY_PHONE”,“STRATEGY_SONIFICATION”。注释3处,遍历前面得到的mVolumeGroups集合,根据名字进行匹配(用volumeGroup 的名字和“AUDIO_STREAM_VOICE_CALL”,“AUDIO_STREAM_BLUETOOTH_SCO”等进行匹配),找到匹配的volumeGroup。再来看一下图中各结构体的定义。
2024-05-31 11:33:34 1142 1
原创 Android 11 AudioPolicyService 启动流程
在打开输出流的过程中,会得到HAL层的audio_stream_out对象,并将其保存在AudioStreamOut中,创建播放线程的时候,传入该AudioStreamOut,最后将播放线程保存到mPlaybackThreads中。在打开输出流的过程中,会得到HAL层的audio_stream_in对象,并将其保存在AudioStreamIn中,创建录音线程的时候,传入该AudioStreamIn。这个流程和上面的是一样的,最终调用到AudioFlinger的openInput_l处理。
2024-05-29 18:14:10 1101
原创 Android 11 Audio音频系统配置文件解析
其中mHwModules保存的是modules标签下的每个HwModule,解析attachedDevices标签时,会根据其名字找到对应的DeviceDescriptor,然后根据这些DeviceDescriptor的type,分别放入mOutputDevices和mInputDevices中。注释1处,针对不同的Trait类型,就调用不同的子类的deserialize处理。回到modules的解析方法中,mixPorts标签解析完成后,调用HwModule的setProfiles保存解析的结果。
2024-05-28 18:43:54 1269 1
原创 Linux Alsa驱动框架
注册声卡时(调用snd_card_register),会从list链表中取出snd_device,并调用其ops的dev_register 函数,也就是执行snd_ctl_dev_register函数。对于录音和播放节点,都会调用snd_register_device往snd_minors数组中放入元素,播放节点对应的f_ops为snd_pcm_f_ops[0],录音对应的为snd_pcm_f_ops[1]snd_pcm_f_ops[0]对应的是播放,snd_pcm_f_ops[1]对应的是录音。
2024-05-27 14:59:54 424
原创 Android11重复事件上报流程
可以看出,这里取出的是上次保存的事件,并根据上次事件的各个参数的值,重新生成KeyEntry,去重复上报。后续的上报处理流程就和之前的流程是一样的。需要注意的是,后续重复事件上报的间隔默认为50ms。大多数的按键驱动,即使按键一直按着,也不会一直上报事件,而是只上报一个down事件,那对于事件的重复上报,自然而然就交给了Android 的输入子系统。上面的方法只是保存了当前事件,并设置了下次上报的时间间隔是400ms,那再次上报是在哪里上报的呢?
2024-05-23 11:19:03 607
原创 Android11 事件分发流程
dispatchTransformedTouchEvent的含义是如果child是ViewGroup的话,就继续调用ViewGroup的dispatchTouchEvent方法继续向下分发,如果child是view的话,则调用view的dispatchTouchEvent来处理事件。deliver方法的原理就是输入事件会经过这些InputStage依次处理(调用onProcess方法),如果事件已经被上一个消费处理了,后面的stage就不会处理了。
2024-05-21 12:19:42 1327
原创 Android 11 触摸小圆点显示流程
当SHOW_TOUCHES 这个key的值有改变时,调用updateShowTouchesFromSettings方法,在updateShowTouchesFromSettings方法中,是调用nativeSetShowTouches这个native方法,直接来看下这个方法。小圆点的图片资源已经被加载,并将其保存在相应的变量中了,接下来就需要将其显示出来了。在开发者选项中,打开 “显示点按操作反馈” 开关,当我们在触摸屏幕时,会显示一个小圆点,来分析下小圆点的显示流程。
2024-05-21 10:10:55 1109
原创 Android 触摸事件分离原理
查找到window2窗口后,因为window2也支持分离事件,所以也是进入注释2处的分支将isSplit 设为true,然后就是window2加入到tempTouchState中,该事件可分发至window2窗口。屏幕上存在多个窗口时,多指触摸的情况下,多个手指的触摸事件可以分给不同的窗口,以下面的图为例,第一个手指按下,window1可以响应这个事件,第二个手指按下(第一个手指不松开),window2同样也可以响应第二个手指按下的事件,两个手指的触摸事件被分离到了不同的窗口,这就是触摸事件分离。
2024-05-16 11:43:05 710
原创 Andorid Input事件 注入方法及原理介绍
如果APP不是放在系统源码中编译,直接使用这个方法的话,肯定是编译不过的,这时候我们可以借助Instrumentation类来实现模拟一个输入事件,例如注入一个MotionEvent 的down事件。3,对于自己应用内的事件注入,是有权限的,但是如果想注入事件到其它的应用,是需要申请INJECT_EVENTS权限的,而这个权限是需要系统签名的应用才能申请。在Android系统中,除了真实的输入设备可以产生事件之外,我们也可以通过软件的方式,模拟一个输入事件,比如模拟一个点击事件,模拟一个按键事件等等。
2024-05-14 12:14:05 559
原创 Android 11 输入系统之InputDispatcher和应用窗口建立联系
本文介绍InputDispatcher和客户端进程建立联系的过程,核心是通过socketpair产生两个fd
2024-05-09 17:07:34 1532 1
原创 Android 11 bindService 流程分析
本文主要介绍bindService的内部流程,以及onServiceConnected是如何调用到的
2024-04-28 18:12:13 1316 1
原创 binder 双向通信时客户端没有joinThreadPool也能接收到服务端的请求
原来在客户端远程调用say_hello方法后,就会通过waitForResponse等待服务端返回数据,而刚好,我回调的方法又是写在say_hello方法中,这就导致服务端在该方法内发出BC_TRANSACTION,那在客户端就会收到BR_TRANSACTION,进而正确的调用到对应的方法。但是今天我在用C++写binder双向通信的代码时,发现,我客户端并没有调用joinThreadPool或者startThreadPool,也能接收到服务端的请求,而且能正确的调用对应的方法,这是为什么呢?
2024-04-26 15:44:22 190
原创 Andorid UNIX SOCKET c代码进程和java代码进程之间通讯
一文的实战中,服务端和客户端的代码都是用C语言写的,而Androidd的系统源代码以及APP大多数都是java写的,那么不同的语言写的进程之间,能不能互相通信呢?java代码也是一样的,在connect方法中也是调用socket和connect 来和服务端建立连接。对于UNIX SOCKET ,C代码和Java代码之间是可以相互通信的,并且可以相互作为客户端和服务端通信。需要注意的是,address的Namespace默认为ABSTRACT,在调用connect的过程中,对于ABSTRACT,有以下处理。
2024-04-25 17:47:43 372 2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人