初始化 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() 方法。
参考