android 12/13 分屏设置Task的Bounds区
hi,近来研究分屏时候发现android 13上的分屏和以前的分屏代码差别比较大 主要区别在于把原来大部分分屏相关业务在systemserver进行的都放入到了systemui进程,对应的代码基本都在: frameworks/base/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/ 这里面进行对应分屏相关的一个业务处理, 比如分割线拖拽对两个分屏大小影响等。最后都会通过包装成WindowContainerTransaction对象,再通过WindowOrganizerController的本地代理,跨进程传递到systemserver的WindowOrganizerController类中进行处理. 大概流程很复杂,这里我这记录一下一个难以表面看出的点,那就是怎么对Task的相关的Bounds进行设置的,这个在以前android版本就直接systemserver的Task或之ActivityStack调用resize就行,但新版本就没有这么容易看出,最后经过打印相关堆栈的调试发现应该设置是如下流程: ```cpp 02-13 22:27:30.861 560 890 I test : setBounds change = { mBounds=Rect(0, 0 - 1440, 2960) mAppBounds=Rect(0, 0 - 1440, 2792) mMaxBounds=Rect(0, 0 - 1440, 2960) mDisplayRotation=ROTATION_0 mWindowingMode=fullscreen mDisplayWindowingMode=fullscreen mActivityType=undefined mAlwaysOnTop=undefined mRotation=ROTATION_0}1046251526 rect Rect(0, 0 - 1440, 810) 02-13 22:27:30.861 560 890 I test : java.lang.Exception 02-13 22:27:30.861 560 890 I test : at android.app.WindowConfiguration.setBounds(WindowConfiguration.java:294) 02-13 22:27:30.861 560 890 I test : at android.app.WindowConfiguration.updateFrom(WindowConfiguration.java:494) 02-13 22:27:30.861 560 890 I test : at android.content.res.Configuration.updateFrom(Configuration.java:1706) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.ConfigurationContainer.onConfigurationChanged(ConfigurationContainer.java:133) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowContainer.onConfigurationChanged(WindowContainer.java:510) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.TaskFragment.onConfigurationChanged(TaskFragment.java:2260) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.Task.onConfigurationChangedInner(Task.java:1903) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.Task.onConfigurationChanged(Task.java:1976) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.ConfigurationContainer.onRequestedOverrideConfigurationChanged(ConfigurationContainer.java:200) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowContainer.onRequestedOverrideConfigurationChanged(WindowContainer.java:973) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.applyChanges(WindowOrganizerController.java:534) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.applyWindowContainerChange(WindowOrganizerController.java:1217) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:427) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.applyTransaction(WindowOrganizerController.java:372) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.applySyncTransaction(WindowOrganizerController.java:218) 02-13 22:27:30.861 560 890 I test : at android.window.IWindowOrganizerController$Stub.onTransact(IWindowOrganizerController.java:215) 02-13 22:27:30.861 560 890 I test : at com.android.server.wm.WindowOrganizerController.onTransact(WindowOrganizerController.java:163) 02-13 22:27:30.861 560 890 I test : at android.os.Binder.execTransactInternal(Binder.java:1285) 02-13 22:27:30.861 560 890 I test : at android.os.Binder.execTransact(Binder.java:1244) ``` 其实Task的Bounds就是 ```cpp @Override public void getBounds(Rect bounds) { bounds.set(getBounds()); } /** * Returns the effective bounds of this container, inheriting the first non-empty bounds set in * its ancestral hierarchy, including itself. */ public Rect getBounds() { mReturnBounds.set(getConfiguration().windowConfiguration.getBounds()); return mReturnBounds; } ``` 最后就是调用的windowConfiguration.getBounds