美文网首页
多维度分析性能优化

多维度分析性能优化

作者: 佼佼者Mr | 来源:发表于2020-04-04 10:29 被阅读0次

app启动
开机 ——>BootLoader(引导芯片) ——>Linux kernel(init.rc) ——>init进程 id为1 ——>zygote进程 ——>JVM,SystemServer等 

——>Binder线程池、SystemServerManager等其他各种服务 ——>Lancher

启动方式

冷启动  程序从头开始,系统没有为改程序创建进程。一般场景:程序安装后的第一次启动,应用程序被系统完全终止后再打开

热启动  此时程序仍然驻留在内存中,只是被系统从后台带到前台,因此程序可以减少对象初始化,加载布局和渲染的工作。需要注意的是

              如果程序的某些内存被系统清除,比如调用了onTrimMemory方法,则需要重新创建这些对象以响应热启动事件

暖启动  它包含热启动和冷启动一系列的操作子集,比热启动的消耗稍微多一些,他与热启动相比最大的区别在于,他必须调用onCreat()开始重新创          建活动,也可以从传递给onCreat()方法中保存的实例状态中    获得某些对象的恢复

冷启动流程:1.加载并启动app,

                      2.启动后立即为该app显示一个空白页面

                      3.创建app进程(创建应用程序对象)

                      4.创建主Activity

                      5.加载布局,绘制  

黑白屏原因:在app的启动流程中,我们已知:在系统启动并加载app时,我们需要耗费相当的时间,即使时间不到1s,用户也会感觉到当点击app图标时,有延迟的现象,为了解决这一问题,Google的做法是在app创建的过程中,先展示一个空白页面,让用户体会到点击图标之后立马会有相应,而这个空白页面的颜色则是在Manifest文件中配置的主题颜色来决定的,现在默认一般都是白色

黑白屏的解决方案

1.修改AppTheme:在应用默认的AppTheme中,设置系统"取消预览(空白窗体),为true,或者设置空白窗体为透明"

    <item name="android:windowDisablePreview">true

    <item name="android:windowIsTranslucent">true</item>

2. 利用splashActivity,修改theme,自定义theme时,设置windowBackgroud属性(通过layer_list), 利用修改空白页面

代码优化

代码未优化的问题

在构建app的时候,会引用很多的第三方的sdk,而且项目越多,引用的第三方的也越多,有些第三方会要求我们,在application的onCreat里面初始化,所以从application到activity的事件就会被拉长,首个activity的渲染时间就会被拉长

同理,如果我们在activity的oncreat等方法中,执行任务过长的话,也会导致渲染布局的时间被拉长,这样就会导致用户感觉页面迟迟没有被加载出来。

app启动时间检测

adb shell am start-W com.neopt1/.MainActivity

运行时间

thisTime:最后一个activity运行时间

totalTime:一系列activity运行时间

waitTime:总运行时间,包含冷启动运行时间(冷启动时间app无法优化,取决与手机性能和厂商系统)

在application中
public class NeOptApplication extends Application {

    @Override

    public void onCreate() {

      super.onCreate();

        File file = new File(Environment.getExternalStorageDirectory(),"app.trace");

        Debug.startMethodTracing(file.getAbsolutePath());

        // 中间业务逻辑代码

        init();// 主线程

        test();

        // 异步线程的方式来进行处理

        // 1:异步线程中使用的api不能创建Handler

        // 2:不能有UI操作

        // 3:对异步要求不高

        // 懒加载

        Debug.stopMethodTracing();

    }

    private void init(){

        a();

    }

    private void a(){

        try {

            Thread.sleep(500);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        b();

        test();

    }

    private void b(){

        try {

            Thread.sleep(2500);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

    private void test(){

        try {

            Thread.sleep(200);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

    }

    // 减少代码执行时间,将执行的代码能放到异步线程

}

在Android studio中定位到项目目录下

adb pull storage/emulated/0/app.trace

生成app.trace文件后,将文件拉取到Android studio中,就可以查看运行时间

优化的方法

 // 异步线程的方式来进行处理

        // 1:异步线程中使用的api不能创建Handler

        // 2:不能有UI操作

        // 3:对异步要求不高

 // 懒加载

布局渲染流程及原理

XML布局显示至屏幕流程

<Button with="">===>LayoutInflater加载进内存===>CPU进行计算,处理成位图===>CPU将图形将给GPU===>GPU队形进行栅格化===>显示器进行显示

FPS

12fps:画面帧率高于每秒10-12帧,眼睛认为它是连贯的

24fps:有声电影一般每秒24帧

30fps:早期动态电子游戏,一般会在30fps每秒

60fps:手机交互过程中,需要触摸和反馈,需要60帧才会达到不卡顿的效果。

过度绘制 GPU每隔16毫秒画一次,如果CPU传递过来的图形有重复位置,会造成用户只能看到顶层的图形,底层图形被遮盖,虽然用户无法看到顶层图形,但依然会浪费资源,因此被称作过度绘制、

UI优化解决方案

布局中的背景是否需要

是否可以删除多余布局

自定义view是否进行了相应的剪裁

布局是否扁平化,层级不要太深

使用Merge标签排除多余一层ViewGroup容器

使用ViewStub进行布局的懒加载(使用代码优化)

内存优化

Java虚拟机,GC回收,内存抖动/泄露

Java虚拟机 执行流程 编译时环境:Activity.java--java编译器---Activity,class

                                    运行时环境:Activity.class--java虚拟机--内存

Java虚拟机运行时数据区域 方法区  栈内存  本地方法栈 Java堆内存 程序计数器(记录线程运行记录)

Java堆内存 强引用  新建对象为强引用时,垃圾回收器绝对不会回收,宁愿抛出OutOfMemoryError,让程序终止也不会回收

                    软引用 新建对象为软引用时,当内存不够的时候,回收器就会回收这些对象,如果回收后还是没有足够的内存,    就                                                        会OutOfMemoryError异常。

                    弱引用 当新建对象为弱引用的时候,垃圾回收器不管当前内存是否足够,都会回收它的内存

                    虚引用 虚引用和其他引用都不同,如果一个对象仅持有虚引用,在任何时候都可能会被GC回收,只是当他被回收的时候会收到一个                                  系统通知。

内存泄露/溢出

            内存泄露 一个不再被程序使用的对象或变量依旧存活在内存中无法回收;

            内存溢出 当程序申请内存时,没有足够的内存供程序使用,比较小的内存泄露并没有太大的影响,但内存泄漏将多时,占用的内存空间较大,程序正常使用的内存就会相应减少

            内存抖动 短时间内发生了多次内存分配和释放,主要原因短时间内频繁创建对象,为了应对 这种情况,虚拟机会频繁GC,当GC进行时,其他操作就会被挂起等待GC完成,频繁GC,也就会导致比如Ui绘制时间超过16ms每帧,导致画面卡顿等。

内存分析工具:Mat https://www.eclipse.org/mat/downloads.php

                    

                    

                                    

相关文章

网友评论

      本文标题:多维度分析性能优化

      本文链接:https://www.haomeiwen.com/subject/hyfnuhtx.html