1. 程式人生 > >Android開機時間分析

Android開機時間分析

文章來源:http://blog.csdn.net/huangyabin001/article/details/42777703

一、 關於本篇博文

該文件簡單主要描述瞭如何找出開機各個階段耗時情況,以及對開機各個階段的分析方法和如何優化開機時間,減少耗時。便於讀者可以通過此文件瞭解開機時間的各個階段的耗時情況。

二、開機各階段的耗時情況

具體開機時間的優化需要根據開機流程來分析: 找出各個階段的耗時情況 
2.1、zygote階段 
一般有兩個耗時點: 
a). 預載入class/resource的時間。需要確認是否有新增很多系統資源 
b). 這期間是否有很多GC動作 
2.2、SystemServer階段: 
Check各個service開機初始化過程的耗時情況 
通常耗時點: 
a). pms scan package階段: 
b). pms dexopt階段: 
c).其他service初始化過程問題。 
2.3、AMS Ready階段: 
Check耗時情況,通常耗時點:prebootcompleted動作;啟動service/persistent程序;如果沒有客製化動作,基本上無優化空間 
2.4、動畫包過大問題 

如果動畫包過大,播放的圖片過多,解析度過高也會影響開機時間
2.5、StopBootAnimation: 
WMS需要在keyguard, wallpaper, launcher都初始化好的前提下,才會停止開機動畫。 
需要check keyguard是否有做完、Check wallpaper是否有異常、Check launcher 初始化時間。

三、開機時間分析

3.1 cat/proc/bootprof[單位:ms(毫秒)]

從下面的log中我們可以看到核心啟動時間標誌欄位:BOOT_Animation:END


 3.1.1 Preloader&lk time

Preload和lk啟動時間如下:

 

3.1.2 Kernel Init

Kernel初始化時間 如下:

 

3.1.3 Mount partition

分割槽掛載時間如下:

 

  3.1.4.1 Pre-load classes

預載入類所消耗的時間

 

  3.1.4.2 Package scanning

包掃描時間

 

  3.1.4.3 App initializations

AP初始化時間

 

3.2 通過新增log得到Package掃描耗時情況

原始碼位於:frameworks/base/service/Java/com/android/server/PackageManagerService.java中的scanDirLi()方法中

    private void scanDirLI(File dir, int flags, int scanMode, long currentTime) {

        ......

        if (DEBUG_PACKAGE_SCANNING) {

            Log.d(TAG, "Scanning app dir " + dir + " scanMode=" + scanMode

                    + " flags=0x" + Integer.toHexString(flags));

        }

        long startScan,endScan;

        int i;

        for (i=0; i<files.length; i++) {

            File file = new File(dir, files[i]);

            if (!isPackageFilename(files[i])) {

                // Ignore entries which are not apk's

                continue;

            }

            ......

            startScan = SystemClock.uptimeMillis();

            Log.d(TAG,"scan package: " + file.toString() + " , start at: " + startScan + "ms.");

            PackageParser.Package pkg = scanPackageLI(file,

                    flags|PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime, null);

            endScan = SystemClock.uptimeMillis();

            Log.d(TAG,"scan package: " + file.toString() + " , end at: " + endScan + "ms. elapsed time = " + (endScan - startScan) + "ms.");

......

    }

我們可以通過DDMS通過搜尋關鍵字scan package,TAGPackageManager進行檢視。

四、開機時間優化

4.1 cat /proc/mtprof/cputime

 

相關欄位解釋:

  1. Process:程序名
  2. Status:程序狀態,e.g如果程序處於活動狀態值為L(alive),否則為D(dead)
  3. PID、TGID:程序ID和執行緒組ID
  4. CPU Time(ms):真正使用CPU的時間
  5. Elapsed(ms):生命週期內耗時
  6. User:使用者模式時間
  7. Kernel:Kernel模式時間

4.2 Application init

我們需要防止無關AP在啟動期間進行初始化操作,因為Android在安裝新的apk後可能會啟動一些額外的應用。我們需要找出哪些在系統啟動完成前啟動了哪些應用程式,來進一步確認是否有啟動了一些不需要的AP。

3.2.1在系統啟動期間對應用初始化是因為在ApkAndroidManifest.xmlapplication節點android:persistent的值為true。這個屬性從字面上來說可以理解為可持久,也就是常駐的應用。被該屬性修飾的應用會在系統啟動之後被AM啟動起來。例如PhoneApp在AndroidManifest.xml中註冊了常駐app:

<application android:name=”PhoneApp”

  android:persisitent=”true”

  android:label=”@string/dialerIconLabel”

  android:persisitent=”@drawable/ic_launcher_phone”>

4.2.2一些應用程式的啟動是被其他AndroidAP喚起的如:

  • Services request
  • Content Provider
  • BroadCast Recievier

4.3 啟動動畫

系統安裝了過多的應用很容易影響啟動時間,主要在package scanning和application init。那麼此時Boot animation也會隨著這種影響而進一步影響啟動時間。原因如下:

E.g:如果android啟動動畫佔用10%的CPU,那麼如果系統啟動時間為20sec,那麼動畫佔用的時間就是2s(動畫耗時:20*10%=2),那麼也就是說我們安裝的應用越多,動畫對整個開機過程的影響也就越大。


相關推薦

Android開機時間分析

文章來源:http://blog.csdn.net/huangyabin001/article/details/42777703 一、 關於本篇博文 該文件簡單主要描述瞭如何找出開機各個階段耗時情況,以及對開機各個階段的分析方法和如何優化開機時間,減少耗時。便於讀者可以

Android開機log分析

1.  1. android啟動第一階段:啟動android第一個程序init,通過解析init.rc指令碼,生成檔案系統,啟動vold、media、SurfaceFlinger等Nativie服務。在這個階段你可以看到帶“Android”文字靜態logo和帶“android”文字的開機動畫   2.  [

Android開機流程分析 -- init程序

init程序(system\core\init)是Linux Kernal啟動之後,在使用者空間執行的第一個程序。init程序是一個守護程序,它的生命週期貫穿整個Linux核心執行的始終,在Linux系統中的所有程序都是由init程序建立並執行的。因為Android是基於L

android睡眠喚醒 一】MTK 喚醒時間分析

一、喚醒流程:   MTK平臺喚醒流程是從power鍵或者其他按鍵按下開始,本文以mt6753n平臺為例,通過分析kernel log來看驅動中整個喚醒的流程,上層的喚醒流程後續再分析。 1、按鍵按下   當按鍵按下時會出發中斷,從而回調中斷的處理函式,從kernel log從會有以下

android 效能優化---(2) MTK 平臺開機時間優化

一、在工程模式開啟MTKLogger, 開機後取日誌bootprof adb pull /storage/emulated/0/mtklog/mobilelog/APLog_2018_0309_100752/bootprof d:/mtk二、開機日誌分析2.1 Preload

android開機啟動流程簡單分析

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

Android下獲取開機時間

找了一圈沒發現能得到開機啟動時間資料,於是乎突發奇想,得到了解決方案。       我的思路是:程式裡註冊個廣播接收器,接收開機啟動的廣播,當程式接到該廣播後,寫入檔案SharedPreferences,當我們程式需要用到開機時間時,再從SharedPreferences中讀

Android 系統啟動時間分析

執行命令 adb logcat -d -b events | grep boot I/boot_progress_start(   71): 2000 I/boot_progress_preload

android修改系統第一次開機時間

在settings中有個系統時間,顯示是1970年1月1日 客戶要求改成2018年1月1日 修改了SystemServer的    private static final long EARLIEST_SUPPORTED_TIME = 1514736000000l;//86

開機邏輯分析

ice else println ddp files extern hand val conf 增加暗碼命令切換開關機logo功能u-boot logo顯示原理:1.————Little Kernel會在platform_early_init階段首先會獲取lcm param

改動android 系統時間

nbsp pop -m andro shel content data popu 命令 命令如 date -s "yyyymmdd.[[[hh]mm]ss]" 直接在CRT上執行,舉例:date -s "20120801.120503" 但在adb shell下

android 開機自啟動

end pla extend class ive rec completed 廣播 manifest 原理:Android系統在開機的時候會發出一個廣播。這樣我們就能夠接收這個廣播,然後 啟動我們的應用。廣播接收器必須在xml裏面配置,由於x

Android開機啟動

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

正確使用Android性能分析工具——TraceView

dalvik虛擬機 rac 說明文 重復 能力 個人 method ring 這不 TraceView界面 現來看一下整個界面的圖,整個界面包括上下兩部分,上面是你測試的進程中每個線程的執行情況,每個線程占一行;下面是每個方法執行的各個指標的值 上面一部分是你測試進程的中每

淺談Android發展趨勢分析

相互 ces rec scl reg AC sed pen 可能   去年11月16、17日,我有幸參加了北京2017安卓技術大會,做了關於車載Android系統的演講,並主持了諸多大咖參與的圓桌討論,對Android未來幾年的發展趨勢進行了一番討論。來自小米、百度、高通等

Android應用架構分析

描述 nal 目的 manifest 分析 colors 內部類 roi ldp 一、res目錄:   1、屬性:Android必需;   2、作用:存放Android項目的各種資源文件。這些資源會自動生成R.java。     2.1、layout:存放界面布局文件。  

android日期時間選擇器

net oid androi class 我們 下載地址 很好 需要 滿足 android原生的日期時間控件,因為是原生的總有其滿足不了我們需求的時候,Android 手機版本那麽多,用戶彈出來的控件五花八門。因為項目需要,在網上找了一 些demo看了看,感覺有些寫的很好,

查看Linux開機時間/重啟時間_命令

cat boot idc login use awk top AS may 查看Linux開機時間/重啟時間1. who 命令查看 who -b 查看最後一次系統啟動的時間。 who -r 查看當前系統運行時間 [root@idc01-as-web-00 ~]# who -

Android 源碼分析(十) Dalvik 虛擬機創建過程

比較 read 快速 查找 dal spa instr threads heap 一. 介紹Dalvik   1.java的運行需要JVM(後面有大量篇幅介紹),同樣android中使用了java語言,也需要一個VM。針對手機處理器和內存等硬件資源不足而推出來的一款VM,為