背景
随着App的快速发展,在功能、内容丰富的同时不可防止的会引入好多第三方工具库,比如友盟、支付组件、视频组件、IM即时通信组件等,造成App首次启动的时侯,时间较长,用户体验差,用户流失甚至弃用。
系统启动阐述
1.打开电源引导芯片代码加载引导程序BootLoader到RAM中去执行
2.BootLoader把操作系统拉上去
3.Linux内核启动开始系统设置linux内核启动流程图,找到一个init.rc文件启动初始化进程
4.init进程初始化和启动属性服务,然后开启Zygote进程
5.Zygote开始创建JVM并注册JNI方式,开启SystemServer
6.启动Binder线程池和SystemServiceManager,并启动各类服务
7.AMS启动Launcher
App启动方法
App启动方法主要分为三种,冷启动、热启动、温启动
1.1:冷启动
冷启动:app没有启动或则进程被杀害后,系统不存在该app进程。冷启动流程指app启动全过程,包括创建app进程、加载资源、启动MainThread、初始化SplashActivtiy等
1.2:热启动
热启动:app处于后台状态未被杀害,系统只是把app从后台带到前台,展示给用户
1.3:温启动
介于两者之间,通常有两种情况:
1.用户点击back键退出,又重新启动;
2.用户退出app后,在onCreat()中恢复之前用onSaveInstanceState()中保存的状态;
App启动流程阐述
以冷启动为例
1.当用户点击appIcon,Launcher进程采用BinderIPC形式向system_server发出startActivity恳求
2.system_server接收到恳求后,向zygote进程发起创建App进程的恳求
3.Zygote进程孵化出新的子进程,即App进程
4.App进程通过BinderIPC形式向system_server发出attachApplication恳求
5.system_server接收到恳求后,做一系列打算工作,通过BinderIPC向App进程发送scheduleLaunchActivity的恳求
6.App进程的binder线程(ActivityThread)在收到恳求后,通过handler向主线程发送LAUNCH_ACTIVITY消息
7.主线程在收到message后,通过反射的方法创建相关的Activity,并调用Activity的onCreat等方式
8.至此,app便即将启动,即将步入Activity的生命周期,执行完渲染完便可以看到App的主界面。
黑白屏优化1.概述
android中的黑白屏指的是在点击appicon到主页界面UI这段时间所出现的蓝屏或则死机现象黑白屏优化是一种伪优化,只是为了用户使用体验舒适一些。
2.解决办法:
1.在自己的中加入windowsbackground
2.设置windowbackground为透明的true
3.以上这2种方式会有个问题,所有的activity启动就会显示linux vps,须要单独弄成一个主题
@drawable/launch_layout
true
true
@null
再在功能清单中的单独activity下设置
之后在APP欢迎页(第一页)的onCreate()super前添加代码如下
setTheme(R.style.AppTheme);
4.QQ中使用的技巧
true
@null

启动时间优化概述
app启动时间优化指的是Application中的onCreate(),运行到Activity的onCreate(),中的运行时间优化。
这个过程中时间过长的话,可能存在几个问题:1.点击图标许久不响应。2.首页显示太慢。
发觉问题-查看启动时间
AndroidStudio4.4曾经:
adb shell am start -W -n 包名/包名.activity.MainActivity
ThisTime:最后一个启动的Activity的启动历时;TotalTime:自己的所有Activity的启动历时;WaitTime:ActivityManagerService启动App的Activity时的总时间(包括当前Activity的onPause()和自己Activity的启动)。
AndroidStudio4.4之后Logcat输入Display筛选系统日志不过滤信息NoFilters
定位问题
-查看Application中onCreate()中的所有方式的具体运行时间
1.Debug.startMethodTracing(filePath);中间为须要统计执行时间的代码Debug.stopMethodTracing();
2.adbpull/storage/emulated/0/app1.trace把文件拉下来剖析把pull到笔记本上的文件拖到AS中就可以剖析了
解决问题-优化方案1.开线程
1.上面的API不能去创建handler2.不能有UI操作3.对异步要求不高的
2.懒加载
用的时侯再初始化linux端口映射,如网路、数据库操作
@Override
public void onCreate() {
super.onCreate();
File file = new File(Environment.getExternalStorageDirectory(), "app1.trace");
Log.i(TAG, "onCreate: " + file.getAbsolutePath());
//把分析结果存在一个文件
Debug.startMethodTracing(file.getAbsolutePath());
//对全局属性赋值
mContext = getApplicationContext();
mMainThread = Thread.currentThread();
mMainThreadId = android.os.Process.myTid();
mMainLooper = getMainLooper();
mHandler = new Handler();
//因为LQRUIKit中已经对ImageLoader进行过初始化了
// initImageLoader(getApplicationContext());
new Thread(){
@Override
public void run() {
//如果要用线程来节约了这些初始化的时间
//1.里面的API不能去创建handler
//2.不能有UI操作
//3.对异步要求不高
initNim();
initImagePicker();
initOkHttp();//可以懒加载
}
}.start();
Debug.stopMethodTracing();
}
有须要文中完整代码的朋友可以私信发送“底层源码”即可免费获取
如今私信还可以获得更多《Android学习笔记+源码解析+笔试视频》
最后我想说:
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提高自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你须要对自己递交的每一行代码、使用的每一个工具负责linux内核启动流程图,不断挖掘其底层原理,能够使自己的技术升华到更高的层面
Android构架师之路还很漫长,与君自勉