1. 程式人生 > >Android開機啟動效能優化

Android開機啟動效能優化

Android 開機啟動速度優化

一 在開機啟動中,可以藉助bootchart 工具分析android的啟動過程。bootchart是一個用於linux啟動過程效能分析的開源軟體工具,在系統啟動過程自動收集CPU佔用率、程序等資訊,並以圖形方式顯示分析結果,可用作指導優化系統啟動過程。

1UBuntu安裝bootchart工具

       需要安裝的工具有兩個bootchartpybootchartgui,執行命令如下:

點選(此處)摺疊或開啟

  1. sudo apt-get install bootchart
  2. sudo apt-get install pybootchartgui

需要注意的是:在ubuntu 10.04 版本上的bootchart 製作android 啟動圖的時候報錯,應該是10.04版本的問題。換到13.04 就可以了。
2、在Android支援bootchart 

       Android系統編譯時,預設的沒有開啟bootchart的編譯開關,即沒有把bootchart編譯進系統中。Androidbootchar 的支援在init 中。在init 中加入對bootchart 的支援。重新編譯init .然後把支援bootchart的系統重新燒機。

1)、系統已經編譯過,現在只是要新增bootchart進系統中,執行以下命令:

$ touch system/core/init/init.c

$ m INIT_BOOTCHART=true

2)、在bootchar.h 中 修改 BOOTCHART

#ifndef BOOTCHART

# define  BOOTCHART  1

#endif

重新編譯init

3)、.

export INIT_BOOTCHART=true

mmm system/core/init

3生成bootchart 日誌

      1)、將編譯生成的帶有bootchart工具的Android系統重新燒錄到開發板上,並啟動系統

      2)、在UBuntu上通過adb connect連線到開發板,然後執行:

             adb shell 'echo 120 > /data/bootchart-start'

      3)、執行命令:

             adb shell 'mkdir /data/bootchart'  

      4)、重新啟動開發板 ,adb connect 後檢視:

[email protected]:/data # cat bootchart-start                                       

60

[email protected]:/data # ls bootchart                                              

header

kernel_pacct

proc_diskstats.log

proc_ps.log

proc_stat.log

[email protected]:/data 

到此為止,bootchart執行測量後生成的測量資料已經完成,看上面有3.log檔案,下面需要將這些資料進一步處理成易讀、易分析的圖片。

4bootchart測量結果的圖形化過程

       1)、bootchart 目錄下執行 tar –czf bootchar.tgz  * 生成bootchart.tgz 。或者利用android的打包工具:system/core/init/grab-bootchart.sh  執行 grab-bootchart.sh 會自動打包在當前目錄生成bootchart.tgz

執行bootchart  -f png bootchart.tgz 

[email protected]:~/ali/bin# adb devices

List of devices attached 

10.32.185.29:5555 device

[email protected]:~/ali/bin# ./grab-bootchart.sh 

12 KB/s (620 bytes in 0.048s)

482 KB/s (177369 bytes in 0.358s)

513 KB/s (5027077 bytes in 9.556s)

509 KB/s (329064 bytes in 0.630s)

look at bootchart.tgz

[email protected]:~/ali/bin# bootchart -f png bootchart.tgz 

parsing 'bootchart.tgz'

parsing 'header'

parsing 'proc_stat.log'

parsing 'proc_ps.log'

warning: no parent for pid '2' with ppid '0'

parsing 'proc_diskstats.log'

parsing 'kernel_pacct'

merged 0 logger processes

pruned 71 process, 0 exploders, 1 threads, and 0 runs

False

bootchart written to 'bootchart.png'

生成的啟動圖如下:

二 優化 preloaded-classes

Android開機啟動速度慢,涉及的原因很多,從硬體的角度看:EMMC flash NAND FLASH的速度快。從軟體的角度看主要系統上主要有兩個地方:preload classes  resource和scan packages

Android zygote 啟動的時候會預載入一些類,預載入的類根據frameworks\base\preloaded-classes 。這個是下載android程式碼的時候已經確定的。是google 給出的參考。和這個檔案相關:framework/base/tools/preload/WritePreloadedClassFile.java 在這個檔案中定義了需要預載入類的規則並且生成frameworks\base\preloaded-classes。預載入類的規則如下:

/*

         * The set of classes to preload. We preload a class if:

         *

         *  a) it's loaded in the bootclasspath (i.e., is a system class)

         *  b) it takes > MIN_LOAD_TIME_MICROS us to load, and

         *  c) it's loaded by more than one process, or it's loaded by an

         *     application (i.e., not a long running service)

         */

就是a)系統級的類, 載入時間大於 b) MIN_LOAD_TIME_MICROS的類 c) 被應用載入次數大於兩次的類。

MIN_LOAD_TIME_MICROS 定義如下:

 static final int MIN_LOAD_TIME_MICROS = 1250;

根據這個思路和上面的分析,能夠優化的就是減少預載入的類。由於我們的產品是機頂盒不是手機,手機相關的jar包都可以裁掉,因此可以去掉這部分相關的jar包。去掉這部分的jar包,修改frameworks\base\preloaded-classes, android 系統中裁剪。我們的盒子的做法是裁剪:

[email protected]:~/magic$ ls out/target/product/magicbox/system/framework/

AliSecure.jar            apache-xml.jar  bouncycastle.jar                   core.jar        framework-res.apk  libyunos.jar   requestsync.jar  uiautomator.jar

am.jar                   AuiJar.jar      bu.jar                             core-junit.jar  ime.jar            monkey.jar     services.jar

android.policy.jar       aui-res.apk     com.android.location.provider.jar  ext.jar         input.jar          oujavalib.jar  settings.jar

android.test.runner.jar  bmgr.jar        content.jar                        framework.jar   javax.obex.jar     pm.jar         svc.jar

但是這樣也帶來一部分額外的開銷,就是載入失敗的時間消耗。

載入完 classes 以後系統還要載入relsource 。在原生系統中,載入類和資源是一個順序的過程:

    static void preload() {

        preloadClasses();

        preloadResources();

}

可以採用同步的方式:

private static Thread mCThread = new Thread(new Runnable(){

@Override

public void run(){

preloadClasses();

}

});

private static Thread mRThread = new Thread(new Runnable(){

@Override

public void run(){

preloadResources();

}

});

static void asyncPreload(){

try{

mCThread.start();

mRThread.start();

mCThread.join();

mRThread.join();

}catch(InterruptedException e){

Log.e(TAG,"asyncPreload failed");

}

這個要考慮硬體的規格:如果是多核CPU 效能可能比較好,如果是單核的,從上面的bootchart.png 上可以看出,在system_server 的啟動時間段中 CPU的利用率非常高,優化的效能也可能打折。 

Launcher的優化。

   從上面的bootchart.png 中,可以看到launcher的啟動時間比較長.從啟動圖上看,這時候的CPU佔用率到了100%。在系統起來後,kill 掉launcher,啟動速度明顯加快,重新生成啟動圖,在圖上看到CPU的佔用率接近100%,說明開機的時候Launcher存在CPU競爭。

轉載地址:

http://blog.chinaunix.net/uid-21564437-id-3954560.html

相關推薦

Android開機啟動效能優化

Android 開機啟動速度優化 一 在開機啟動中,可以藉助bootchart 工具分析android的啟動過程。bootchart是一個用於linux啟動過程效能分析的開源軟體工具,在系統啟動過程自動收集CPU佔用率、程序等資訊,並以圖形方式顯示分析結果,可用作指導優化系統啟動過程。 1、UBu

支付寶 App 構建優化解析:通過安裝包重排布優化 Android啟動效能

1. 前言 本章節我們將圍繞《支付寶 App 構建優化解析》另啟新系列,細分拆解客戶端在“程式碼管理”、“證書管理”、“版本管理”、“構建打包”等維度的具體實現方案展開討論,帶領大家進一步瞭解支付寶在 App 構建模組下的持續優化。 本節將主要記錄通過對支付寶 Android Apk 檔案的重新佈局,來改

通過安裝包重排布優化 Android啟動效能

1. 前言 本章節我們將圍繞《支付寶 App 構建優化解析》另啟新系列,細分拆解客戶端在“程式碼管理”、“證書管理”、“版本管理”、“構建打包”等維度的具體實現方案展開討論,帶領大家進一步瞭解支付寶在 App 構建模組下的持續優化。 本節將主要記錄通過對支付寶 Android Apk 檔案的

Android開機啟動

sys ttext system 權限 cast cas n) gif complete 使用Android Studio幫我們創建廣播,點擊包名-->New-->BroadcastReceiver 在清單文件中會自動生成 我們加上開機廣播的action

Linux系統開機啟動優化 命令詳解 齊天大聖原創作品 命令來自老男孩教育

開機啟動優化Linux系統開機啟動項優化 命令詳解 齊天大聖原創作品 命令來自老男孩教育

企業案例:系統開機啟動優化 除了下面5個服務以外都關閉 crond   sshd     network rsyslog sysstat

企業案例:系統開機啟動項優化 除了下面5個服務以外都關閉 crond sshd network rsyslog sysstat第一步:把要執行命令的樣子顯示出來[[email protected]/* */ ~]# chkconfig|egrep "sshd|crond|rsys

支付寶客戶端架構解析:iOS 客戶端啟動效能優化初探

前言 《支付寶客戶端架構解析》系列將從支付寶客戶端的架構設計方案入手,細分拆解客戶端在“容器化框架設計”、“網路優化”、“效能啟動優化”、“自動化日誌收集”、“RPC 元件設計”、“移動應用監控、診斷、定位”等具體實現,帶領大家進一步瞭解支付寶在客戶端架構上的迭代與優化歷程。 啟動應用是使用者使用任何一款

Android 常見的效能優化

其實說白了, 效能優化主要就是圍繞如下四個方面去進行擴充套件和探索: 1, 快 --- 速度快 2, 穩 --- 穩定, 不動不動就 crash 3, 省 --- 省記憶體, 省電量,流量

Android進階——效能優化之程序拉活原理及手段完全解析(二)

引言 上一篇文章Android進階——效能優化之程序保活原理及手段完全解析(一)總結了Android程序和執行緒的相關知識,主要介紹了幾種提升程序優先順序的手段,通常僅僅是提高優先順序只能讓你的程序存活時間久一點,但是真正的被殺死之後就不會自動拉活的,如果你的程

Android面試之效能優化

前言 本文是為了面試而寫的效能優化。目的不是為了具體的深入而是對於要面試的同學在面試的時候能和麵試官說出的效能優化的方面。在面試的時候基本現在每個面試官都會問一些關於效能優化方法的問題。那麼該怎麼回答呢?面試不同於我們學習新的知識點,要完全學會,要學精,對於面試

Android應用開發效能優化完全分析

1 背景 其實有點不想寫這篇文章的,但是又想寫,有些矛盾。不想寫的原因是隨便上網一搜一堆關於效能的建議,感覺大家你一總結、我一總結的都說到了很多優化注意事項,但是看過這些文章後大多數存在一個問題就是隻給出啥啥啥不能用,啥啥啥該咋用等,卻很少有較為系統的進行真正

[魅族Degao]Android客戶端效能優化

本文由魅族科技有限公司資深Android開發工程師degao(嵌入式企鵝圈原創團隊成員)撰寫,是degao在嵌入式企鵝圈發表的第一篇原創文章,毫無保留地總結分享其在領導魅族多個專案開發中的Android

imx6 android開機啟動守護程序

由於專案中需用到自己的編寫的兩個底層命令列程式,並且讓系統開機就自啟動這兩個程式。 我把這兩個程式寫成了守護程序。並自一個shell指令碼中執行啟動這兩個程式的命令,這樣,我設定adroid開機啟動的時候就只有啟動這個指令碼就行了。 做好以上兩點,接下來就是新增相應的拷貝動

android開機啟動流程簡單分析

android啟動 當載入程式啟動Linux核心後,會載入各種驅動和資料結構,當有了驅動以後,開始啟動Android系統同時會載入使用者級別的第一個程序init(system\core\init\init.cpp)程式碼如下: int main(int ar

Android 開機啟動除錯,system_process除錯

下載,編譯,匯入,配置 作為開發者,經常會對Debug工程進行除錯,Android具有debug簽名的應用才可以被除錯,如果想除錯系統原始碼呢? 想要除錯原始碼,首先必須要有原始碼,並且保證裝置執行的原始碼和IED裡的原始碼是同一份. 下載和編譯AOSP原始碼,本人使用

Android 應用啟動優化白屏問題

一般情況下 我們在啟動APP的時候,螢幕會出現一段時間的白屏或者黑屏,不同的裝置可能白屏黑屏顯示的時間長短不同,裝置硬體較差的時間都會比較長,這顯然影響使用者體驗。現在我們來分析這個問題產生的原因。 當我們在啟動一個應用時,系統會去檢查是否已經這樣存在一個程序

Android進階——效能優化之儘量多使用AsyncTask進行短時間網路通訊

引言 對於我們Android 開發來說,網路操作應該是最普遍不過的操作了吧,因為沒有網路操作的APP應該就沒有存在的價值吧,往往網路操作這部分又通常是耗時的,所以為了良好的使用者體驗,我們必須把耗時操作放到非UI執行緒,而實現方式有很多種,比較常見的應該就是H

那些Android中的效能優化

效能優化是一個大的範疇,如果有人問你在Android中如何做效能優化的,也許都不知道從哪開始說起。 首先要明白的是,為什麼我們的App需要優化,最顯而易見的時刻:使用者say,什麼狗屎,刷這麼久都沒反應,取關解除安裝算了。 這跟什麼有關,我們先蒼白的反駁下,尼瑪使用者裝置老舊網又爛,關我屁事,根本不用優化

Android開機啟動自動播放視訊

最近客戶有個小需求:在一個android系統平臺上一開機就自動播放SD卡某檔案目錄下的視訊檔案。 需求比較簡單,不多說了,直接貼程式碼: 1 首先配置 AndroidManifest.xml  註冊一個開機服務廣播 主要程式碼如下:         <receiver android:name=".Bo

Android】RelativeLayout效能優化,避免畫面卡頓

今天在照著書寫拖動seekbar來改變圖片的色調、飽和度和亮度的demo的時候, 發現自己的demo在拖動seekbar的時候比書上的demo要有明顯的卡頓。 一開始以為是SeekbarAPI更新的問題,我用的是26的API,書上的是21的API, 但很快這種懷疑的念頭就被