Android Bootloader:如何提高系統啟動速度

一、優化啟動時間

啟動時間是影響用戶體驗的重要指標之一,優化啟動時間可以讓用戶更快地進入操作系統。對於Android系統而言,他的啟動順序是:bootloader -> kernel -> init -> zygote -> launcher。

提升Android系統啟動速度,我們可以從以下幾個方面入手:

1、優化bootloader的啟動時間

if (mode != fastboot) {
    avb_result_t load_result = avb_slot_verify(slot, AVB_SLOT_VERIFY_FLAGS_NONE, &loaded_partitions);
    if (load_result != AVB_SLOT_VERIFY_RESULT_OK) {
        bootloader_error("Public key for verifying %s did not validate images!\n",
                         slot_suffix);
        continue;
    }
}

bootloader階段的啟動時間佔總啟動時間的比例較小,但是它對整個啟動過程進行了重要的準備工作。優化bootloader可以從如何載入kernel以及如何初始化設備等方面進行優化。

2、優化kernel的啟動時間

int init(void *handle)
{
...
    while (1) {
        init_time.start_time = gettime();
        ci = console_cmdline_init(handle);
        init_time.cmdline_time = time_diff_us(init_time.start_time, gettime());

        init_time.start_time = gettime();
        err = boot_linux_kernel(ci);
        init_time.kernel_time = time_diff_us(init_time.start_time, gettime());

        printf("kernel boot time = %lluus\n\n", init_time.kernel_time);

        if (err >= 0)
            printf("\nerror: kernel %d returned error %d\n\n", curr_slot.slot_number, err);

        free(ci);
    }
}

kernel初始化進程是整個啟動過程中佔用時間最長的環節,若要優化系統啟動時間,優化kernel的啟動時間是關鍵。優化kernel的啟動時間可以通過減少內核初始化時的處理和檢測,提高kernel的啟動效率,從而減少整個系統的啟動時間。

3、優化init進程的啟動時間

int main(int argc, char *argv[]) {
...
    if (init_parse_cmdline()) {
        panic("Failed to parse kernel command line");
    }

    property_init();
    export_oem_lock_status();
    selinux_initialize();
    signal_init();
    time_init();
    subcontext_init();
    option_init();
    set_usb_controller();
    device_init();

    if (mount_devices()) {
        panic("Failed to mount specified partitions");
    }

    healthd_mode_init();
...
}

init進程啟動時間時間也很長,而init進程主要完成的任務就是進行系統初始化以及啟動第一個進程zygote,提高init進程啟動速度也可以通過減少處理和檢測的方式提高啟動效率。

二、降低系統啟動時間

降低系統啟動時間也是提高用戶體驗的重要手段。我們可以從下面的幾個方面入手:

1、減少啟動服務的數量


$count = 0
while [ $count -le 5 ]; do
    stop conman
    sleep 2
    setprop persist.service.bdroid.bdaddr 22:33:44:55:66:78
    start conman
    sleep 2
    ps -eo cmd | grep "bluetoothd --hci" | grep -v grep > /dev/null
    if [ $? -eq 0 ]; then
        count=$[$count+1]
    else
        count=0
    fi
done

啟動服務的數量對於系統的啟動時間有著顯著的影響,啟動服務過多會導致系統啟動時間變長,因此我們可以通過減少啟動服務的數量來降低系統啟動時間。

2、優化啟動服務的順序


class NfcService extends INfcService.Stub {
    public NfcService(Context context) {
        mContext = context;
        mNfcAdapterFactory = new NfcAdapterVendorAdapterFactory(mContext);
        mTagLifecycleAdapter = new TagLifecycleAdapter(mContext);
        mBeamShareActivityInfoAdapter = null;
    }
}

啟動服務的順序也會影響到系統的啟動速度,因此我們可以通過優化啟動服務的順序來提高系統的啟動速度。

3、減少文件讀寫量


if (!fd || (type == INPUT_BOOL && fscanf(fd, "%d", &value) != 1) ||
    (type == INPUT_EVENT && fscanf(fd, "%d %d %d", &type, &code, &value) != 3) ||
    fscanf(fd, "%*[^\n]\n") != 0) {
    ALOGE("%s: could not read from event fd, %s", __func__, strerror(errno));
    fclose(fd);
    return;
}

在啟動過程中,文件讀寫量也會影響整體啟動速度,因此,我們可以通過減少文件讀寫量的方式來降低系統的啟動時間。

三、啟用緩存來加速啟動

1、通過緩存kernel來加速啟動


bootimg = malloc(sizeof(*bootimg));
if (!bootimg) die("out of memory");

bootimg = mkbootimg(bootimg,
                    cmdlinelen ? cmd + strlen(BOOTIMG_DEFAULT_KERNEL_ARGS) + 1 : cmd,
                    cmdlinelen ? cmd : "",
                    base, pagesize, tag,
                    dtb, hdr->second_size,
                    &image_start, &image_size);

通過緩存kernel可以大幅提高下次啟動的速度,當系統下一次啟動時,bootloader會讀取緩存中的kernel,從而使啟動速度變得更快。

2、通過緩存頁面來加速啟動


total_size = cache_file_max_size(cache_dir, CACHE_DATA_FILENAME);
    if (total_size == -1) {
        return 0;
    }

    dev = device_create(ctx);
    if (!dev) {
        fprintf(stderr, "create device failed: %s\n", strerror(errno));
        return 0;
    }

    cache_device = *(const struct fastboot_device*)dev->vtable;
    cache_device.cookie = &cache_device;
    cache_device.transport = &cache_transport_vtab;

Android系統中還有一種叫做system-cache的優化方案,可以通過緩存頁面來加速啟動,啟用緩存之後,下一次啟動將會從緩存中讀取頁面,而不是直接從磁碟讀取。系統啟動時間會因此縮短。

3、通過緩存APK來加速啟動


layoutIfNeeded();

    GeneratedStub.stub().value = context.getResources().getBoolean(R.bool.is_generator_installed);
    GeneratedStub.stub().value = false;

    mAppsOrderedByLaunch = loadAllAppsByBatch( pm );
    if (mAppsOrderedByLaunch == null) {
        mAllAppsLoaded = false;
        if (mIconCache != null) {
            mIconCache.flush();
        }
    }

緩存APK是一種用於加速系統啟動的有效手段。系統會在啟動時緩存需要的APK文件,這樣下次啟動時,APK文件就可以直接從緩存中載入,而不是重新從磁碟讀取,從而加速系統的啟動。

原創文章,作者:NQZNJ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/329369.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NQZNJ的頭像NQZNJ
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相關推薦

  • Android ViewPager和ScrollView滑動衝突問題

    Android開發中,ViewPager和ScrollView是兩個常用的控制項。但是當它們同時使用時,可能會發生滑動衝突的問題。本文將從多個方面介紹解決Android ViewPa…

    編程 2025-04-28
  • Android如何點擊其他區域收起軟鍵盤

    在Android應用中,當輸入框獲取焦點彈出軟鍵盤後,我們希望能夠點擊其他區域使軟鍵盤消失,以提升用戶體驗。本篇文章將說明如何實現這一功能。 一、獲取焦點並顯示軟鍵盤 在Andro…

    編程 2025-04-28
  • Python調整畫筆速度的實現方法

    在Python的圖形庫中,調整畫筆速度是一個常見需求。本文從多個方面介紹如何實現這一功能。 一、基礎概念 在Python的turtle模塊中,畫筆的速度可以通過penup()和pe…

    編程 2025-04-27
  • 為什麼身體豎著游泳速度特別慢?

    對於初學游泳的新手來說,經常會發現身體豎著游泳的時候速度明顯比側身游泳慢,甚至還會出現原地踏水的尷尬場景。那麼,為什麼身體豎著游泳的時候速度特別慢呢?下面我們從不同的角度來探討。 …

    編程 2025-04-27
  • Android Studio HUD 實現指南

    本文將會以實例來詳細闡述如何在 Android Studio 中使用 HUD 功能實現菊花等待指示器的效果。 一、引入依賴庫 首先,我們需要在 build.gradle 文件中引入…

    編程 2025-04-27
  • Android和Vue3混合開發方案

    本文將介紹如何將Android和Vue3結合起來進行混合開發,以及其中的優勢和注意事項。 一、環境搭建 在進行混合開發之前,需要搭建好相應的開發環境。首先需要安裝 Android …

    編程 2025-04-27
  • Android Java Utils 可以如何提高你的開發效率

    Android Java Utils 是一款提供了一系列方便實用的工具類的 Java 庫,可以幫助開發者更加高效地進行 Android 開發,提高開發效率。本文將從以下幾個方面對 …

    編程 2025-04-27
  • Python畫圖速度

    本文將從多個方面詳細闡述Python畫圖的速度問題,並提供解決方案。 一、基本介紹 Python是一種解釋型腳本語言,通常被用於自動化任務、數據處理等。在數據可視化方面,Pytho…

    編程 2025-04-27
  • Android JUnit測試完成程序自動退出決方法

    對於一些Android JUnit測試的開發人員來說,程序自動退出是一個經常面臨的困擾。下面從多個方面給出解決方法。 一、檢查測試代碼 首先,我們應該仔細檢查我們的測試代碼,確保它…

    編程 2025-04-25
  • Android Activity啟動流程

    一、Activity概述 Android應用程序是由許多Activity組成的。一個Activity代表一個屏幕上的窗口。用戶與應用程序交互時,Activity會接收用戶的輸入並處…

    編程 2025-04-25

發表回復

登錄後才能評論