2021-01-20(性能优化之概念篇)

计算性能优化参考

  1. 低效率函数

第1种是相对执行时间长的方法,我们可以很轻松的找到这些方法并做一定的优化。第2种是执行时间短,但是执行频次很高的方法,因为执行次数多,累积效应下就会对性能产生很大的影响

  1. 计算性能优化

(1). 批处理与缓存
(2). 异步操作
(3). 容器性能
(4). 数据结构

电量优化

  1. 电量消耗分析:

Battery Historian(电量使用记录分析工具)

  1. 电量优化的一些建议:
  1. 充电时执行任务
  2. 连接wifi后执行任务
  3. wake_lock
  4. 大量高频次的CPU唤醒及操作集中处理
  5. 定位
  6. 网络优化

网络优化

  1. 网络分析工具

Network Monitor(网络监控工具)
代理工具(Fiddler),分析网络请求
模拟弱网(使用Fiddler)

  1. 网络优化方案

(一)任务集中处理(使用JobScheduler)
(二)传输数据优化

  1. gzip压缩
    static class GzipRequestInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            okhttp3.Request originalRequest = chain.request();
            if (originalRequest.body() == null || originalRequest.header("Content-Encoding") != null) {
                return chain.proceed(originalRequest);
            }

            okhttp3.Request compressedRequest = originalRequest.newBuilder()
                    .header("Content-Encoding", "gzip")
                    .method(originalRequest.method(), gzip(originalRequest.body()))
                    .build();
            return chain.proceed(compressedRequest);
        }

        private RequestBody gzip(final okhttp3.RequestBody body) {
            return new RequestBody() {
                @Override
                public MediaType contentType() {
                    return body.contentType();
                }

                @Override
                public long contentLength() {
                    return -1; // 无法知道压缩后的数据大小
                }

                @Override
                public void writeTo(BufferedSink sink) throws IOException {
                    BufferedSink gzipSink = Okio.buffer(new GzipSink(sink));
                    body.writeTo(gzipSink);
                    gzipSink.close();
                }
            };
        }
    }

> > 2. 代替JSON(使用Protocal Buffers,Nano-Proto-Buffers,FlatBuffer来减小序列化的数据的大小

  1. 缓存
  2. 图片压缩

(三)不同网络状况,处理不同的任务

(四)弱网情况下我们应该做些什么?
(1).压缩/减少数据传输量
(2).利用缓存减少网络传输
(3).针对弱网(移动网络), 不自动加载图片
(4).界面先反馈, 请求延迟提交****

数据传输优化

序列化、反序列化传输

  1. Parcelable相对于Serializable效率要高
  2. GSON处理序列化问题,速度更快

可优化的数据序列化方案:

Protocal Buffers:强大,灵活,但是对内存的消耗会比较大,并不是移动终端上的最佳选择。
Nano-Proto-Buffers:基于Protocal,为移动终端做了特殊的优化,代码执行效率更高,内存使用效率更佳。
FlatBuffers:这个开源库最开始是由Google研发的,专注于提供更优秀的性能。

启动优化

  1. APP的启动方式:

(1). 冷启动(应用从桌面上启动,且后台没有进程的缓存,这是系统就需要新创建一个进程并且分配资源。)
(2). 热启动 (app在后台有进程缓存)

  1. 查看启动过程消耗时间的工具
  1. Loacat输出的display time
  2. Traceview
  3. adb shell
  1. 启动优化方案

流程中很多步骤是系统控制的,我们能够控制的和关注的点有以下几个:
(1).Application的onCreate,一般应用中通用主件和初始化都放在这里(耗时主因)
(2).Activity的onCreate,UI布局和渲染(耗时主因)
(3).显示启动窗口到窗口替换之间,会出现白屏的过度画面,体验太差(视主题而定,必须优化)

**(1).Application中初始化优化的方案有两种**
  • 不需要立刻初始化的,延迟加载
  • 需要初始化的,开启线程初始化
**(2).Activity的onCreate中优化**
  • 优化布局耗时:一个布局层级越深,里面包含需要加载的元素越多,就会耗费更多的初始化时间。关于布局性能的优化,在渲染优化的文章中已经讲过。
  • 异步延迟加载:一开始只初始化最需要的布局,异步加载图片,非立即需要的组件可以做延迟加载。
  • 预加载:在前一个显示时预加载下一个显示页面中需要用到的数据(常常用到Spalsh调整主页面时使用)

包体优化

  1. 清理无用资源

(1).使用Refactor->Remove unused Resource
(2).使用Lint工具
(3).开启shrinkResources去除无用资源
(4).删除无用的语言资源
(5).清理第三方库中冗余代码

  1. 图片资源优化

(1)使用压缩过的图片
(2)只用一套图片
(3)使用不带alpha值的jpg图片
(4)使用tinypng有损压缩
(5)使用webp格式
(6)使用svg
(7)使用shape
(8)使用着色方案
(9)对打包后的图片进行压缩

  1. 资源动态加载

(1)在线化素材库
(2)动态加载皮肤
(3)插件化

  1. lib库优化

    只提供对主流架构的支持,比如arm,对于mips和x86架构可以考虑不支 持,这样可以大大减小APK的体积.

  2. 7zip压缩资源

    对于assets或者raw文件夹中的资源,可以使用7zip压缩,使用时进行解压。

  3. 代码混淆

  4. 资源混淆

资源混淆简单来说希望实现将res/drawable/icon,png变成res/drawable/a.png,或我们甚至可以将文件路径也同时混淆,改成r/s/a.png。
建议使用微信的AndResGuard

  1. 使用微信AndResGuard
  2. Facebook的redex优化字节码

你可能感兴趣的:(2021-01-20(性能优化之概念篇))