一、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進程

(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ù)庫操作