官方教程

  1. Android
    Performance

    是 GOOGLE 方今颁发在 Udacity 上的法定教程
    不便于科学上网的同班可以从自我的百度网盘里下载。
  2. Android Performance
    Patterns

    是 GOOGLE 在 2015 新春宣布在 非死不可 上的专题课程
    那部分内容
    CDGChina
    加了普通话字幕,并放在
    Youku
    上了。

!!! notes
由此看来 Android 生态圈的特性和电量消耗等题材,已经严重到让 Google不得不重视的境地啦 ~~

好的工业产品设计需要遵照的十大主导原则

有关内存的几个理论知识

GC 的工作体制
当 GC 工作时,虚拟机停止任何干活。频繁地触发 GC
举办内存回收,会导致系统性能严重低落。

内存抖动
在极短的岁月内,分配大量的内存,然后又释放它,这种现象就会促成内存抖动。典型地,在
View 控件的 onDraw
方法里分配大量内存,又释放大量内存,这种做法极易引起内存抖动,从而导致性能降低。因为
onDraw 里的豁达内存分配和释放会给系统堆空间造成压力,触发 GC
工作去放活更多可用内存,而 GC 工作起来时,又会吃掉宝贵的帧时间 (帧时间是
16ms) ,最后致使性能问题。

内存泄漏
Java 语言的内存泄漏概念和 C/C++ 不太相同,在 Java
里是指不科学地引用导致某个对象不可能被 GC
释放,从而致使可用内存越来越少。比如,一个图纸查看程序,使用一个静态 Map
实例来缓存解码出来的 Bitmap
实例来加快加载进度。这多少个时候就可能存在内存泄漏。

内存泄漏会导致可用内存越来越少,从而造成频繁触发 GC
回收内存,进而导致性能降低。

调节工具

  • Memory Monitor Tool: 可以查看 GC 被触发起来的年华类别,以便寓目 GC
    是否影响属性。
  • Allocation Tracker Tool: 从 Android Studio
    的这些工具里查看一个函数调用栈里,是否有恢宏的一样类另外 Object
    被分配和释放。如若有,则其可能滋生性能问题。
  • MAT: 这是 Eclipse 的一个插件,也有 stand
    alone

    的工具得以下载应用。

多少个规格

  • 别在循环里分配内存 (成立新对象)
  • 尽可能别在 View 的 onDraw 函数里分配内存
  • 事实上不可能防止在这一个情形里分配内存时,考虑拔取对象池 (Object Pool)

工业产品设计是在人类社会文明低度发展历程中,伴随着大工业生产的技艺、艺术和经济相结合的产物。一个新产品要想为社会所确认,并能取得经济效益,就非得从市场和用户角度出发去考虑,这也是对工业产品设计最中央的渴求,我们需要在实践中去遵照工业产品设计原则,且要通晓它们,下面罗列了十项骨干标准,一起来探视吧。

三个大概的实例

内存抖动

由此一个分外简单的事例来演示内存抖动。这一个事例里,在自定义 View 的
onDraw 方法里大量分配内存来演示内存抖动和总体性之间的关系。

版本一:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        String msg = "";
        for (int i = 0; i < 500; i++) {
            if (i != 0) {
                msg += ", ";
            }
            msg += Integer.toString(i + 1);
        }
        Log.d("DEBUG", msg);
    }

版本二:

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 500; i ++) {
            if (i != 0) {
                sb.append(", ");
            }
            sb.append(i + 1);
        }
        Log.d("DEBUG", sb.toString());
    }

内存抖动的特点:

从 Memory Monitor 来看,有毛刺出现。即长期内分配大量的内存并触发 GC。

图片 1

memory_churn

从 Allocation Tracker 里看,五次操作会有大气的内存分配发生。

图片 2

memory_tracker

内存泄漏

这么些事例里,我们大概地让点击 Settings 菜单,就爆发一个 100KB
的内存泄漏。

    private void addSomeCache() {
        // add 100KB cache
        int key = new Random().nextInt(100);
        Log.d("sfox", "add cache for key " + key);
        sCache.put(key, new byte[102400]);
    }

内存泄漏的表征:

从 Memory Monitor 来看,内存占用越来越大

图片 3

memory_tracker

利用
MAT
工具举办标准分析。这是个很大的话题。几乎可以独自成多少个章节来讲。可以参照
MAT 本身自带的 Tutorials
来学学。此外,这篇小说里的分析方法是个科学的起始。

示范代码应用 Android Studio
开发环境,可以从这里下载。

1.需要原则:产品的效益要求来自于需求。产品要知足创设的要求,这是总体计划最要旨的落脚点。不考虑创设需要会造成产品的积压和浪费。客观需假诺随着时光、地方的例外而发生变化的,这种变化了的要求是计划升级换代产品的依照。例如手表设计就啊哟满足用户的两样层次的急需。

行使 MAT 分析内存问题

内存泄漏

一个一级的题目是 Android
系统越用越慢。这种至高无上地是由内存泄漏引起的。一个很有用的解决这种题材的主意是:比较前后四个级次的内存的运用情况。一般流程如下:

  1. 利用 ddms 工具 dump HPROF file
  2. 拔取 hprof-conv 把 dalvik 格式的更换为普通 jvm 格式
  3. 再也步骤 1 和 2 抓出两份 LOG。
  4. 运用 MAT 对两份 HRPOF 文件举行辨析,结合代码找出可能存在的内存泄漏

譬如针对拨号盘越来越慢的问题,大家得以开机后启动拨号盘,打进打出10个电话。然后抓个
HPROF 文件。接着,再打进打出10个电话,再抓一个 HPROF
文件。接着拿这多少个文件相比较分析,看是不是会造成电话打进打出越多,内存占用越多的意况暴发。

!!! notes “HPROF文件”
HPROF 简单地精通,就是从 jvm 里 dump 出来的内存和 CPU
使用状况的一个二进制文件。它的英文全名叫 A Heap/CPU Profiling
Tool。这里有它完全的法定文档和它的历史介绍。

开辟 MAT 后,会有一个 Tutorials
来教我们怎么用。这里列出多少个操作步骤及其注意事项。

  • 在 DDMS 里导出 HPROF 文件前,最好手动执行一下
    GC。目的是让导出的内存全体是被引述的。否则在做内存占用相比较时,会有不少不必要的内存占用被标识出来,烦扰我们开展解析。
  • 进展自查自纠时,最好是接纳操作较多的和操作较少的相比较,这样得出的 delta
    是正数
  • 经过对照,发现内存泄漏时,可以用 OQL 来查询,并透过 Root to GC
    功用来找到暴发泄露的源代码

在我们的示范程序里面,每一回点击 Settings
菜单,都会招致一回100KB的内存泄漏。下边是大家使用方面介绍的流水线来寻找内存泄漏问题。我们先点击
5 次 Settings 菜单,然后手动触发一回 GC,再导出 HPROF
文件。接着,大家再点击 6 次 Settings 菜单,然后手动触发三遍GC,再导出第二份 HPROF 文件。大家拿这两份 HPROF 就足以做一些相对而言。

图片 4

mat_diff.png

透过上图可以看到,一次操作确实导致了好几类的实例增添了。图中可以清楚地来看
byte[] 和 java.util.HashMap$HashMapEntry
六个类增加得相比较显明。这样,我们随便采取一个,通过 OQL
来询问系统中的那一个内存。

图片 5

mat_qql.png

从上图可以找到,本次 dump
出来的内存里,确实有诸多少个这多少个类的实例。在图上右击任何一个实例,右击,采纳
Paths to GC roots,可以找到这一个实例是被什么人引用的。

图片 6

mat_gc_root.png

从上图可以看出来,这一个内存是被 MainActivity 里的 sCache
引用的。通过阅读代码,大家就足以找到这多少个漏洞了。即每一次都往 sCache
里保存一个引用。

2.消息规范:设计过程中的消息紧要有市场信息、科学技术消息、技术测试信息和加工工艺消息等。设计人士应健全、丰裕、正确和保险地左右与设计有关的各类消息。用这多少个音信来正确指导产品规划、方案设计与详细规划,并使设计不断立异提高。

总结

Google录像介绍的内容是硬知识,精通这多少个文化可以协助大家写出高质料,高性能的代码。而
MAT, HPROF, Memory Monitor, Allocation Tracker
提供了一个“破案”的工具给大家。大家运用那些工具,倒回来去发现代码里的问题。

3.立异规范:设计职员的身先士卒改进,有利于突围各类传统观念和常规的封锁,创立发明出丰裕多彩原理分外、结构最新的教条产品。例如布里斯班工业规划要开拓立异精神。

拉开阅读

有关 Android 性能优化,网络上有几篇比较好的稿子,基本听从 GOOGLE
的合法教程翻译过来的,质地相比较高。可以参照一下。

  1. Android
    性能优化内存篇
    胡凯的博客
  2. Android性能优化典范胡凯的博客

冷知识

GC 是在 1959 年由 约翰(John) 麦卡锡(McCarthy) 发明的,此表明是为着缓解 Lisp
编程语言里的内存问题的。《黑客和艺术家》作者,硅谷最有影响力的孵化器集团YC 创设者 Paul 格雷厄姆(Graham) 中度评价 Lisp
语言,认为编程语言发展到目前,依旧不曾跳出 Lisp 语言在上世纪 60
年代所倡导的那个理念。并且,他还把团结这时创业,实现财务自由的门类
Viaweb 的成功归功于 Lisp 语言。详细可观望 保罗 格雷厄姆(Graham)的这篇博客这篇博客

4.系统标准化:每个机械产品都可以视作一个待定的技术系统,设计产品就是用系统论的方式来求出功能布局体系,通过分析、综合与评论决策,使产品达到综合最优。

5.烟消云散原则:为了寻求一个全新的产品,在揣摩效用原理方案时,采取发散思维;为了拿走一个风行产品,则必须概括多种消息,进行收敛思维。在分流思维基础上举行消解思维,平常都会赢得很好的意义。

6.优化原则:这属于广义优化,包括方案择优、设计参数优化、总体方案优化。也就是全速、优质、经济地形成规划任务。

7.继承准绳:将前人的名堂,有批判地接收,推陈出新,加以发扬,为我所用,这就是持续原则。设计人士悟性地控制继承原则,可以事半功倍举行革新设计,可以集中紧要精力去解决规划中的重要问题。

8.效益原则:设计中必须讲究效益,既要考虑技术经济效益,又要考虑社会效益。

9.时日尺度:加快规划研制时间,以超越占领市场。同时,在统筹时,要估量产品研制阶段内同类产品可能爆发的转变,保证规划的出品投入市场后不一定沦落过时货。

10.定量标准化:在方案评选、造型技术美学、产品技术性能、经济效益等的评头品足,都尽量拔取正确的定量方法。

作品来源:http://www.ugainian.com/news/n-1073.html\#news