性能优化----APP启动优化(1)

android启动流程.png

系统的启动

1、打开电源 ,引导芯片代码加载引导程序Boot Loader到ARM中去执行
2、BootLoadder把操作系统拉起来
3、Linux内核启动开始系统设置,找到一个init.c文件启动初始化进程
4、init进程初始化和启动属性服务,之后开启Zygote进程
5、Zygote开始创建JVM并注册JNI方法,开启SystemServer
6、启动Binder线程池和SystemServiceManager,并启动各种服务
7、AMS启动Launcher

Launcher启动

一、通过adb shell dumpsys activity activities查看当前的activity名
二、查看进程 adb shell ps
三、application的启动


开app进程.png
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执行onClick(View view)方法,会把这个应用的相关信息传入
先获取一个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)会通过远端进程去
回调private void handleBindApplication(AppBindData data)
                        Application app = data.info.makeApplication(创建Application对象
                        mInstrumentation.callApplicationOnCreate(app);----》 app.onCreate();

黑白屏问题

一、res/values/styles.xml文件
a、白屏 <style name="AppTheme" parent="Theme.AppCompat.Light">
黑屏 <style name="AppTheme">(在以前的老版本上有效,现在的版本默认使用透明处理了)
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(。。。)
    在这个初始化时就已经进行了时间的计算:
    在android-src\android-6.0.1_r1\frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java文件中计算
void windowsDrawnLocked() --->reportLaunchTimeLocked(SystemClock.uptimeMillis())中完成时间的统计;

b、4.4版本以后Logcat 输入Display筛选系统日志 不过滤信息No Filters

TRACE工具分析代码执行时间

1、Debug.startMethodTracing(filePath); 中间为需要统计执行时间的代码Debug.stopMethodTracing();
2、adb pull /storage/emulated/0/app1.trace把文件拉出来分析把pull到电脑上的文件拖到AS中就可以分析了
3、优化方案:

1.开线程     没建handler    没操作UI   对异步要求不高
2.懒加载     用到的时候再初始化,如网络,数据库操作
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容