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ù)......