0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

分析Android開機啟動速度優(yōu)化(含應(yīng)用程序優(yōu)化)

如意 ? 來源:CSDN ? 作者:Peter盼 ? 2020-06-20 10:51 ? 次閱讀

眾所周知Android開機啟動速度較慢,于是如何加快啟動速度便成為一個值得討論的問題。

在查閱過許多資料后(特別是Google Group的android-platform),我整理總結(jié)出下面幾點基本看法。

Android開機啟動耗時較多的部分有2個,分別是preload classes和scan packages。

這里又?jǐn)?shù)preload classes最為耗時,在我的機子上一般需要13秒左右。實際上,在看過google group眾多關(guān)于preload class的主題后,基本可以確定以下事實:

preloaded-classes list中預(yù)加載的類位于dalvik zygote進程的heap中。在zygote衍生一個新的dalvik進程后,新進程只需加載heap中沒有預(yù)加載的類(這些后加載進來的類成為該進程所private獨有的),這樣便加快了應(yīng)用程序的啟動速度。實際上這是一種以空間換時間的辦法,因為幾乎沒有一個應(yīng)用程序能夠使用到所有的預(yù)加載類,必定有很多類對于該應(yīng)用程序來說是冗余的。但是也正如Google所說,智能手機開機遠(yuǎn)沒有啟動應(yīng)用程序頻繁——用戶開機一次,但直到下次再開機之前可能要運行多個應(yīng)用程序。因此犧牲一點啟動時間來換取應(yīng)用程序加載時的較快速度是合算的。

preloaded-classes list已經(jīng)是Google Android工程師使用眾多測試工具分析,加以手動微調(diào)后形成的最優(yōu)化預(yù)加載列表,涵蓋了智能機上最長見的應(yīng)用類型所需要的各種類。很難想象我們自己能夠有什么手段能夠獲得比這樣更優(yōu)的一個預(yù)加載列表。所以,除非你的Android系統(tǒng)是被移植到非智能手機設(shè)備上使用(例如MID、EBOOK,可以不需要Telephony相關(guān)的類),不建議去“優(yōu)化”preloaded-classes list。

在zygote中單起一個線程來做preload,是否可行?答案是否定的。首先在zygote中不可以新開線程,其次,就算新開一個線程,在目前智能機硬件條件下(單核CPU),除非有頻繁大量的存儲IO,否則我們不能看到我們期望加速啟動效果。

關(guān)于scan packages的問題。同樣參考上面提到的那篇帖子,我們從中可以知道一個事實:越少的apk安裝,越短的啟動時間。事實上確實如此,apk安裝的多少的確影響開機速度,但相比而言,scan packages所花費的時間遠(yuǎn)沒有preload classe多。似乎這里沒有多少油水可榨,但起碼我們知道了:盡量減少產(chǎn)品中預(yù)置的apk數(shù)量可以提升啟動速度(哪怕精簡到極致也許只節(jié)省了2s)。

最后,關(guān)于那篇帖子中提到的start services階段,我認(rèn)為雖然此階段確實需要消耗可觀的時間,但是正如文中提到的那樣,優(yōu)化這些services其實就是剔除我們不需要的一些services,而且不僅僅是修改SystemServer.java的問題,任何使用到被優(yōu)化剔除掉的服務(wù)的代碼都必須加以修改,否則系統(tǒng)肯定是起不來的。這樣工作量大,而且難度也不小,并且有一定風(fēng)險。因此對這些services的優(yōu)化要慎之又慎。

那么加快啟動速度是不是就沒有辦法了呢?也不是。除了硬件上的改動,在軟件上使用BLCR技術(shù)也可以解決這個問題。

在此我認(rèn)為同時有必要提一下應(yīng)用程序啟動速度加速的問題。用過Android的都會發(fā)現(xiàn),第一次啟動某個應(yīng)用程序時比較慢,但只要不關(guān)機重啟,大部分情況下以后再次啟動就明顯的要快許多。因此我們很容易想到一種辦法,即“預(yù)加載”我們的應(yīng)用程序一次,那么下次用戶再次啟動我們時不就快了嗎?

我們首先明確一點:任何“預(yù)加載”的想法都是不切實際的。先不討論實施在技術(shù)上的可能性,我們只要看一下Android的Activity生命周期管理就應(yīng)該明白,就算你通過某種方式“預(yù)加載”了你的某個Activity,你也不能確保在用戶真正要求開始運行它的時候,你所“預(yù)加載”的Activity還存在,因為Android很可能在你為“預(yù)加載”第一次啟動Activity后的不久就將它gc掉了。依靠一個不可靠的技術(shù),顯然是不明智的。

那么還有沒有別的辦法呢?答案是有的,但是只在少數(shù)情況下才有一定意義。在源碼的frameworks/base/core/res/res/values/arrays.xml中,我們可以看到有名為“preloaded_drawables”的項,其中列出的是Android在啟動時預(yù)加載的圖形資源,這樣在某個應(yīng)用程序需要這些圖形資源時就不必再加載了。如果我們某個應(yīng)用程序包含大量的圖形資源,那么我們可以將其加入到這個preloaded_drawables項中以加快我們應(yīng)用程序的啟動速度。但是這樣有一個顯而易見的弊端:同preload classes一樣,不是每個應(yīng)用程序都需要所有預(yù)加載的圖形資源,這些冗余的資源反而占據(jù)了應(yīng)用程序進程的內(nèi)存空間。因此,這種技術(shù)實際應(yīng)用的局限性較大,僅限于這樣一種情況:某個設(shè)備只運行固定的幾個應(yīng)用程序,而且這些應(yīng)用程序包含大量的圖形資源需要加載。但這樣會是一個什么設(shè)備呢?

好了,到此基本上把我這兩天研究的心得寫出來了。限于認(rèn)識水平有限,如果文中有誤或者哪位能有更好的想法,歡迎在下面留言:)如果以后我又有心得,會再更新此文。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3909

    瀏覽量

    126918
  • 啟動速度
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6584
收藏 人收藏

    評論

    相關(guān)推薦

    DRA7xx器件上的Android啟動優(yōu)化

    電子發(fā)燒友網(wǎng)站提供《DRA7xx器件上的Android啟動優(yōu)化.pdf》資料免費下載
    發(fā)表于 10-11 09:41 ?0次下載
    DRA7xx器件上的<b class='flag-5'>Android</b><b class='flag-5'>啟動</b><b class='flag-5'>優(yōu)化</b>

    使用TPS61178x優(yōu)化啟動的環(huán)路補償

    電子發(fā)燒友網(wǎng)站提供《使用TPS61178x優(yōu)化啟動的環(huán)路補償.pdf》資料免費下載
    發(fā)表于 09-25 09:58 ?0次下載
    使用TPS61178x<b class='flag-5'>優(yōu)化</b><b class='flag-5'>啟動</b>的環(huán)路補償

    優(yōu)化 FPGA HLS 設(shè)計

    30 到 70 種用于綜合和布局布線的設(shè)置。可能的組合太多了??梢跃帉懩_本來創(chuàng)建不同的運行并嘗試推薦的標(biāo)準(zhǔn)指令/策略。 最后一個挑戰(zhàn)問題是計算能力不足。典型的嵌入式應(yīng)用程序是在單臺計算機
    發(fā)表于 08-16 19:56

    4.3s,Linux快速啟動優(yōu)化方法分享,基于全志T113-i國產(chǎn)平臺!

    random設(shè)備初始化太慢,應(yīng)用程序調(diào)用random的函數(shù)時可能被阻塞,導(dǎo)致應(yīng)用啟動慢,因此可通過關(guān)閉crng_ready()功能從而縮短啟動時間,關(guān)閉crng_ready()功能后啟動
    發(fā)表于 07-09 11:50

    OpenHarmony之開機優(yōu)化

    對其進行詳細(xì)的性能分析,從而優(yōu)化系統(tǒng)啟動速度和運行效率。 三丶開機優(yōu)化
    發(fā)表于 07-01 16:39

    優(yōu)化嵌入式DSP軟件的編譯器

    確定哪個索引或一組索引對于優(yōu)化很重要取決于應(yīng)用程序開發(fā)人員的目標(biāo)。例如,性能優(yōu)化意味著開發(fā)人員可以使用速度較慢或成本較低的 DSP 來完成相同數(shù)量的工作。
    發(fā)表于 05-03 09:45 ?174次閱讀
    <b class='flag-5'>優(yōu)化</b>嵌入式DSP軟件的編譯器

    設(shè)置應(yīng)用冷啟動優(yōu)化案例

    簡介 應(yīng)用App的啟動速度能夠影響用戶的首次體驗,啟動速度較慢的應(yīng)用可能導(dǎo)致用戶再次開啟App的意圖下降,或者卸載放棄該應(yīng)用程序,所以,AP
    發(fā)表于 04-22 16:31

    如何對MD5加密算法優(yōu)化?

    有人針對程序安全啟動過程,進行MD5算法的優(yōu)化嘛。目前采用標(biāo)準(zhǔn)算法,時間稍長,如果有人做過優(yōu)化的話,可以分享一下,謝謝。
    發(fā)表于 02-18 08:20

    谷歌發(fā)布新的AI SDK,簡化Gemini模型與Android應(yīng)用程序的集成

    對于 Android 應(yīng)用程序,Google 提供了 Google AI Client SDK for Android,它將 Gemini REST API 封裝為慣用的 Kotlin API
    的頭像 發(fā)表于 01-03 16:29 ?861次閱讀

    直線電機怎樣優(yōu)化它的速度環(huán),有什么標(biāo)準(zhǔn)?

    直線電機怎樣優(yōu)化它的速度環(huán),有什么標(biāo)準(zhǔn)
    發(fā)表于 12-15 07:35

    TQ3568開發(fā)平臺Android11修改開機動畫

    TQ3568開發(fā)平臺Android11修改開機動畫Android開機logo是可以動態(tài)顯示或者靜態(tài)顯示的。如果是靜態(tài)顯示,循環(huán)播放一章圖片,直到系統(tǒng)
    的頭像 發(fā)表于 12-04 17:21 ?572次閱讀
    TQ3568開發(fā)平臺<b class='flag-5'>Android</b>11修改<b class='flag-5'>開機</b>動畫

    MySQL性能優(yōu)化方法

    MySQL 性能優(yōu)化是一項關(guān)鍵的任務(wù),可以提高數(shù)據(jù)庫的運行速度和效率。以下是一些優(yōu)化方法,包括具體代碼和詳細(xì)優(yōu)化方案。
    的頭像 發(fā)表于 11-22 09:59 ?501次閱讀

    GPRS的性能分析優(yōu)化

    電子發(fā)燒友網(wǎng)站提供《GPRS的性能分析優(yōu)化.pdf》資料免費下載
    發(fā)表于 11-17 16:31 ?0次下載
    GPRS的性能<b class='flag-5'>分析</b>及<b class='flag-5'>優(yōu)化</b>

    Android ART在玄鐵C910上的移植和性能優(yōu)化

    在過去的3年里,我們在玄鐵C910上分別移植了Android 10和Android 12,在ART上我們也做了一些更加深入的優(yōu)化。在今年 RISC-V 美國峰會上,我們介紹了在ART上移植和優(yōu)
    的頭像 發(fā)表于 11-16 09:43 ?1341次閱讀
    <b class='flag-5'>Android</b> ART在玄鐵C910上的移植和性能<b class='flag-5'>優(yōu)化</b>

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢?

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢? PGO,全稱為Profile Guided Optimization,譯為“基于特征優(yōu)化”的技術(shù),是一種通過利用應(yīng)用程序的運行特征數(shù)據(jù)來優(yōu)化
    的頭像 發(fā)表于 10-26 17:37 ?1935次閱讀