一、優化啟動時間
啟動時間是影響用戶體驗的重要指標之一,優化啟動時間可以讓用戶更快地進入操作系統。對於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