android多維度分析性能優(yōu)化

1喉镰、app啟動

app啟動流程:

開機------>BootLoader(引導芯片)------>Linux Kernel(init.rc)------>init進程id為1------>zygote進程------>JVM\System Server 等------>Binder線程池雇锡,SystemServiceManager背亥、ActivityManagerService等系統(tǒng)服務------>Lancher

app冷、熱拓颓、暖啟動:

冷啟動:程序從頭開始芙扎,系統(tǒng)沒有為該程序創(chuàng)建進程。一般場景:程序安裝后的第一次啟動牍白;程序推出后,被系統(tǒng)完全終止后再重新啟動敬鬓;

熱啟動:程序仍然駐留在內存中淹朋,只是被系統(tǒng)從后臺帶到了前臺笙各,因此程序可以避免重復對象初始化钉答,以及布局加載和渲染。需要注意的是如果程序的某些內存被系統(tǒng)回收了杈抢,比如調用了onTrimMemory方法数尿,熱啟動app時需要重新創(chuàng)建這些對象;

暖啟動:它包含冷啟動和熱啟動的一系列操作子集惶楼,比熱啟動的消耗多一點右蹦。它與熱啟動最大區(qū)別在于,他必須調用onCreate方法重新創(chuàng)建活動歼捐,也可以從傳遞給onCreate方法中保存的實例狀態(tài)中獲取某些對象的恢復何陆;

啟動優(yōu)化關鍵點:

app從被系統(tǒng)調用,再到第一個界面渲染到手機屏幕豹储。我們通常只需要關注Application中onCreate方法和第一個啟動的Activity的onCreate贷盲、onStart和onResume方法;

注意:如果啟動后的第一個activity在此三個生命周期中又跳轉了其他Activity的界面剥扣,那么也需要關注其他Activity的此三個聲明周期巩剖;

2、app啟動黑白屏問題解決方案:

導致黑白屏問題原因:Google為了解決app啟動延時問題钠怯,提高用戶體驗佳魔,在用戶點擊啟動app時,首先創(chuàng)建了一個空白窗口晦炊,窗口背景顏色和application中配置的AppTheme有關鞠鲜;

修改方案:

方案一:修改AppTheme:在應用默認的AppTheme中宁脊,設置系統(tǒng)“取消預覽(空白窗體)”為true,或者設置空白窗體為透明镊尺;

代碼如下:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

? ? <!-- Customize your theme here. -->

? ? <item name="colorPrimary">@color/colorPrimary</item>

? ? <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

? ? <item name="colorAccent">@color/colorAccent</item>


? ? <item name="android:windowDisablePreview">true</item><!--設置取消預覽-->

? ? <item name="android:windowIsTranslucent">true</item><!--設置窗體為透明-->

</style>

方案二:自定義Theme:

<style name="AppLaunchTheme">

? ? <item name="android:windowBackground">@mipmap/ic_launcher</item>

</style>

<!--在啟動activity中設置自定義theme-->

<activity android:name=".MainActivity"

? ? android:theme="@style/AppLaunchTheme">

? ? <intent-filter>

? ? ? ? <action android:name="android.intent.action.MAIN" />

? ? ? ? <category android:name="android.intent.category.LAUNCHER" />

? ? </intent-filter>

</activity>

@Override

protected void onCreate(Bundle savedInstanceState) {

? ? setTheme(R.style.AppTheme);// 還原會原來主題朦佩,在super.onCreate()和setContentView()之前調用

? ? super.onCreate(savedInstanceState);

? ? setContentView(R.layout.activity_main);

}

方案三:

<style name="AppTheme.LaunchTheme">

? ? <item name="android:windowBackground">@drawable/layer_list_launcher_background</item>

? ? <item name="android:windowFullscreen">true</item>

? ? <item name="windowNoTitle">true</item>

</style>

layer_list_launcher_background.xml

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

? ? <item android:drawable="@android:color/holo_red_dark"></item>

? ? <item android:top="150dp">

? ? ? ? <bitmap

? ? ? ? ? ? android:gravity="center"

? ? ? ? ? ? android:src="@drawable/ic_logo"></bitmap><!--可以添加公司logo等自己的設計元素-->

? ? </item>

</layer-list>

3、代碼優(yōu)化:

app啟動時間檢測:

adb shell am start -W 包名/啟動的Activity類名

ThisTime:最后一個Activity啟動時間庐氮;

TotalTime:一系列Activity啟動時間语稠;

WaitTime:總啟動時間,包括系統(tǒng)在冷啟動時弄砍,需要加載app信息到內存的時間仙畦;

線程方法執(zhí)行時間檢測:

protected void onCreate(Bundle savedInstanceState) {

? ? setTheme(R.style.AppTheme);

? ? super.onCreate(savedInstanceState);

? ? setContentView(R.layout.activity_main);

? ? File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/app.trace");

? ? Debug.startMethodTracing(file.getAbsolutePath());// 檢測方法執(zhí)行時間,輸出app.trace文件

? ? init();

? ? testB();

? ? Button button = findViewById(R.id.btn_hook);

? ? button.setOnClickListener(new View.OnClickListener() {

? ? ? ? @Override

? ? ? ? public void onClick(View view) {

? ? ? ? ? ? Toast.makeText(MainActivity.this, ((Button) view).getText(), Toast.LENGTH_SHORT).show();

? ? ? ? }

? ? });

? ? hook(button);

? ? Debug.stopMethodTracing();

}

使用AS打開app.trace文件音婶,分析檢測結果:


優(yōu)化方案:UI線程不做耗時操作慨畸,使用異步線程加載耗時操作,使用懶加載衣式,在用的時候再進行加載寸士;

4、UI渲染流程以及優(yōu)化:

CPU以及GPU:

CPU(Central Processing Unit-中央處理器),是一塊超大規(guī)模的集成電路碴卧,是一臺計算機的運算核心(Core)和控制核心( Control Unit)弱卡。它的功能主要是解釋計算機指令以及處理計算機軟件中的數(shù)據。

GPU全稱是GraphicProcessing Unit--圖形處理器住册,其最大的作用就是進行各種繪制計算機圖形所需的運算婶博,包括頂點設置、光影荧飞、像素操作等凡人。


XML布局顯示至屏幕流程:

<Button wight="wrapcontent"...>

LayoutInflater 加載進內存

CPU計算,處理成位圖

CPU將圖形交給GPU處理

GPU將圖形柵格化處理

顯示到顯示器

FPS(每秒傳輸幀數(shù)(Frames Per Second):

12fps:畫面幀率高于每秒約10-12幀數(shù)叹阔,人眼才會認為是連貫的挠轴;

24fps:電影一般都是24幀

30fps:游戲畫面一般會高于30幀;

60fps:手機交互過程中耳幢,需要觸摸和反饋岸晦,需要60幀才能達到不卡頓的效果;

所以Android系統(tǒng)會在每隔16毫秒(1000/60=16.666...)發(fā)送一次Vsync信號帅掘,刷新UI界面委煤;

優(yōu)化關鍵點:(1)、減少CPU將xml轉換為對象的時間

(2)修档、GPU減少重復繪制

過度繪制查看工具:


無色:沒有過度繪制碧绞,每個像素繪制了1次。

藍色:每個像素多繪制了1次吱窝。大片藍色還是可以接受的如果整個窗口是藍色的讥邻,可以嘗試優(yōu)化減少一層繪制迫靖。

綠色:每個像素多繪制了2次。

淡紅:每個像素多繪制了3次兴使,一般來說這個區(qū)域不超過屏幕的1/4是可以接受的系宜。

深紅:每個像素多繪制4次或者更多。嚴重影響性能发魄,需要優(yōu)化盹牧,避免深紅色區(qū)域。

布局優(yōu)化:使用Hierarchy Viewer工具檢測

推薦博客:http://www.reibang.com/p/dd8611a1f95a

優(yōu)化規(guī)則:

1.盡量多使用 ConstraintLayout励幼、RelativeLayout汰寓、LinearLayout

2.盡量使用 ConstraintLayout

3.在布局的層級相同的情況下,使用 LinearLayout 代替 RelativeLayout

4.在布局復雜或者層級過深的時候苹粟,使用 RelativeLayout 代替 LinearLayout 使界面層級扁平化有滑,降低層級

布局復用規(guī)則:

1.創(chuàng)建一個正常的可用布局layout文件A_layout.xml

2.在需要添加復用布局(A_layout.xml)的當前布局內B_layout.xml,使用include標簽

3.將A_layout.xml的布局文件中的Root View 替換成merge標簽嵌削,從而減少布局嵌套

自定義view中使用裁剪合理繪制

5毛好、Java虛擬機垃圾回收機制以及內存泄漏

Java虛擬機垃圾標記算法;引用計數(shù)算法苛秕、根搜索算法

垃圾手機算法-標記-清除算法肌访、復制算法、標記-壓縮算想帅、分代收集算法

內存泄漏分析工具:mat

推薦博客:https://blog.csdn.net/u012760183/article/details/52068490

未完待續(xù)......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末场靴,一起剝皮案震驚了整個濱河市啡莉,隨后出現(xiàn)的幾起案子港准,更是在濱河造成了極大的恐慌,老刑警劉巖咧欣,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浅缸,死亡現(xiàn)場離奇詭異,居然都是意外死亡魄咕,警方通過查閱死者的電腦和手機衩椒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哮兰,“玉大人毛萌,你說我怎么就攤上這事『戎停” “怎么了阁将?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長右遭。 經常有香客問我做盅,道長缤削,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任吹榴,我火速辦了婚禮亭敢,結果婚禮上,老公的妹妹穿的比我還像新娘图筹。我一直安慰自己帅刀,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布远剩。 她就那樣靜靜地躺著劝篷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪民宿。 梳的紋絲不亂的頭發(fā)上娇妓,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音活鹰,去河邊找鬼哈恰。 笑死,一個胖子當著我的面吹牛志群,可吹牛的內容都是我干的着绷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼锌云,長吁一口氣:“原來是場噩夢啊……” “哼荠医!你這毒婦竟也來了?” 一聲冷哼從身側響起桑涎,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤彬向,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后攻冷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娃胆,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年等曼,在試婚紗的時候發(fā)現(xiàn)自己被綠了里烦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡禁谦,死狀恐怖胁黑,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布程剥,位于F島的核電站梳杏,受9級特大地震影響夫椭,放射性物質發(fā)生泄漏幻捏。R本人自食惡果不足惜榜旦,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一砸捏、第九天 我趴在偏房一處隱蔽的房頂上張望冗懦。 院中可真熱鬧爽冕,春花似錦、人聲如沸披蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽没讲。三九已至眯娱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間爬凑,已是汗流浹背徙缴。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘁信,地道東北人于样。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像潘靖,于是被迫代替她去往敵國和親穿剖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容