Android开发学习之路--性能优化之经常使用工具

  android性能优化相关的开发工具备不少不少种,这里对以下六个工具作个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy View,应用启动时间,Memory、CPU、Network分析,静态代码检查工具Lint以及程序稳定性monkey。下面就开始学习下这些工具吧。html

1、Android开发者选项

  Andorid开发工具众多,首先就是手机自带的开发者选项了,至于手机怎么启动开发者选项,那么请自行百度或者google了,接着简单熟悉下各个选项:
java


  一、Take bug report(进行漏洞报告): 点击这个选项会获取当前设备的log信息文件,打包并准备发送咱们想要发送的人。这会花费一、2分钟,而后会看到一个准备好的提示信息,而后能够点击发送。
  二、Desktop backup password(桌面备份密码):可使用adb备份和存储app和他们的关联数据到你的电脑。这个选项强制须要一个密码备份和存储。
  三、Stay awake(保持唤醒):选中这个复选框会强制屏幕唤醒,只要链接上usb线或者充电的时候都会不进入休眠,当须要调试的时候不用总是去解锁了,至关方便。
  四、Select runtime(选择运行时):你能够选择Dalvik或者ART。ART仍然是实验性的,直到Android L才最终release。
  五、Enable Bluetooth HCI snoop log(蓝牙HCI搜索日志):有时,开发者须要获取和分析蓝牙的HCI包,使能这个会在设备storage(路径为:/sdcard/btsnoop_hco.log)中保存包的信息。接着你可使用相似wireshark等软件分析。
  六、Process stats(程序状态):你须要知道的全部运行在手机上的程序的任何信息。包括了ram使用量,运行时间等。
  七、USB debugging(USB调试):USB调试时使用,使用DDMS和ADB命令的时候也须要这个使能,不勾选这个就不能调试咱们的应用了。
  八、Revoke USB debugging authorizations(撤回USB除错受权):当第一次USB线链接电脑的时候,须要认证而且创建密钥,这个操做删除这个认证,强制从新来一遍。
  九、Power menu bug reports(电源菜单中包括漏洞报告):在电源菜单中包括用于进行漏洞报告的选项。
  十、Allow mock locations(容许虚拟位置):容许手动写入位置信息,对于须要模拟位置的应用来讲十分方便,能够干一些坏事,你懂得。
  十一、Select debug app(选择待调试的应用程序):这个设置让你选择一个待调试的应用。
  十二、Wait for debugger(等待调试程序):等待调试程序
  1三、Show touches(显示触摸位置):显示触摸的位置,通常是一个小圈圈。
  1四、Pointer location(显示指针位置):显示出当前位置的坐标。
linux


  1五、Show surface updates(显示屏幕更新):屏幕更新时会闪烁。
  1六、Show layout bounds(显示布局边界):显示剪切边界、边缘。
android


  1七、Force RTL layout direction(强制RTL布局):界面布局从右至左。
  1八、Window animation scale(窗口动画比例):窗口动画的比例,数字越小,速度越快。
  1九、Transition animation scale(过渡动画比例):过渡动画的比例,同上。
  20、Simulate secondary displays(模拟二级显示):容许开发者模拟不一样尺寸的表现。
  2一、Force GPU rendering(强制GPU渲染):强制应用使用硬件2D渲染除非应用自己不须要。
  2二、Show GPU view updates(显示GPU视图更新):任何用硬件GPU来绘制视图的会有红色的覆盖层。
  2三、Show hardware layer updates(显示硬件层更新):这个设置会告诉你何时硬件层在更新。
  2四、Debug GPU overdraw(调试GPU过分渲染):过分渲染发生在任什么时候候当应用请求系统绘制一些视图在其余视图之上的时候。
web


  2五、Force 4x MSAA(启动4x MSAA):这个设置强制多重采样抗锯齿。MSAA就是寻找出物体边缘部分的像素,而后再把画缩放到当前的显示器上。会下降性能提高视觉的美感。
  2六、Strict mode enabled(严格模式):应用程序在主线程上执行长时间操做屏幕会闪烁。
  2七、Show CPU usage(显示CPU使用状况):在屏幕右上角显示当前CPU的信息。
sql


  2八、Profile GPU rendering(GPU显示配置文件):这个设置能够在屏幕上显示也能够写入到文件中。
shell



  2九、Enable OpenGL traces(启动OpenGL跟踪):这个设置是观察OpenGL的错误,并把log保存到文件中。
  30、Don’t keep activities(不保留活动):用户离开后当即清理每一个活动。
  3一、Background process limit(限制后台进程):容许当先后台运行多少个进程的一个选择。
  3二、Show all ANRs(显示所有ANR):当应用有bug的时候回显示应用无响应对话框。

2、应用具体耗时工具Trace view

  Trace view用于查找程序运行时具体耗时在哪,它显示两个面板,一个是Timeline面板,描述每个线程和方法启动和结束的时间。另外一个是Profile面板,提供一个全部方法内部发生了什么的概要。
  先新建工程PerformanceTool,而后新建布局main_activity_layout.xml,一个按钮用来加载一个网页;另外一个页面就是一个webview。安全

  而后编写代码,首先是MainActivity.java:
package com.jared.performancetool;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.jared.performancetool.databinding.MainBinding;

public class MainActivity extends AppCompatActivity {

    MainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        initView();
    }

    private void initView() {
        binding.btnLoad.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                WebViewActivity.launch(MainActivity.this);
            }
        });
    }
}

  接着是WebviewActivity.java:性能优化

package com.jared.performancetool;

import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import com.jared.performancetool.databinding.WebViewBinding;

/** * Created by jared on 2017/1/10. */

public class WebViewActivity extends AppCompatActivity {

    WebViewBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_webview_layout);
        initView();
    }

    private void initView() {
        binding.webView.loadUrl("http://www.hoolay.cn/ihoolay");
    }

    public static void launch(Context context) {
        Intent intent = new Intent(context, WebViewActivity.class);
        context.startActivity(intent);
    }
}

一、view形式

  traceview有两种使用方法,一种是直接经过DDMS工具来start和stop trace,使用方法以下:
  接着运行程序,成功运行后,点击菜单栏的Tools -> Android -> Android Device Monitor :
markdown



  进入Monitor以后,点击DDMS:


  这个时候在monitor的左边面板会出现


  点击对应要trace的包名,而后点击Stop左边的有个小红点的按钮。


  点击ok以后便开始执行trace了,这个时候再点击那个app里面的加载网页的按钮,加载完后,再次点击那个STOP左边那个变成小黑点的按钮。
  接着便trace完成了,就能够查看以下两个面板了。


  上图就是Timeline面板,左边就是每行都是显示一个线程,右边对应它的时间线。能够看出来主要就是main线程在作事情。


  上图就是Profile面板,首先是左边的name,好比序号为86,这里展开有Parents和Children,其中Parents就是调用该方法的方法,这里initView在onCreate中被调用,Children就是该方法内部调用的方法,这里调用了loadUrl。与项目中的真实的代码彻底相符。
  接着看下右边一排的Incl Cpu Time、Excl Cpu Time、Incl Real Time、Excl Real Time、Call+Recur Calls/Total、Cpu Time/Call、Real Time/Call。
  Incl Cpu Time:某方法占用CPU的时间,包含内部调用其余方法占用CPU的时间。
  Excl Cpu Time:某方法占用CPU的时间,不包含内部调用其余方法所占用的CPU时间。
  Incl Real Time:某方法运行的真实的时间(单位ms),包含内部调用其余方法所占用的真实时间。
  Excl Real Time:某方法运行的真实的时间(单位ms),不包含内部调用其余方法所占用的真实时间。
  Call+Recur Calls/Total:某方法被调用的次数以及递归调用占总调用次数的百分比。
  Cpu Time/Call:某方法占用CPU的时间和次数的比例。
  Cpu Time/Call:某方法占用CPI真实时间和调用次数的比例。

二、代码形式

  另外一种是经过注入代码来实现:
  在WebviewActivity的onCreate代码中加入两行代码以下:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = DataBindingUtil.setContentView(this, R.layout.activity_webview_layout);
    Debug.startMethodTracing("perform");
    initView();
    Debug.stopMethodTracing();
}

  别忘了加上SD卡的读写权限,而后运行app,点击加载网页按钮,就会在/sdcard目录下生产perform.trace文件,经过adb pull能够把文件导出来。

➜  ~ adb pull /sdcard/perform.trace Downloads/

  这里导出到了Downloads目录下,而后经过AndroidMonitor的file->open file选择这个文件打开:


  而后就能够查看分析了。经过代码的好处就是比较精确的获得咱们想要测试的,不过代价就是要写代码编译,导出来,步骤相对来讲比较繁琐。而直接使用工具的话只是一个大概的范围,可是方便快捷。能够视状况使用其中之一。

3、布局复杂度工具Hierarchy View

  以前文章《Android性能优化之布局》已经讲过了Hierarchy View的简单使用。这里仍是继续讲解下怎么使用。Hierarchy View主要是检测布局复杂度,各视图的布局耗时状况的一个工具,它须要在模拟器上进行,真机好像也有方法解决,不过很懒没去折腾,主要仍是学习工具为主嘛。
  点击菜单Tools -> Android -> Android Device Monitor:

  而后进入到Android Device Monitor,选中Hierarchy View
  选中后会出现层级树。
  而后咱们点击那个加载网页的button,能够看到对应的加载耗时,分别有Measure,Layout和Draw的耗时。   咱们能够根据其耗时来优化咱们界面。

4、应用启动时间

  通常咱们都会比较关注一个app启动的时间,若是启动太慢了,用户可能就不想玩了,这里有个方法能够测试应用启动的时间:
  命令行以下:

adb shell am start -W packagename/activity

  这里举个例子,好比说是上述项目中的PerformaceTool app,那么首先打开终端,链接上usb线,而后终端输入:

➜  ~ adb shell am start -W com.jared.performancetool/.MainActivity

  等待会儿,app会启动,而且输出以下所示信息:

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.jared.performancetool/.MainActivity }
Status: ok
Activity: com.jared.performancetool/.MainActivity
ThisTime: 158
TotalTime: 158
WaitTime: 172
Complete

  如上所示能够看出用时158ms。

5、Memory、CPU、Network

  不少时候咱们须要了解app的内存使用状况,CPU占用怎样,网络速度如何。为了提升性能,咱们老是想把内存减小到最小,CPU占用率近可能小,网络状况适宜。固然这些能够用命令行实现,毕竟androd基于linux操做系统的,可是那样显得很麻烦又不是很直观,很庆幸Android Studio自带了功能。
  Android Studio的Android Monitor里面有logcat和Monitors,选中monitors就有对于Memory,CPU和Network的展现。以下图所示:

  这里展现了Memory的使用量,CPU的占用量,以及网络的速度。上图就是点击了加载网页时候的一个分布状况。它能够帮咱们查看并优化咱们的程序,从而显得很是的直观。

6、 静态代码检查工具Lint

  Lint主要是提供一套静态代码分析的工具,它能够帮助咱们检查项目中存在的问题,让咱们更有规范性的开发App。运行菜单的analyze->Inspect Code。

  稍息片刻系统就会分析完成,以下所示:
  Lint分不少子项。Internationalization国际化问题,硬编码的文字都是须要添加进@string资源,Security安全性问题,Usability可用性问题,未使用到资源、资源缺乏的问题等等,具体能够根据分析后的结果来一步步改善。

7、程序稳定性:monkey

  经过monkey对程序在提交测试前作自测,能够检测出明显的致使程序不稳定的问题,执行monkey只须要一行命令,提交测试前跑一次能够避免应用刚提交就被打回的问题。

➜  ~ adb shell monkey -p com.jared.performancetool -v 500

  -p表示包名,-v表示反馈级别 500就是500个伪随机事件
  若在压力测试中程序崩溃或者接收到任何失控异常,就会自动中止。

参考:
https://developer.android.com/studio/profile/traceview.html#traceviewLayout
http://www.jianshu.com/p/07b551ee260b

相关文章
相关标签/搜索