1.系统的启动
- 打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
- BootLoader把操作系统拉起来
- Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
- init进程初始化和启动属性服务,之后开启Zygote进程
- Zygote开始创建JVM并注册JNI方法,开启SystemServer
- 启动Binder线程沲和SystemServiceManager,并启动各种服务
- AMS启动Launcher
2.Launcher启动应用程序
当我们用手点击一个图标时,就到了这个类public final class Launcher extends Activity
,
类路径在E:\tools\android-src\android-6.0.1_r1\packages\apps\Launcher2\src\com\android\launcher2\Launcher.java
1 | 执行`onClick(View view)`方法,会把这个应用的相关信息传入 |
3.adb一些命令说明
- 通过
adb shell dumpsys activity activities
查看当前的activity名 - 查看进程
adb shell ps
4.黑白屏问题
原因:
在res/values/styles.xml文件中
白屏 `<style name="AppTheme" parent="Theme.AppCompat.Light">`
黑屏 ` <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了)`
伪解决办法:
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>
再在功能清单中的单独activity下设置
<activity
android:theme="@style/AppTheme.Launcher"
然后在程序中使用setTheme(R.style.AppTheme)
让APP中所有的activity还是使用以前的样式,这样做就只有启动时才使用自己的样式
5.启动时间查看
4.4以前 adb shell am start -W com.lqr.wechat/com.lqr.wechat.activity.SplashActivity
ThisTime:最后一个启动的Activity的启动耗时;
TotalTime:自己的所有Activity的启动耗时;
WaitTime: ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)
AM路径:E:\tools\android-src\android-6.0.1_r1\frameworks\base\cmds\am\src\com\android\commands\am
Am.java 946行开始打印启动时间信息
其中一个result对象,在871行初始化 result = mAm.startActivityAndWait(。。。)
在这个初始化时就已经进行了时间的计算:
在android-src\android-6.0.1_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java文件中计算
void windowsDrawnLocked() --->reportLaunchTimeLocked(SystemClock.uptimeMillis())中完成时间的统计;
4.4版本以后Logcat输入Display
筛选系统日志 不过滤信息No Filters
6.TRACE工具分析代码执行时间
6.1.代码
1 | Debug.startMethodTracing(filePath); |
6.2. 分析
adb pull /storage/emulated/0/app1.trace
把文件拉出来分析,把pull到电脑上的文件拖到AS中就可以分析了
6.3. 优化方案
- 开线程
没建handler 没操作UI 对异步要求不高
- 懒加载
用到的时候再初始化,如网络,数据库操作