一即碗、android系統(tǒng)初始化流程
1. 系統(tǒng)的啟動(dòng)
(1)打開(kāi)電源 引導(dǎo)芯片代碼加載引導(dǎo)程序Boot Loader到RAM中去執(zhí)行
(2)BootLoader把操作系統(tǒng)拉起來(lái)
(3)Linux 內(nèi)核啟動(dòng)開(kāi)始系統(tǒng)設(shè)置级及,找到一個(gè)init.rc文件啟動(dòng)初始化進(jìn)程
(4)init進(jìn)程初始化和啟動(dòng)屬性服務(wù),之后開(kāi)啟Zygote進(jìn)程
(5)Zygote開(kāi)始創(chuàng)建JVM并注冊(cè)JNI方法,開(kāi)啟SystemServer
(6)啟動(dòng)Binder線程池和SystemServiceManager,并啟動(dòng)各種服務(wù)
(7)AMS啟動(dòng)Launcher
2. Launcher啟動(dòng)
(1)通過(guò)adb shell dumpsys activity activities查看當(dāng)前的activity名
(2)查看進(jìn)程adb shell ps
(3)application
(3.1)當(dāng)我們用手點(diǎn)擊一個(gè)圖標(biāo)時(shí),就到了這個(gè)類public final class Launcher extends Activity
執(zhí)行onClick(View view)方法,會(huì)把這個(gè)應(yīng)用的相關(guān)信息傳入
先獲取一個(gè)intent--->startActivitySafely(v, intent, tag)--》startActivity(v, intent, tag);-->startActivity(intent);
(3.2)startActivity(intent)會(huì)開(kāi)一個(gè)APP進(jìn)程
(3.3)ActivityThread.java做為入口 用attach開(kāi)啟app 再加載application和activity
thread.attach(false);---》mgr.attachApplication(mAppThread)會(huì)通過(guò)遠(yuǎn)端進(jìn)程去
回調(diào)private void handleBindApplication(AppBindData data)
Application app = data.info.makeApplication(創(chuàng)建Application對(duì)象
mInstrumentation.callApplicationOnCreate(app);----》 app.onCreate();
3.黑白屏問(wèn)題
(1)樣式主題文件
(1.1)
白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效夭苗,現(xiàn)在的版本默認(rèn)使用透明處理了)
(1.2)找到一個(gè)父類name="Platform.AppCompat.Light"中定義了
<item name="android:windowBackground">用來(lái)控制黑白屏
(1.3)解決方法:
解決辦法:
1.在自己的<style name="AppTheme" parent="Theme.AppCompat.Light">中加入windowsbackground
2.設(shè)置windowbackground為透明的 <item name="android:windowIsTranslucent">true</item>
但這2種方法會(huì)有個(gè)問(wèn)題,所有的activity啟動(dòng)都會(huì)顯示
3.單獨(dú)做成一個(gè)主題
<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>
再在功能清單中的單獨(dú)activity下設(shè)置
<activity
android:theme="@style/AppTheme.Launcher"
然后在程序中使用setTheme(R.style.AppTheme);
讓APP中所有的activity還是使用以前的樣式隔缀,這樣做就只有啟動(dòng)時(shí)才使用自己的樣式
4.QQ中的用法
<item name="android:windowDisablePreview">true</item>
<item name="android:windowBackground">@null</item>
4.Trace工具分析代碼執(zhí)行時(shí)間
(1)
Debug.startMethodTracing(filePath);
中間為需要統(tǒng)計(jì)執(zhí)行時(shí)間的代碼
Debug.stopMethodTracing();
(2)adb pull /storage/emulated/0/app1.trace把文件拉出來(lái)分析
把pull到電腦上的文件拖到AS中就可以分析了
(3)優(yōu)化方案:
1.開(kāi)線程 沒(méi)建handler 沒(méi)操作UI 對(duì)異步要求不高
2.懶加載 用到的時(shí)候再初始化题造,如網(wǎng)絡(luò),數(shù)據(jù)庫(kù)操作