系統(tǒng)的啟動
1、打開電源 末捣,引導芯片代碼加載引導程序Boot Loader到ARM中去執(zhí)行
2坝辫、BootLoadder把操作系統(tǒng)拉起來
3、Linux內(nèi)核啟動開始系統(tǒng)設置汹粤,找到一個init.c文件啟動初始化進程
4命斧、init進程初始化和啟動屬性服務,之后開啟Zygote進程
5嘱兼、Zygote開始創(chuàng)建JVM并注冊JNI方法国葬,開啟SystemServer
6、啟動Binder線程池和SystemServiceManager,并啟動各種服務
7汇四、AMS啟動Launcher
Launcher啟動
一接奈、通過adb shell dumpsys activity activities查看當前的activity名
二、查看進程 adb shell ps
三通孽、application的啟動
1序宦、E:\tools\android-src\android-6.0.1_r1\packages\apps\Launcher2\src\com\android\launcher2\Launcher.java
2、當我們用手點擊一個圖標時背苦,就到了這個類public final class Launcher extends Activity執(zhí)行onClick(View view)方法挨厚,會把這個應用的相關(guān)信息傳入
先獲取一個intent--->startActivitySafely(v, intent, tag)--》startActivity(v, intent, tag);-->startActivity(intent);
3、startActivity(intent)會開一個APP進程
4糠惫、ActivityThread.java做為入口 用attach開啟app 再加載application和activity
thread.attach(false);---》mgr.attachApplication(mAppThread)會通過遠端進程去
回調(diào)private void handleBindApplication(AppBindData data)
Application app = data.info.makeApplication(創(chuàng)建Application對象
mInstrumentation.callApplicationOnCreate(app);----》 app.onCreate();
黑白屏問題
一疫剃、res/values/styles.xml文件
a、白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效硼讽,現(xiàn)在的版本默認使用透明處理了)
b巢价、找到一個父類name="Platform.AppCompat.Light"中定義了
<item name="android:windowBackground">用來控制黑白屏
c、
解決辦法:
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>
二备燃、啟動時間的查看
a碉克、4.4以前 4.4以前 adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity
1、ThisTime:最后一個啟動的Activity的啟動耗時并齐;
TotalTime:自己的所有Activity的啟動耗時漏麦;
WaitTime: ActivityManagerService啟動App的Activity時的總時間(包括當前Activity的onPause()和自己Activity的啟動)。
2况褪、AM路徑
E:\tools\android-src\android-6.0.1_r1\frameworks\base\cmds\am\src\com\android\commands\am
3撕贞、Am.java 946行開始打印啟動時間信息
其中一個result對象,在871行初始化 result = mAm.startActivityAndWait(测垛。捏膨。。)
在這個初始化時就已經(jīng)進行了時間的計算:
在android-src\android-6.0.1_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java文件中計算
void windowsDrawnLocked() --->reportLaunchTimeLocked(SystemClock.uptimeMillis())中完成時間的統(tǒng)計;
b食侮、4.4版本以后Logcat 輸入Display篩選系統(tǒng)日志 不過濾信息No Filters
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ù)庫操作