當用戶點擊桌面icon的時候糊啡,系統(tǒng)準備好了拄查,給App分配進程空間,就好像去酒店開房悔橄,但是你又不能直接進入房間靶累,你得坐電梯去房間,那么你坐電梯的這個時間癣疟,實際上就是系統(tǒng)的準備時間挣柬,那么系統(tǒng)的這個準備時間一般來說不會太長,
但假如的開的是一個情趣套房呢睛挚,系統(tǒng)就得花不少時間來打理邪蛔,所以系統(tǒng)給所有用戶都準備了一個過渡界面,這個界面扎狱,就是啟動時的黑屏白屏侧到,也就是你坐電梯里面看的小廣告,這個廣告里面有星星 有月亮淤击,你就到房間門口了匠抗,但是這不能在門口解決,還要開門污抬,對吧汞贸。開門之后
你想干嘛都可以了绳军,這個想干嘛的速度。就完全取決于你開門的速度了矢腻,你門開得快门驾,自然那啥快,所以這里是開發(fā)者可以優(yōu)化的地方多柑,有些開發(fā)者掏個鑰匙要好幾秒奶是,有的只要幾百毫秒,完全影響了后面那啥的效率竣灌。
App 啟動時間是什么 聂沙,從哪里開始 (我們要知道啟動時間是怎么算出來的)
https://segmentfault.com/a/1190000007406875#articleHeader20
啟動定義
當手指點擊app圖標 到加載第一個頁面為止
trace文件分析
http://www.ituring.com.cn/article/273967
啟動類型
http://www.reibang.com/p/c967653a9468
工欲善其事,必先利其器帐偎。想要優(yōu)化 App 的啟動速度逐纬,必須有準確衡量啟動時間的方法,否則優(yōu)化完之后效果怎樣削樊,自己都不知道豁生,說出去別人也不信服不是。在做 App 啟動時間統(tǒng)計之前漫贞,當然必須弄明白有哪些啟動類型甸箱,每種啟動類型的特點。
通常來說迅脐,在安卓中應(yīng)用的啟動方式分為以下幾種:
1.冷啟動:當啟動應(yīng)用時芍殖,后臺沒有該應(yīng)用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應(yīng)用谴蔑,這個啟動方式就是冷啟動豌骏。冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化 Application 類隐锭,再創(chuàng)建和初始化 MainActivity 類窃躲,最后顯示在界面上。
2.熱啟動:當啟動應(yīng)用時钦睡,后臺已有該應(yīng)用的進程(例:按back鍵蒂窒、home鍵,應(yīng)用雖然會退出荞怒,但是該應(yīng)用的進程是依然會保留在后臺洒琢,可進入任務(wù)列表查看),所以在已有進程的情況下褐桌,這種啟動會從已有的進程中來啟動應(yīng)用衰抑,這個方式叫熱啟動。熱啟動因為會從已有的進程中來啟動荧嵌,所以熱啟動就不會走 Application 這步了停士,而是直接走 MainActivity挖帘,所以熱啟動的過程不必創(chuàng)建和初始化 Application,因為一個應(yīng)用從新進程的創(chuàng)建到進程的銷毀恋技,Application 只會初始化一次。
3 首次啟動:首次啟動嚴格來說也是冷啟動逻族,之所以把首次啟動單獨列出來蜻底,一般來說,首次啟動時間會比非首次啟動要久聘鳞,首次啟動會做一些系統(tǒng)初始化工作薄辅,如緩存目錄的生產(chǎn),數(shù)據(jù)庫的建立抠璃,SharedPreference的初始化站楚,如果存在多 dex 和插件的情況下,首次啟動會有一些特殊需要處理的邏輯搏嗡,而且對啟動速度有很大的影響窿春,所以首次啟動的速度非常重要,畢竟影響用戶對 App 的第一映像采盒。
時間定義
這個信息在activity 窗口完成所有的啟動事件之后旧乞,第一次繪制的時候輸出。這個時間包括了從啟動進程到第一次布局與繪制的所有時間磅氨。這基本上是你需要知道的主要時間尺栖。它不包含用戶點擊app圖標然后系統(tǒng)開始準備啟動activity的時間,因為作為一個開發(fā)者你無法影響這個時間烦租,所以沒有必要去測量它延赌。
在log日志中 查看叫 Displayed 日志 過濾一定要是 NoFilters
am 命令代碼在源碼中的位置
frameworks\base\cmds\am\src\com\android\commands\am\Am.java
http://www.reibang.com/p/1d2e55f1d393
adb shell am start -W com.demo.luanchapk/com.demo.luanchapk.MainActivity
adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity
adb shell dumpsys activity activities
4.4以后的手機會查看得到
http://blog.csdn.net/u013278099/article/details/50052557
此法獲取的啟動時間非常精準,可精確到毫秒叉橱。
● ThisTime: 最后一個啟動的Activity的啟動耗時
● TotalTime: 自己的所有Activity的啟動耗時
● WaitTime: ActivityManagerService啟動App的Activity時的總時間(包括當前Activity的onPause()和自己Activity的啟動)
●
D:\Android\android-6.0.0_r1\frameworks\base\core\java\android\app\ActivityThread.java
D:\Android\android-6.0.0_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java
D:\Android\android-6.0.0_r1\frameworks\base\core\java\android\app\Instrumentation.java
java -jar apktool d
冷啟動時間是指當用戶點擊你的app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的時間段挫以。在這個時間段內(nèi),WindowManager會先加載app主題樣式中的windowBackground做為app的預(yù)覽元素赏迟,然后再真正去加載activity的layout布局
第一種等待
第二種
冷啟動時間優(yōu)化
知道了Android冷啟動時間的原理之后屡贺,就可以通過一些小技巧來對冷啟動時間進行優(yōu)化,從而讓你app加載變得”快“一些(視覺體驗上的快)锌杀。我們可制作一個啟動Activity的背景樣式的.9圖片
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1223/3796.html
Application是程序的主入口甩栈,特別是很多第三方SDK都會需要在Application的onCreate里面做很多初始化操作,不得不說糕再,各種第三方SDK量没,都特別喜歡這個『兵家必爭之地』,再加上自己的一些庫的初始化突想,會讓整個Application不堪重負殴蹄。
優(yōu)化的方法究抓,無非是通過以下幾個方面:
● 延遲初始化
● 后臺任務(wù)
● 界面預(yù)加載
減少應(yīng)用啟動時的耗時
1、在Application的構(gòu)造器方法袭灯、attachBaseContext()刺下、onCreate()方法中不要進行耗時操作的初始化,一些數(shù)據(jù)預(yù)取放在異步線程中稽荧,可以采取Callable實現(xiàn)橘茉。
2、對于sp的初始化姨丈,因為sp的特性在初始化時候會對數(shù)據(jù)全部讀出來存在內(nèi)存中畅卓,所以這個初始化放在主線程中不合適,反而會延遲應(yīng)用的啟動速度蟋恬,對于這個還是需要放在異步線程中處理翁潘。
3、對于MainActivity歼争,由于在獲取到第一幀前拜马,需要對contentView進行測量布局繪制操作,盡量減少布局的層次矾飞,考慮StubView的延遲加載策略一膨,當然在onCreate、onStart洒沦、onResume方法中避免做耗時操作豹绪。
白屏產(chǎn)生原因
http://blog.csdn.net/fancylovejava/article/details/39643449
.
在Android系統(tǒng)中,應(yīng)用程序是由Launcher啟動起來的申眼,其實瞒津,Launcher本身也是一個應(yīng)用程序,其它的應(yīng)用程序安裝后括尸,就會Launcher的界面上出現(xiàn)一個相應(yīng)的圖標巷蚪,點擊這個圖標時,Launcher就會對應(yīng)的應(yīng)用程序啟動起來
app啟動源碼分析
http://www.reibang.com/p/6037f6fda285
frameworks/base/core/java/android/app/Instrumentation.java
經(jīng)過分析之后濒翻,app的啟動優(yōu)化主要集中在三個地方
1.application.onCreate();
2.MainActivity.onCreate();
3.第一幀畫面的xml文件中
監(jiān)測代碼中哪些方法耗時比較長的方式
File file = new File(Environment.getExternalStorageDirectory(),"filename");
log.i(TAG,"onCreate"+file.getAbsolutePath());
Debug.startMethodThracing(file.getAbsolutePath());
....
....
Debug.stopMethodTracing();
//然后到處trace文件 導(dǎo)入androidstudio中 屁柏,查看哪些方法最耗時,然后進行優(yōu)化
//找到最耗時的方法
利用異步線程進行優(yōu)化
1.單例對象
2.沒有創(chuàng)建handle
3.沒有操作UI
4.異步要求不是很高有送,單例沒有在主線程調(diào)用淌喻,如果調(diào)用要進行融錯判斷。利用懶加載
在使用之前進行判斷是否已經(jīng)加載雀摘,如果沒有加載 裸删,進行加載,將它寫成單例類