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,TAG為PackageManager進行檢視。
四、開機時間優化
4.1 cat /proc/mtprof/cputime
相關欄位解釋:
- Process:程序名
- Status:程序狀態,e.g如果程序處於活動狀態值為L(alive),否則為D(dead)
- PID、TGID:程序ID和執行緒組ID
- CPU Time(ms):真正使用CPU的時間
- Elapsed(ms):生命週期內耗時
- User:使用者模式時間
- Kernel:Kernel模式時間
4.2 Application init
我們需要防止無關AP在啟動期間進行初始化操作,因為Android在安裝新的apk後可能會啟動一些額外的應用。我們需要找出哪些在系統啟動完成前啟動了哪些應用程式,來進一步確認是否有啟動了一些不需要的AP。
3.2.1在系統啟動期間對應用初始化是因為在Apk的AndroidManifest.xml中application節點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,為