本發(fā)明涉及計(jì)算機(jī)操作系統(tǒng)技術(shù)領(lǐng)域,尤其涉及一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法。
背景技術(shù):
Android系統(tǒng)為當(dāng)前最流行的消費(fèi)電子軟件系統(tǒng),雖然用戶群廣,但大家都拿其運(yùn)行體驗(yàn)與IOS系統(tǒng)比較。Android系統(tǒng)為了運(yùn)行時(shí)的體驗(yàn)效果,設(shè)計(jì)了預(yù)加載模式,這就犧牲了開機(jī)速度這一體驗(yàn)。
所謂預(yù)加載是指Zygote在開機(jī)的時(shí)候加載了一個(gè)大而全的應(yīng)用運(yùn)行環(huán)境。Zygote是整個(gè)Android系統(tǒng)中所有應(yīng)用的母本,所以其對(duì)整個(gè)系統(tǒng)來說是非常重要的;所以需要在對(duì)系統(tǒng)中所有應(yīng)用都不影響的前提下,去優(yōu)化其對(duì)開機(jī)時(shí)間的影響。在Android系統(tǒng)中,所有的應(yīng)用進(jìn)程以及系統(tǒng)服務(wù)進(jìn)程SystemServer都是由Zygote進(jìn)程創(chuàng)建出來的,Zygote創(chuàng)建其他進(jìn)程的時(shí)候都會(huì)復(fù)制本身的環(huán)境的給每一個(gè)新的進(jìn)程。這樣雖然每一個(gè)應(yīng)用的環(huán)境不用自己加載,但Zygote需要加載資源就非常多。需要加載的資源數(shù)量龐大加上Zygote同步加載資源的方式,這就導(dǎo)致了目前雖然硬件性能在不斷提升但開機(jī)時(shí)間不見減少的問題。為此本發(fā)明設(shè)計(jì)了一套縮短Zygote加載資源對(duì)開機(jī)時(shí)間影響的方法。
技術(shù)實(shí)現(xiàn)要素:
針對(duì)現(xiàn)有技術(shù)存在的不足之處,本發(fā)明的目的在于提供一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,縮短了Android系統(tǒng)開機(jī)時(shí)的預(yù)加載資源時(shí)間,提升了整個(gè)Android系統(tǒng)的開機(jī)速度,使用戶能更快使用到Android智能設(shè)備,提升產(chǎn)品體驗(yàn)操作,增強(qiáng)產(chǎn)品的競(jìng)爭(zhēng)力。
本發(fā)明的目的通過下述技術(shù)方案實(shí)現(xiàn):
一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,對(duì)Android系統(tǒng)中Zygote加載的所有資源按照是否為SystemServer初始化所需劃分為ResA和ResB兩部分,其中ResA為SystemServer初始化過程中所需要的所有資源,ResB為SystemServer初始化過程中不需要的所有資源,ResB包括所有APP應(yīng)用所對(duì)應(yīng)的資源;
其開機(jī)方法步驟如下:
A、Android系統(tǒng)開機(jī)啟動(dòng),Zygote首先加載ResA資源,確保ResA的所有資源加載完畢后,馬上啟動(dòng)SystemServer;
B、啟動(dòng)SystemServer后,Zygote開始加載ResB的部分資源,并提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP應(yīng)用前調(diào)用;
C、SystemServer啟動(dòng)APP應(yīng)用后,完成與該APP應(yīng)用相對(duì)應(yīng)的剩余所有ResB資源加載。
為了更好地實(shí)現(xiàn)本發(fā)明,一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,對(duì)Android系統(tǒng)中Zygote加載的所有資源按照是否為SystemServer初始化所需劃分為ResA和ResB兩部分,其中ResA為SystemServer初始化過程中所需要的所有資源,ResB為SystemServer初始化過程中不需要的所有資源,ResB包括所有APP應(yīng)用所對(duì)應(yīng)的資源;將ResA的資源劃分為ResA1、ResA2、ResA3…ResAn共計(jì)n個(gè)組資源,每組資源的加載耗時(shí)相當(dāng)或相同;
其開機(jī)方法步驟如下:
A、Android系統(tǒng)開機(jī)啟動(dòng),Zygote首先加載ResA資源,Zygote分別異步加載ResA1、ResA2、ResA3…ResAn共計(jì)n組資源,確保ResA的所有資源加載完畢后,馬上啟動(dòng)SystemServer;
B、啟動(dòng)SystemServer后,Zygote開始加載ResB的部分資源,并提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP應(yīng)用前調(diào)用;
C、SystemServer啟動(dòng)APP應(yīng)用后,完成與該APP應(yīng)用相對(duì)應(yīng)的剩余所有ResB資源加載。
Android系統(tǒng)的開機(jī)過程為:Linux啟動(dòng)Zygote,Zygote完成啟動(dòng)后在由Zygote啟動(dòng)SystemServer,SystemServer完成啟動(dòng)后SystemServer就會(huì)啟動(dòng)應(yīng)用程序,這時(shí)這個(gè)系統(tǒng)完成開機(jī)。整個(gè)過程中Zygote和SystemServer是串行啟動(dòng),并且各自內(nèi)部初始化也串行加載的。整個(gè)流程可見圖1。由于加載模式和啟動(dòng)方式的限制,導(dǎo)致雖然硬件性能在不斷提升但開機(jī)時(shí)間不見縮短的問題。目前很多終端性能都很強(qiáng)大,很多都是雙核或者是四核CPU,使用bootchart可以清楚看到Zygote和SystemServer啟動(dòng)過程中CPU負(fù)載并不高。所以對(duì)于高性能的終端通過調(diào)整加載資源的方式完全可以實(shí)現(xiàn)縮短Android系統(tǒng)開機(jī)時(shí)間的目的。
Zygote所預(yù)加載的資源是整個(gè)系統(tǒng)所需要的,雖然SystemServer啟動(dòng)所需資源是依賴于Zygote,但SystemServer初始化所需的資源是小于Zygote所全部加載的資源。所以本發(fā)明設(shè)計(jì)了一種分段加載與多線程異步加載相結(jié)合的方案。
分段是指:將Zygote需要加載的所有資源分為兩部分,SystemServer初始化時(shí)需要的資源(以下簡(jiǎn)稱ResA)和其他剩余資源(以下簡(jiǎn)稱ResB),Zygote先加載ResA,然后馬上啟動(dòng)SystemServer,最后再加載ResB。異步是指:Zygote在加載ResA時(shí),為了充分利用硬件的性能,采用多線程異步加載的方式,將ResA分為多組,一個(gè)線程加載一組。ResA分多少組是根據(jù)具體終端的性能來確定,終端能最快異步加載多少組資源,就將ResA分為多少組;而每一組中具體資源是根據(jù)每個(gè)資源加載耗時(shí)來確定,確保每一組加載耗時(shí)差在可以接受的范圍。
Zygote先以最快速度加載第一段資源,然后啟動(dòng)SyetemServer,再加載剩下的一段資源,這樣將整個(gè)資源分為兩段加載,并在加載第一段的時(shí)候采用異步多線的方式。由于使用了異步加載機(jī)制,但SyetemServer和APP又都依賴于Zygote所加載的資源;所以需要在SystemServer啟動(dòng)時(shí)增加ResA加載完成的同步檢查、需要在APP啟動(dòng)時(shí)增加ResB加載完成的同步檢查。對(duì)于ResA的檢查,需要Zygote的主線程在同步等待每一個(gè)加載ResA的線程完成后再啟動(dòng)SystemServer;而對(duì)于ResB的檢查,需要Zygote提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP前調(diào)用。
整個(gè)優(yōu)化后的流程可見附圖二。
本發(fā)明較現(xiàn)有技術(shù)相比,具有以下優(yōu)點(diǎn)及有益效果:
本發(fā)明縮短了Android系統(tǒng)開機(jī)時(shí)的預(yù)加載資源時(shí)間,提升了整個(gè)Android系統(tǒng)的開機(jī)速度,使用戶能更快使用到Android智能設(shè)備,提升產(chǎn)品體驗(yàn)操作,增強(qiáng)產(chǎn)品的競(jìng)爭(zhēng)力。
附圖說明
圖1為傳統(tǒng)Android系統(tǒng)開機(jī)流程示意圖;
圖2為本發(fā)明基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的流程示意圖。
具體實(shí)施方式
下面結(jié)合實(shí)施例對(duì)本發(fā)明作進(jìn)一步地詳細(xì)說明:
實(shí)施例一
如圖2所示,一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,對(duì)Android系統(tǒng)中Zygote加載的所有資源按照是否為SystemServer初始化所需劃分為ResA和ResB兩部分,其中ResA為SystemServer初始化過程中所需要的所有資源,ResB為SystemServer初始化過程中不需要的所有資源,ResB包括所有APP應(yīng)用所對(duì)應(yīng)的資源;
其開機(jī)方法步驟如下:
A、Android系統(tǒng)開機(jī)啟動(dòng),Zygote首先加載ResA資源,確保ResA的所有資源加載完畢后,馬上啟動(dòng)SystemServer;
B、啟動(dòng)SystemServer后,Zygote開始加載ResB的部分資源,并提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP應(yīng)用前調(diào)用;
C、SystemServer啟動(dòng)APP應(yīng)用后,完成與該APP應(yīng)用相對(duì)應(yīng)的剩余所有ResB資源加載。
實(shí)施例二
如圖2所示,一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,對(duì)Android系統(tǒng)中Zygote加載的所有資源按照是否為SystemServer初始化所需劃分為ResA和ResB兩部分,其中ResA為SystemServer初始化過程中所需要的所有資源,ResB為SystemServer初始化過程中不需要的所有資源,ResB包括所有APP應(yīng)用所對(duì)應(yīng)的資源;將ResA的資源劃分為ResA1、ResA2、ResA3…ResAn共計(jì)n個(gè)組資源,每組資源的加載耗時(shí)相當(dāng)或相同;
其開機(jī)方法步驟如下:
A、Android系統(tǒng)開機(jī)啟動(dòng),Zygote首先加載ResA資源,Zygote分別異步加載ResA1、ResA2、ResA3…ResAn共計(jì)n組資源,確保ResA的所有資源加載完畢后,馬上啟動(dòng)SystemServer;
B、啟動(dòng)SystemServer后,Zygote開始加載ResB的部分資源,并提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP應(yīng)用前調(diào)用;
C、SystemServer啟動(dòng)APP應(yīng)用后,完成與該APP應(yīng)用相對(duì)應(yīng)的剩余所有ResB資源加載。
實(shí)施例三
如圖2所示,一種基于Android系統(tǒng)實(shí)現(xiàn)快速開機(jī)的方法,對(duì)Android系統(tǒng)中Zygote加載的所有資源按照是否為SystemServer初始化所需劃分為ResA和ResB兩部分,其中ResA為SystemServer初始化過程中所需要的所有資源,ResB為SystemServer初始化過程中不需要的所有資源,ResB包括所有APP應(yīng)用所對(duì)應(yīng)的資源;將ResA的資源劃分為ResA1、ResA2、ResA3…ResAn共計(jì)n個(gè)組資源,每組資源的加載耗時(shí)相當(dāng)或相同;
其開機(jī)方法步驟如下:
1、Zygote在加載ResA時(shí),根據(jù)ResA的分組建立對(duì)應(yīng)的線程異步加載每一組資源;并在主線程中增加每一個(gè)線程加載完成狀態(tài)同步機(jī)制。在確保所有異步加載ResA的線程完成后及ResA完成加載后,馬上啟動(dòng)SystemServer。
2、啟動(dòng)SystemServer后,Zygote開始加載ResB。并提供同步等待ResB加載完成的接口,可供SystemServer啟動(dòng)APP前調(diào)用。
3、SystemServer在完成啟動(dòng)后,在啟動(dòng)APP前,增加同步等待查詢Zygote中ResB加載情況的步驟。確保APP啟動(dòng)時(shí)Zygote已經(jīng)完成所有資源的加載
4、SystemServer啟動(dòng)APP后,開始加載ResB。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。