国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Framework 常見解決方案(24)屏蔽FallbackHome,去除 Android正在啟動,直接進入Launcher

這篇具有很好參考價值的文章主要介紹了Android Framework 常見解決方案(24)屏蔽FallbackHome,去除 Android正在啟動,直接進入Launcher。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1 原理說明

開機以后,設備會有一個“android正在啟動”這樣的彈框,這個界面是一個叫FallbackHome的Activity來展示的。FallbackHome機制是Android系統(tǒng)啟動過程中的一種降級處理機制。當系統(tǒng)啟動時,如果默認的Launcher應用無法正常加載或出現(xiàn)錯誤,系統(tǒng)會自動啟用FallbackHome來替代默認Launcher。但一般為了改善產(chǎn)品體驗,最終決定移除彈窗頁面,直接進入默認的Launcher,避免彈窗對用戶界面的干擾。具體而言,F(xiàn)allbackHome機制包括以下內(nèi)容:

  • 默認Launcher故障檢測:系統(tǒng)會檢測默認的Launcher應用是否能夠正常加載和運行。如果檢測到故障,系統(tǒng)將啟動FallbackHome。
  • 解鎖過程中的彈窗:在系統(tǒng)解鎖之前,可能會出現(xiàn)一個"Android正在啟動"的彈窗頁面,用于指示系統(tǒng)正在加載和準備。這個彈窗頁面通常出現(xiàn)在桌面壁紙上,用戶需要等待系統(tǒng)完全解鎖后才能進入默認的Launcher。

去掉FallbackHome的效果實際上是讓FallbackHome的view不顯示,然后開機啟動動畫延長一下,直到系統(tǒng)解鎖后再停止開機動畫,完成這樣較為順滑的過渡。

2 修改方案(Android Q R S)

具體修改方案如下(這里以S版本修改為主,Q和R有一些差異但原理不變)

@1 修改文件為:AOSP/packages/apps/Settings$ vim src/com/android/settings/FallbackHome.java,目的為FallbackHome不顯示View,所以注釋掉。修改內(nèi)容為:

public class FallbackHome extends Activity {
    private static final String TAG = "FallbackHome";
    private static final int PROGRESS_TIMEOUT = 2000;

    private boolean mProvisioned;
    private WallpaperManager mWallManager;

    private final Runnable mProgressTimeoutRunnable = () -> {
        //AGS add start
        //不顯示任何內(nèi)容,如果是黑色銜接,直接改這里就足夠了,如果不是則需要 2,3步驟內(nèi)容的修改
        /*  View v = getLayoutInflater().inflate(
                R.layout.fallback_home_finishing_boot, null);
        setContentView(v);
        v.setAlpha(0f);
        v.animate()
                .alpha(1f)
                .setDuration(500)
                .setInterpolator(AnimationUtils.loadInterpolator(
                        this, android.R.interpolator.fast_out_slow_in))
                .start();*/
        //AGS add end
        getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
    };
    //...
}

@2 修改文件為:AOSP/frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java,目的為播放完開機動畫后不退出開機動畫,所以注釋掉即可。修改內(nèi)容為:

public class WindowManagerService extends IWindowManager.Stub
        implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs {
    //...
    private void performEnableScreen() {
        synchronized (mGlobalLock) {
            ProtoLog.i(WM_DEBUG_BOOT, "performEnableScreen: mDisplayEnabled=%b"
                            + " mForceDisplayEnabled=%b" + " mShowingBootMessages=%b"
                            + " mSystemBooted=%b mOnlyCore=%b. %s", mDisplayEnabled,
                    mForceDisplayEnabled, mShowingBootMessages, mSystemBooted, mOnlyCore,
                    new RuntimeException("here").fillInStackTrace());
            if (mDisplayEnabled) {
                return;
            }
            if (!mSystemBooted && !mShowingBootMessages) {
                return;
            }

            if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) {
                return;
            }

            // Don't enable the screen until all existing windows have been drawn.
            if (!mForceDisplayEnabled) {
                if (mBootWaitForWindowsStartTime < 0) {
                    // First time we will start waiting for all windows to be drawn.
                    mBootWaitForWindowsStartTime = SystemClock.elapsedRealtime();
                }
                for (int i = mRoot.getChildCount() - 1; i >= 0; i--) {
                    if (mRoot.getChildAt(i).shouldWaitForSystemDecorWindowsOnBoot()) {
                        return;
                    }
                }
                long waitTime = SystemClock.elapsedRealtime() - mBootWaitForWindowsStartTime;
                mBootWaitForWindowsStartTime = -1;
                if (waitTime > 10) {
                    ProtoLog.i(WM_DEBUG_BOOT,
                            "performEnableScreen: Waited %dms for all windows to be drawn",
                            waitTime);
                }
            }
	    //AGS add start
	    //播放完開機動畫后不退出開機動畫,注釋掉如下代碼即可。
	    /*
            if (!mBootAnimationStopped) {
                Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
                // stop boot animation
                // formerly we would just kill the process, but we now ask it to exit so it
                // can choose where to stop the animation.
                SystemProperties.set("service.bootanim.exit", "1");
                mBootAnimationStopped = true;
            }

            if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {
                ProtoLog.i(WM_DEBUG_BOOT, "performEnableScreen: Waiting for anim complete");
                return;
            }

            try {
                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
                if (surfaceFlinger != null) {
                    ProtoLog.i(WM_ERROR, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
                    Parcel data = Parcel.obtain();
                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
                            data, null, 0);
                    data.recycle();
                }
            } catch (RemoteException ex) {
                ProtoLog.e(WM_ERROR, "Boot completed: SurfaceFlinger is dead!");
            }
            */
            //AGS add end

            EventLogTags.writeWmBootAnimationDone(SystemClock.uptimeMillis());
            Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);
            mDisplayEnabled = true;
            ProtoLog.i(WM_DEBUG_SCREEN_ON, "******************** ENABLING SCREEN!");

            // Enable input dispatch.
            mInputManagerCallback.setEventDispatchingLw(mEventDispatchingEnabled);
        }

        try {
            mActivityManager.bootAnimationComplete();
        } catch (RemoteException e) {
        }

        mPolicy.enableScreenAfterBoot();

	// Make sure the last requested orientation has been applied.
        updateRotationUnchecked(false, false);
    }
    //...
}

@3 修改文件為:AOSP/frameworks/base/services/core/java/com/android/server/wm/ActivityRecord.java,目的為解鎖后再結束開機動畫。修改內(nèi)容為:文章來源地址http://www.zghlxwxcb.cn/news/detail-819579.html

public final class ActivityRecord extends WindowToken implements WindowManagerService.AppFreezeListener {
/** Called when the windows associated app window container are drawn. */
    //...
    private void onWindowsDrawn(long timestampNs) {
        if (mPerf != null && perfActivityBoostHandler > 0) {
            mPerf.perfLockReleaseHandler(perfActivityBoostHandler);
            perfActivityBoostHandler = -1;
        } else if (perfActivityBoostHandler > 0) {
            Slog.w(TAG, "activity boost didn't release as expected");
        }
        final TransitionInfoSnapshot info = mTaskSupervisor
                .getActivityMetricsLogger().notifyWindowsDrawn(this, timestampNs);
        final boolean validInfo = info != null;
        final int windowsDrawnDelayMs = validInfo ? info.windowsDrawnDelayMs : INVALID_DELAY;
        final @WaitResult.LaunchState int launchState =
                validInfo ? info.getLaunchState() : WaitResult.LAUNCH_STATE_UNKNOWN;
        // The activity may have been requested to be invisible (another activity has been launched)
        // so there is no valid info. But if it is the current top activity (e.g. sleeping), the
        // invalid state is still reported to make sure the waiting result is notified.
        if (validInfo || this == getDisplayArea().topRunningActivity()) {
            mTaskSupervisor.reportActivityLaunched(false /* timeout */, this,
                    windowsDrawnDelayMs, launchState);
        }
        finishLaunchTickingLocked();
        if (task != null) {
            task.setHasBeenVisible(true);
        }
        //AGS add start
        if (isHomeIntent(intent) && shortComponentName != null && !shortComponentName.contains("FallbackHome")) {
            SystemProperties.set("service.bootanim.exit", "1");
	    //這里就是將上面注掉的代碼copy過來
            try {
                IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
                if (surfaceFlinger != null) {
                    Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
                    Parcel data = Parcel.obtain();
                    data.writeInterfaceToken("android.ui.ISurfaceComposer");
                    surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
                            data, null, 0);
                    data.recycle();
                }
            } catch (RemoteException ex) {
                Slog.e(TAG, "Boot completed: SurfaceFlinger is dead!");
            }
        }
        //AGS add end
        mLaunchRootTask = null;
    }
    //...
}

到了這里,關于Android Framework 常見解決方案(24)屏蔽FallbackHome,去除 Android正在啟動,直接進入Launcher的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • VS2022遷移VS2019項目遇到的.Net Framework 引用程序集問題解決方案

    VS2022遷移VS2019項目遇到的.Net Framework 引用程序集問題解決方案

    在GitHub上發(fā)現(xiàn)TrafficMonitor的開源代碼,想要自己過一遍這個項目 在VS2022上面打開出現(xiàn)了MSB3644錯誤,打開微軟 “找不到項目所請求 .NET 版本的 .NET 引用程序集時,會發(fā)生此錯誤。 發(fā)生此問題的原因可能是項目文件存在問題,它所請求的版本無法識別或未安裝;也可能是安裝問

    2024年02月06日
    瀏覽(75)
  • 【解決方案】找不到依賴 “@tarojs/plugin-framework-react“,請先在項目中安裝

    導入微信小程序項目,執(zhí)行yarn build:weapp 或者npm run?build:weapp后報錯如下: ?? Taro v3.5.12 找不到依賴 \\\"@tarojs/plugin-framework-react\\\",請先在項目中安裝 報錯原因是Taro的版本號和其他插件版本號不匹配。 解決方法是終端執(zhí)行以下代碼,添加或更新插件。

    2024年02月12日
    瀏覽(33)
  • 電腦服務器離線安裝.net framework 3.5解決方案(錯誤:0x8024402c )(如何確定當前系統(tǒng)是否安裝NET Framework 3.5)

    電腦服務器離線安裝.net framework 3.5解決方案(錯誤:0x8024402c )(如何確定當前系統(tǒng)是否安裝NET Framework 3.5)

    ? ? ? ? 日常服務的搭建或多或少都會有需要到NET Framework 3.5的微軟程序運行框架,本次介紹幾種不同的安裝方式主要解決運行在Windows 2012 以上的操作系統(tǒng)的服務。 ????????.NET Framework是微軟公司推出的程序運行框架,主要包含運行庫和公共語言集,3.5是版本號, 目前最

    2024年02月19日
    瀏覽(22)
  • Java常見Bug解決方案

    Java常見Bug解決方案

    剛開始學習Java語言的小伙伴, 很可能被各種各樣的程序bug搞得焦頭爛額, 甚至被勸退。別怕,健哥將手把手帶你了解Java中的異常體系, 如何識別Bug以及如何解決Bug。 讓我們先來了解下Java中的異常分類, 如下圖: Java中的異常分為Error錯誤和Exception異常兩大類 Error錯誤 : 一般所有

    2024年02月13日
    瀏覽(41)
  • 常見的跨域解決方案

    常見的跨域解決方案: 跨域問題可以分為兩種情況: 前端跨域和后端跨域 。以下是針對這兩種情況的跨域解決方案: 前端跨域解決方案: JSONP: 適用于前端向不同域名下的服務器請求數(shù)據(jù),通過添加回調(diào)函數(shù)名稱來實現(xiàn)跨域數(shù)據(jù)獲取。 CORS: 當前端向服務器請求數(shù)據(jù)時,

    2024年02月12日
    瀏覽(25)
  • 正則常見問題及解決方案

    正則常見問題及解決方案

    使用正則處理問題的基本思路。有一些方法比較固定,比如將問題分解成多個小問題,每個小問題見招拆招:某個位置上可能有多個字符的話,就?字符組。某個位置上有多個字符串的話,就?多選結構。出現(xiàn)的次數(shù)不確定的話,就?量詞。對出現(xiàn)的位置有要求的話,就?錨

    2024年02月10日
    瀏覽(27)
  • Unity常見的優(yōu)化解決方案

    Unity常見的優(yōu)化解決方案

    啟用ForceToMono 如果此音頻文件左右聲道一樣,沒有立體聲音即啟用ForceToMono選項,如果左右聲道有區(qū)別的話會導致聲音出現(xiàn)問題 可以減少內(nèi)存和磁盤占用 LoadType加載音頻資源的選項 Decompress On Load ? 壓縮過的音頻文件如果小于200KB以下的音頻文件使用 Compressed In Memory ? 如果大

    2024年04月14日
    瀏覽(48)
  • Hadoop常見異常及其解決方案

    1、Shell$ExitCodeException 現(xiàn)象:運行hadoop job時出現(xiàn)如下異常: 14/07/09 14:42:50 INFO mapreduce.Job: Task Id : attempt_1404886826875_0007_m_000000_1, Status : FAILED Exception from container-launch: org.apache.hadoop.util.Shell E x i t C o d e E x c e p t i o n : o r g . a p a c h e . h a d o o p . u t i l . S h e l l ExitCodeException: org.ap

    2024年02月06日
    瀏覽(20)
  • 冷啟問題目前常見解決方案

    冷啟問題目前常見解決方案

    隨機冷啟 個性化冷啟 冷啟動保量 冷啟動保量,保證每個item曝光的次數(shù)一樣,實時統(tǒng)計已曝光的次數(shù)和要曝光的次數(shù) 冷啟動結束過濾,如果需曝光的量越大,且越接近冷啟結束時間,得分越高,被曝光的概率越大 爬坡保量 實時統(tǒng)計曝光、點擊、ctr;ctr越高,曝光越少,得分

    2024年02月11日
    瀏覽(22)
  • 常見的內(nèi)存泄漏原因和解決方案

    1.全局引用 問題:在JavaScript代碼中,使用全局變量或全局對象來保存對DOM元素或其他對象的引用,這可能導致內(nèi)存泄漏。 解決方案:避免使用全局變量或全局對象,改用合適的作用域來管理變量和對象的生命周期。確保在不再需要時正確地釋放這些引用。 2.事件監(jiān)聽器 問題

    2024年02月13日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包