Android葵花宝典计算机微刊Android系统

Android性能优化

2017-10-23  本文已影响153人  一个有故事的程序员

导语

随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对复杂的功能进行性能优化是创造高质量应用的基础,本章节将为大家展示几种性能优化的方法,帮助开发者快速的构建运行速度快,相应速度快的应用程序。

主要内容

具体内容

布局优化

Android UI渲染机制
On screen as bars
避免Overdraw
Enable GPU Overdraw
优化布局层级
避免嵌套过多无用布局

< include>标签重用,首先编写common_ui.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:text="this is a common ui"
    android:textSize="30sp" />

接着在主布局中引用:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        layout="@layout/common_ui"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>

这样,common_ui就被引用了,其中include标签里面属性会覆盖common_ui里面的属性。

使用< ViewStub>实现View的延迟加载,< ViewStub>是个轻量级的组件,它不仅不可视,而且大小为0,首先编写not_often_use.xml文件。

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="not often use"
        android:textSize="30sp" />
</RelativeLayout>

接着在主布局中引用:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ViewStub
        android:id="@+id/not_often_use"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout="@layout/not_often_use" />
</RelativeLayout>

这个时候是在布局中见不到这个ViewStub的布局的,有两种方法可以来重新显示这个View:

ViewStub mViewStub = (ViewStub) findViewById(R.id.not_often_use);
mViewStub.setVisibility(View.VISIBLE);
ViewStub mViewStub = (ViewStub) findViewById(R.id.not_often_use);
View inflateView = mViewStub.inflate();

这两种方法唯一区别:
inflate()方法可以返回引用布局,从而可以通过View.findViewById()方法找到相对应控件。

< ViewStub>标签与设置View.GONE有什么区别:
它们的共同点就是在初始化时不会显示,但是< ViewStub>标签只会在显示时,才会去渲染整个布局,而View.GONE在初始化布局树的时候就已经添加在布局树上了,相比之下,< ViewStub>标签的布局具有更高的效率。

Hierarchy Viewer

内存优化

什么是内存

由于Android的沙箱机制,每个应用所分配的内存大小是有限度的,内存太低就会触发LMK:Low Memory Killer机制,我们所说的内存是指手机的RAM,它包括以下几个部分:
寄存器(Registers)
速度最快的存储场所,因为寄存器位于处理器内部,在程序中无法控制

这些概念中最容易搞错的是堆和栈的区分:

我们可以通过代码分析Heap中的内存状态:

ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
int heapSize = manager.getLargeMemoryClass();
获取Android系统内存信息

系统内存监视服务,通过”Setting-Developer-options-Process Stats”来开启这个功能,也可以使用Dumpsys命令来获取这些信息:

adb shell dumpsys procstats

内存监视工具,通过”Settings-Apps-Running”中打开这个界面,也可以使用Dumpsys命令来获取这些信息:

adb shell dumpsys meminfo
内存回收
内存优化实例

Lint工具

Android Lint工具是Android Studio中集成的一个Android代码提示工具。

Lint工具

Lint的功能非常的强大,大家应该养成写完代码之后检查lint的习惯,这不仅可以让我们及时的发现一些隐藏的问题,而且,更让我们养成良好的代码风格。

使用Android Studio的Memory Monitor工具

Memory Monitor工具是Android studio上的一个内存监视工具,他可以很好的帮助我们进行内存实时分析,通过点击Android studio右下角的Memory Monitor标签就可以进行查看了。

Memory Monitor

使用TraceView工具优化APP性能

TraceView是一个Android下的可视化性能调查工具,用来分析TraceView日志。

生成TraceView日志的两种方法

通过代码生成精准范围的TraceView日志:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

当然除了默认输出日志名,还可以自定义路径和日志名,最后通过ADB命令,将日志文件导出到本地:

adb pull /sdcard/trace_log.trace/local/LOG/

通过Android Device Monitor生成TraceView日志:

打开TraceView
分析TraceView

使用MAT工具分析App内存状态

MAT工具是一个分析内存的强力助手。

生成HPROF文件

打开Android Device Monitor工具,选择要监听的线程,并点击菜单栏中的”Update Heap”按钮。

在Heap标签中点击”Cause GC”按钮,就会显示当前内存状态。

这里有一 个判断当前是否存在内存泄漏的小技巧:当我们不停地点击”Cause GC”按钮的时,如果”data object”一栏中的”Total size”有明显变化,就代表可能存在内存泄漏。

上面是手动查看Heap状态,下面点击菜单栏的”Dump HPROF File”按钮。

系统会生成一个.hprof文件,默认名为包名.hprof,不过还不能直接使用MAT工具查看,还需要进行格式转换,在SDK目录的platform-tools目录下,使用hprof-conv工具帮助转换,命令如下:

D:\sdk\platform-tools>hprof-conv F:\Heap\com.handsome.heap.hprof heap.hprof

格式命令:”hprof-conv infile outfile”生成heap.hprof文件利用MAT工具就可以进行内存分析。

分析HPROF文件

打开MAT工具,选择”Open a Heap Dump”选项,进入分析:

使用Dumpsys命令分析系统状态

总结

更多内容戳这里(整理好的各种文集)

上一篇 下一篇

猜你喜欢

热点阅读