安卓15源码构建版本导航栏创建没有走SystemUI的流程
sdk_phone64_x86_64-trunk_staging-eng
//com.android.systemui.navigationbar.NavigationBarControllerImpl@Overridepublic void createNavigationBars(finalboolean includeDefaultDisplay,RegisterStatusBarResult result) {// Don't need to create nav bar on the default display if we initialize TaskBar.final boolean shouldCreateDefaultNavbar = includeDefaultDisplay&& !initializeTaskbarIfNecessary();Display[] displays = mDisplayTracker.getAllDisplays();Log.d(TAG, "xiaoan createNavigationBars for (Display display : displays) " + Log.getStackTraceString(new Throwable()));Log.d(TAG, "xiaoan createNavigationBars createNavigationBar(display, ...) display = " + displays.length + includeDefaultDisplay);for (Display display : displays) {Log.d(TAG, "xiaoan createNavigationBars shouldCreateDefaultNavbar = " + shouldCreateDefaultNavbar + ", "+ display.getDisplayId() + ", " + mDisplayTracker.getDefaultDisplayId());if (shouldCreateDefaultNavbar|| display.getDisplayId() != mDisplayTracker.getDefaultDisplayId()) {Log.d(TAG, "xiaoan createNavigationBars createNavigationBar(display, ...) display = " + display);createNavigationBar(display, null /* savedState */, result);}}}
includeDefaultDisplay 传入的值是true,shouldCreateDefaultNavbar 是false,导致没有走进下面的 createNavigationBar 方法中 。是因为 initializeTaskbarIfNecessary() 返回值是true。
//com.android.systemui.navigationbar.NavigationBarControllerImplprivate boolean initializeTaskbarIfNecessary() {boolean supportsTaskbar = supportsTaskbar();boolean shouldCreateNavBarAndTaskBar = shouldCreateNavBarAndTaskBar(mContext.getDisplayId());boolean taskbarEnabled = supportsTaskbar && shouldCreateNavBarAndTaskBar;Log.d(TAG, "xiaoan initializeTaskbarIfNecessary taskbarEnabled = " + taskbarEnabled+ ", supportsTaskbar = " + supportsTaskbar + ", shouldCreateNavBarAndTaskBar = " + shouldCreateNavBarAndTaskBar);if (taskbarEnabled) {Trace.beginSection("NavigationBarController#initializeTaskbarIfNecessary");final int displayId = mContext.getDisplayId();// Hint to NavBarHelper if we are replacing an existing bar to skip extra workmNavBarHelper.setTogglingNavbarTaskbar(mNavigationBars.contains(displayId));// Remove navigation bar when taskbar is showingremoveNavigationBar(displayId);mTaskbarDelegate.init(displayId);mNavBarHelper.setTogglingNavbarTaskbar(false);Trace.endSection();} else {mTaskbarDelegate.destroy();}return taskbarEnabled;}
返回值 taskbarEnabled 是true,supportsTaskbar 和 shouldCreateNavBarAndTaskBar 两个值都是true,这里主要是看 supportsTaskbar() 方法的返回值是true。这个方法是判断是否支持Taskbar的方法,一般手机上是不支持Taskbar的,只有大屏设备支持,这里应该是false才对。
//com.android.systemui.navigationbar.NavigationBarControllerImplboolean supportsTaskbar() {// Enable for tablets, unfolded state on a foldable device, (non handheld AND flag is set),// or handheld when enableTaskbarOnPhones() returns true.boolean foldedOrPhone = !mIsPhone || enableTaskbarOnPhones();Log.d(TAG, "xiaoan foldedOrPhone = " + foldedOrPhone + " , mIsLargeScreen = " + mIsLargeScreen);boolean enableTaskbarLauncher = enableTaskbarNavbarUnification() && (!mIsPhone || enableTaskbarOnPhones());Log.d(TAG, "xiaoan launcher enableTaskbar = " + enableTaskbarLauncher+ " , mIsPhone = " + mIsPhone+ " , enableTaskbarOnPhones() = " + enableTaskbarOnPhones()+ " , enableTaskbarNavbarUnification() = " + enableTaskbarNavbarUnification());return mIsLargeScreen || (foldedOrPhone && enableTaskbarNavbarUnification());}
返回值是true,不是大屏设备,mIsPhone 值为true,也就是enableTaskbarOnPhones() 和 enableTaskbarNavbarUnification() 都是true,这两个值是静态的。
import static com.android.wm.shell.Flags.enableTaskbarNavbarUnification;import static com.android.wm.shell.Flags.enableTaskbarOnPhones;
这两个值是通过 trunk_staging 目录下的textproro文件配置的。



这两个配置的默认值是ENABLED,所以Launcher创建了TaskBar,SystemUI没有创建NavBar。(这里的DISABLED是我修改之后的)
夜雨聆风
