app啟動原理詳解

當用戶點擊桌面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
.

手機啟動.png

在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)加載雀摘,如果沒有加載 裸删,進行加載,將它寫成單例類

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末阵赠,一起剝皮案震驚了整個濱河市涯塔,隨后出現(xiàn)的幾起案子肌稻,更是在濱河造成了極大的恐慌,老刑警劉巖匕荸,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爹谭,死亡現(xiàn)場離奇詭異,居然都是意外死亡每聪,警方通過查閱死者的電腦和手機旦棉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來药薯,“玉大人,你說我怎么就攤上這事救斑⊥荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵脸候,是天一觀的道長穷娱。 經(jīng)常有香客問我,道長运沦,這世上最難降的妖魔是什么泵额? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮携添,結(jié)果婚禮上嫁盲,老公的妹妹穿的比我還像新娘。我一直安慰自己烈掠,他們只是感情好羞秤,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著左敌,像睡著了一般瘾蛋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矫限,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天哺哼,我揣著相機與錄音,去河邊找鬼叼风。 笑死取董,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咬扇。 我是一名探鬼主播甲葬,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懈贺!你這毒婦竟也來了经窖?” 一聲冷哼從身側(cè)響起坡垫,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎画侣,沒想到半個月后冰悠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡配乱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年溉卓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搬泥。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桑寨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忿檩,到底是詐尸還是另有隱情尉尾,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布燥透,位于F島的核電站沙咏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏班套。R本人自食惡果不足惜肢藐,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吱韭。 院中可真熱鬧吆豹,春花似錦、人聲如沸杉女。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熏挎。三九已至速勇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坎拐,已是汗流浹背烦磁。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哼勇,地道東北人都伪。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像积担,于是被迫代替她去往敵國和親陨晶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容