App啟動優(yōu)化

一、android系統(tǒng)初始化流程

1. 系統(tǒng)的啟動

(1)打開電源 引導芯片代碼加載引導程序Boot Loader到RAM中去執(zhí)行
(2)BootLoader把操作系統(tǒng)拉起來
(3)Linux 內核啟動開始系統(tǒng)設置,找到一個init.rc文件啟動初始化進程
(4)init進程初始化和啟動屬性服務,之后開啟Zygote進程
(5)Zygote開始創(chuàng)建JVM并注冊JNI方法,開啟SystemServer
(6)啟動Binder線程池和SystemServiceManager,并啟動各種服務
(7)AMS啟動Launcher

2. Launcher啟動

(1)通過adb shell dumpsys activity activities查看當前的activity名
(2)查看進程adb shell ps
(3)application
(3.1)當我們用手點擊一個圖標時,就到了這個類public final class Launcher extends Activity
執(zhí)行onClick(View view)方法,會把這個應用的相關信息傳入
先獲取一個intent--->startActivitySafely(v, intent, tag)--》startActivity(v, intent, tag);-->startActivity(intent);
(3.2)startActivity(intent)會開一個APP進程


image.png

(3.3)ActivityThread.java做為入口 用attach開啟app 再加載application和activity
thread.attach(false);---》mgr.attachApplication(mAppThread)會通過遠端進程去
回調private void handleBindApplication(AppBindData data)
Application app = data.info.makeApplication(創(chuàng)建Application對象
mInstrumentation.callApplicationOnCreate(app);----》 app.onCreate();

3.黑白屏問題

(1)樣式主題文件
(1.1)

 白屏    <style name="AppTheme" parent="Theme.AppCompat.Light">
 黑屏    <style name="AppTheme">(在以前的老版本上有效,現(xiàn)在的版本默認使用透明處理了)

(1.2)找到一個父類name="Platform.AppCompat.Light"中定義了
<item name="android:windowBackground">用來控制黑白屏
(1.3)解決方法:

解決辦法:
1.在自己的<style name="AppTheme" parent="Theme.AppCompat.Light">中加入windowsbackground
2.設置windowbackground為透明的  <item name="android:windowIsTranslucent">true</item>
但這2種方法會有個問題,所有的activity啟動都會顯示
3.單獨做成一個主題
<style name="AppTheme.Launcher">
        <item name="android:windowBackground">@drawable/bg</item>
    </style>
    <style name="AppTheme.Launcher1">
        <item name="android:windowBackground">@drawable/bg</item>
    </style>
    <style name="AppTheme.Launcher2">
        <item name="android:windowBackground">@drawable/bg</item>
    </style>
再在功能清單中的單獨activity下設置
<activity
            android:theme="@style/AppTheme.Launcher"
然后在程序中使用setTheme(R.style.AppTheme);
讓APP中所有的activity還是使用以前的樣式,這樣做就只有啟動時才使用自己的樣式

4.QQ中的用法

<item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@null</item>

4.Trace工具分析代碼執(zhí)行時間

(1)

Debug.startMethodTracing(filePath);
中間為需要統(tǒng)計執(zhí)行時間的代碼
Debug.stopMethodTracing();

(2)adb pull /storage/emulated/0/app1.trace把文件拉出來分析
把pull到電腦上的文件拖到AS中就可以分析了
(3)優(yōu)化方案:
1.開線程 沒建handler 沒操作UI 對異步要求不高
2.懶加載 用到的時候再初始化,如網(wǎng)絡,數(shù)據(jù)庫操作

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容