设置中扫描到蓝牙显示流程

131 阅读3分钟

初始化 frameworks/base/packages/SystemUI/src/com/android/systemui/Dependency.java 其中 @Inject Lazy mPluginDependencyProvider;

class PluginDependencyProvider extends DependencyProvider 

@Module(includes = {SettingsLibraryModule.class}) 
class DependencyProvider

SettingsLibraryModule中会调用 LocalBluetoothManager.create() 
会去实例化一些Manager比如: 
new CachedBluetoothDeviceManager() 
new LocalBluetoothProfileManager(LocalBluetoothAdapter,mCachedDeviceManager,mEventManager)
new BluetoothEventManager(LocalBluetoothAdapter,mCachedDeviceManager) 
其中BluetoothEventManager会注册蓝牙一系列相关的广播,监听到广播后会回调到
interface BluetoothCallback{} 



设置中 
DeviceListPreferenceFragment implements BluetoothCallback mLocalManager.getEventManager().registerCallback(this); 
在onDeviceAdded(CachedBluetoothDevice cachedDevice)方法中 
构建BluetoothDevicePreference 
其中注意方法setVisible(visible);及notifyHierarchyChanged(); 
然后 
PreferenceGroup.addPreference(BluetoothDevicePreference); 


frameworks/base/core/java/android/preference/PreferenceGroup.java

androidx中PreferenceGroupAdapter源码:
https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-preference-release/preference/preference/src/main/java/androidx/preference/PreferenceGroupAdapter.java


PreferenceGroupAdapter implements OnPreferenceChangeInternalListener 
其中的方法 onPreferenceHierarchyChange() 
会调用 mHandler.removeCallbacks(mSyncRunnable); 
mHandler.post(mSyncRunnable);
消息队列中移除所有相关联的待处理消息,如果已经被安排执行但尚未开始或者正在等待执行,那么将取消它的执行。  
而在中mSyncRunnable的run中只有一个方法updatePreferences() 
(这里androidx的PreferenceGroupAdapter源码和frameworks中的有区别,以下是androidx中的) 

visiblePreferenceList = createVisiblePreferencesList(mPreferenceGroup);
循环group.getPreferenceCount() 并 visiblePreferences.add(preference); 
其中有一个条件会跳出循环 if(!preference.isVisible()){continue;} 
最终getItemCount()方法返回的也是mVisiblePreferences.size();
DiffUtil.DiffResult.dispatchUpdatesTo(RecyclerView.Adapter); 
BatchingListUpdateCallback.onChanged() 
interface ListUpdateCallback{} 
androidx 中的 RecyclerView mObservable.registerObserver(AdapterDataObserver); notifyItemRangeInserted(positionStart, itemCount) 
triggerUpdateProcessor() 
requestLayout();

接下来就是view的刷新流程 frameworks/base/core/jni/android_view_DisplayEventReceiver.cpp frameworks/native/libs/gui/DisplayEventReceiver.cpp frameworks/native/libs/gui/ISurfaceComposer.cpp

ViewRootImpl.requestLayout(); 
scheduleTraversals(); 
注册一个回调 
Choreographer.postCallback(mTraversalRunnable);
TraversalRunnable implements Runnable { run(doTraversal()) } 
继续 
postCallbackDelayed(); 
postCallbackDelayedInternal(); 
scheduleFrameLocked(); 
这个方法中: 
取对应类型的CallbackQueue添加任务,包装存入下一个节点 mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token);

如果还没有到期,设置消息为异步并在指定的时间后将MSG_DO_SCHEDULE_CALLBACK消息发送到消息队列中 FrameHandler extends Handler 中 handleMessage what值为 MSG_DO_SCHEDULE_CALLBACK doScheduleCallback()
scheduleFrameLocked(); 


如果已经到期就注册请求垂直同步信号,native方法会回调到onVsync() 
scheduleVsyncLocked();
FrameDisplayEventReceiver.scheduleVsync(); 
static native void nativeScheduleVsync(long receiverPtr); 
实际该方法会调用
DisplayEventDispatcher.scheduleVsync(); 
{ 
(如果获取到了Vsync信号) 
processPendingEvents();
DisplayEventReceiver.getEvents(); 
通过socket读取数据 recvObjects();
将接收到的数据放入到对应的缓冲区,并返回数据之后,会校验返回的具体的数据类型。
read();
} 

{ 
(然后请求下一个Vsync信号)
requestNextVsync() 
通过mEventConnection连接请求下一个Vsync信号 当有Vsync信号过来时,会调用一个notify_all()唤醒所有 已连接 执行了**wait()**方法的线程
EventThread::threadMain()会不断的循环查询所有的连接(监听) 
如果找到了能够消耗事件的连接,则调用dispatchEvent分发事件, 如果当前为空闲状态则调用wait()。 dispatchEvent() 
EventThreadConnection.postEvent() 
sendEvents() 
sendObjects() 
write() 
往vaddr中写数据,当mSendFd写入文件以后,与之对应的mReceiveFd则能接收到数据, 然后mReceiveFd则会调用对应的回调函数 
} 

{ 
(回调到接收端流程)
mReceiveFd接收到数据后,调用 DisplayEventDispatcher::handleEvent() 进行分发 dispatchVsync() 
最终调用Java中的dispatchVsync() 
onVsync() 
} 

这里是接收端 
在DisplayEventReceiver的构造方法中,会调用 
nativeInit(DisplayEventReceiver,VsyncEventData, mMessageQueue, vsyncSource, eventRegistration, layerHandle)。 
该方法中初始化NDReceiver并返回对应的初始化结果 
new NativeDisplayEventReceiver().initialize(); 
其中NDReceiver中又创建了 DisplayEventDispatcher 继承 DisplayEventDispatcher 
构造方法中 传入vsyncSource到 DisplayEventReceiver 

获取SurfaceFling服务,并保存在ComposerService中
sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 

通过binder,最后跨进程调用建立与SurfaceFlinger服务的连接 
mEventConnection = sf->createDisplayEventConnection(vsyncSource, configChanged);

EventThreadConnection的构造方法中创建了一对socket,然后将mReceiveFd和mSendFd进行了绑定。
当Vsync到来的时候通过mSendFd写入消息,然后就可以监听文件的变化 
创建EventThreadConnection对象的时候会自动调用onFirstRef() 会将我们创建的连接放入到EventThread管理的mDisplayEventConnections中,然后唤醒AppEventThread线程使能Vsync信号 

其中接收垂直信号后回调onVsync方法,发送信息自身处理 
FrameDisplayEventReceiver extends DisplayEventReceiver implements Runnable {} run() 中调用真正的绘制方法doFrame(); 
按照顺序处理:INPUT>ANIMATION>TRAVERSAL>> doCallbacks() 迭代执行队列所有任务 CallbackRecord.run(mFrameData)
((VsyncCallback) action).onVsync(frameData); 
其中的action就是之前的TraversalRunnable 然后run里面 doTraversal(); 
performTraversals(); 
在这个方法中会调用 View 的 measure() ,layout() ,draw() 方法。

参考

juejin.cn/post/720297…

juejin.cn/post/686375…

juejin.cn/post/687448…

android.googlesource.com/platform/fr…