安卓测试相关

CPU

CPU有大小之分、系统会自动调配。

查看CPU:

$ adb shell top -n 1 -m 10 -d 1
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
User 6%, System 23%, IOW 0%, IRQ 0%
User 8 + Nice 0 + Sys 29 + Idle 88 + IOW 0 + IRQ 0 + SIRQ 0 = 125
  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
 7543  0  16% R     1   1344K    568K     shell    top
  212  2   9% S     8  12816K   3032K     root     /system/bin/netd
 1043  0   4% S    95 663500K  81248K  fg system   system_server
 6484  0   2% S    20 532780K  46148K  bg u0_a82   com.coomix.app.bus
 1832  0   0% S     6   7304K    640K     root     /system/bin/mpdecision
26896  0   0% S     1      0K      0K     root     kworker/0:0H
  206  0   0% S     1   1072K    388K     system   /system/bin/servicemanager
  227  0   0% S     1    944K    408K     system   /system/bin/qrngd
    3  0   0% S     1      0K      0K     root     ksoftirqd/0
   30  1   0% S     1      0K      0K     root     smsm_cb_wq

-m 10 表示查看使用CPU最多的是个进程。

User 8 + Nice 0 + Sys 29 + Idle 88 + IOW 0 + IRQ 0 + SIRQ 0 = 125

上面表示每种状态消耗的时间(10s内,单位ms),最大值是100×CPU个数。

$ adb shell dumpsys cpuinfo
Load: 17.55 / 18.49 / 20.27
CPU usage from 10958ms to 955ms ago with 99% awake:
  19% 1043/system_server: 17% user + 1.1% kernel / faults: 453 minor
  16% 212/netd: 2% user + 14% kernel / faults: 2354 minor
  8.5% 2885/dnsmasq: 0.9% user + 7.6% kernel
  5.1% 10968/com.coomix.app.bus: 2.7% user + 2.4% kernel / faults: 135 minor
  1.4% 227/qrngd: 0% user + 1.4% kernel
  0.8% 3/ksoftirqd/0: 0% user + 0.8% kernel
  0.6% 11016/com.coomix.app.bus:remote: 0.4% user + 0.2% kernel / faults: 34 minor
  0.5% 131/w1_bus_master1: 0% user + 0.5% kernel
  0.5% 1832/mpdecision: 0% user + 0.5% kernel
  0.4% 1804/mcd: 0.3% user + 0.1% kernel
  0.3% 1326/com.android.phone: 0.2% user + 0.1% kernel
  0% 7/kworker/u:0H: 0% user + 0% kernel
  0.1% 151/mmcqd/0: 0% user + 0.1% kernel
  0% 205/healthd: 0% user + 0% kernel
  0% 207/vold: 0% user + 0% kernel
  0% 226/thermal-engine: 0% user + 0% kernel
  0.1% 281/sdcard: 0% user + 0.1% kernel
  0% 387/xtwifi-client: 0% user + 0% kernel
  0% 1113/com.android.systemui: 0% user + 0% kernel / faults: 1 minor
  0% 1375/com.miui.whetstone: 0% user + 0% kernel
  0% 1533/com.miui.powerkeeper:service: 0% user + 0% kernel / faults: 10 minor
  0% 1983/com.lbe.security:service: 0% user + 0% kernel / faults: 1 minor
  0.1% 2061/com.lbe.security.miui: 0% user + 0.1% kernel
  0% 2566/com.miui.securitycenter: 0% user + 0% kernel
  0% 5518/kworker/0:0: 0% user + 0% kernel
  0% 8118/kworker/0:1: 0% user + 0% kernel
  0% 21358/kworker/0:4: 0% user + 0% kernel
  0% 26896/kworker/0:0H: 0% user + 0% kernel
  0.1% 28973/kworker/u:3: 0% user + 0.1% kernel
50% TOTAL: 23% user + 24% kernel + 1.5% softirq


第一行为过去的1,5和15分钟内的平均CPU负载。然后时近7秒所有应用CPU使用情况。



RUM

真实用户测量(RUM Real User Measurement): 收集应用的运行时数据,汇总的结果,输出报告和寻找数据中可能出现的问题。

有些公司自己开发RUM。如果不能自己开发,市面也有一些免费或者收费的工具。

集成SDK:

安卓测试相关_第1张图片

我们这里安装了:

Crashlytic:成立于2011年,是专门为移动应用开者发提供的保存和分析应用崩溃信息的工具。

Crittercism:提供了世界上首个领先的移动应用性能管理(mAPM)解决方案。其SDK被嵌入了成千上万的应用中,在全世界有近十亿用户。该公司致力于收集性能数据,例如错误报告、崩溃诊断细节、面包屑(breadcrumbs,指导航记录)、设备/载体/OS统计和用户行为等。这些数据大部分是非结构化的,并且随着应用程序、版本、设备和使用模式的不同变化很大。

Google分析(Google Analytics): 由Google所提供的网站流量统计服务。

NewRelic:  参考资料:https://en.wikipedia.org/wiki/New_Relic。

另外国内的听云做得也不错,虽然技术比不上国外同行,但是网络相对比较快捷点。对数据安全等要求比较高的,建议不要使用听云。

比如显示图片的方法:

imageViews=new ImageView[100];
public int Imagelooper(int numberofaddedimages, int totalImageCount, RelativeLayout rl){
    for(int i=0;i<numberofaddedimages;i++)
    {
        totalImageCount = totalImageCount++;
        //for analytics I want to track crashes.. so lets force it to crash
        // if(totalImageCount ==100){
        // totalImageCount=0;
        // }
        //if totalImageCount reaches 100 the app crashes since I have exceeded the array size
        imageViews[totalImageCount]=new ImageView(this);

如果数据越界达到100,日志报错如下:

03-13 14:01:32.351 13772-13837/com.sillars.imagescroll I/image downloaded? number: 99
03-13 14:01:32.469 13772-13837/com.sillars.imagescroll I/ImageDownloader?
image99responsetime (2RTT): 38
03-13 14:01:34.637 13772-13772/com.sillars.imagescroll E/AndroidRuntime?
FATAL EXCEPTION: main
Process: com.sillars.imagescroll, PID: 13772
java.lang.ArrayIndexOutOfBoundsException: length=100; index=100
at com.sillars.imagescroll.MyActivity.Imagelooper(MyActivity.java:327)
at com.sillars.imagescroll.MyActivity$3.onScrollStopped(MyActivity.java:178)
at com.sillars.imagescroll.MyScrollView$1.run(MyScrollView.java:37)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
03-13 14:01:35.329 13772-13797/com.sillars.imagescroll I/Fabric?
Crashlytics report upload complete: 550346640083-0001-35CC-27DD9B9DA026.cls
03-13 14:01:54.291 13772-15861/com.sillars.imagescroll I/com.newrelic.agent.android?
Harvester: connected
03-13 14:01:54.291 13772-15861/com.sillars.imagescroll I/com.newrelic.agent.android?
Harvester: Sending 102 HTTP transactions.
03-13 14:01:54.291 13772-15861/com.sillars.imagescroll I/com.newrelic.agent.android?
Harvester: Sending 1 HTTP errors.
03-13 14:01:54.292 13772-15861/com.sillars.imagescroll I/com.newrelic.agent.android?
Harvester: Sending 0 activity traces.
03-13 14:02:05.070 13772-13772/com.sillars.imagescroll I/Process?
Sending signal. PID: 13772 SIG: 9

Crashalytics的报告如下:

安卓测试相关_第2张图片

详情参见:http://crashes.to/s/5ba7d984fe7。

安卓测试相关_第3张图片

安卓测试相关_第4张图片

安卓测试相关_第5张图片

New Relic还可以针对具体的HTTP代码进行分析,如下:

安卓测试相关_第6张图片

Google Analytics可以分析用户行为:


安卓测试相关_第7张图片

我们进行分页,也可以从用户的退出看出问题:

/initialize tracker at top of the screen
t = analytics.newTracker(R.xml.app_tracker);
// Enable Advertising Features.
t.enableAdvertisingIdCollection(true);
t.enableExceptionReporting(true);
t.setScreenName("top of scroll");
t.send(new HitBuilders.ScreenViewBuilder().build());
<snip>
//10 more images were just requested, so update the screen name in Google Analytics
t.setScreenName(totalImageCount + " images");
t.send(new HitBuilders.ScreenViewBuilder().build());
//and add a crittercism Breadcrumb
Crittercism.leaveBreadcrumb(totalImageCount + " images")

安卓测试相关_第8张图片


安卓测试相关_第9张图片

增加网络分析:

t.send(new HitBuilders.EventBuilder()
    .setCategory("RTT Event")
    .setValue(AvgRTT.longValue())
    .setAction("ImageRTT").setLabel(networkConnection).build());
Crittercism.beginTransaction(networkConnection);
Crittercism.setTransactionValue(networkConnection, AvgRTT.intValue());
Crittercism.endTransaction(networkConnection);

安卓测试相关_第10张图片



安卓测试相关_第11张图片

安卓测试相关_第12张图片

最后,要注意sdk本身的性能。

网络性能


无线连接时,功耗从4.5mA增大125 mA。 Wi-Fi 240mA。但是无线连接的服务质量保证开销大,实际耗电更多。Nexus 6的Wi-Fi开启连接3mA,发送数据240 mA。

注意通话时对流量会有影响。

安卓测试相关_第13张图片

Wireshark是强大的抓包工具,在windows下配合Connectify使用,可以放出wifi来抓包。


安卓测试相关_第14张图片

Fiddler是一个HTTP代理,可以查看HTTPS流量,但是不能解开HTTPS的文件和内容。

安卓测试相关_第15张图片

安卓测试相关_第16张图片

MITMProxy和Fiddler类似, 用法参见:https://mitmproxy.org/doc/mitmproxy.html

安卓测试相关_第17张图片


应用程序资源优化(ARO Application Resource Optimizer)是监控Android和iOS的应用网络性能的工具。这是来自AT&T的免费/开源工具,它包含许多和Wireshark的和Fiddler相同的数据包捕获功能。且可以收集蜂窝网络数据。

安卓测试相关_第18张图片

对于Android版本,ARO Data Collector APK在设备上执行tcpdump,需要root权限。如果没有root,也可以运行,但是不能查看进程对应的连接 。

ARO会截取对应的屏幕。缺点,不能解析HTTPS。

对于包含网页的应用,http://www.webpagetest.org/。


安卓网络优化

网络优化通常是尽可能快地下载,然后关闭无线以节省电量。


•减少HTTP请求
•使用CDN(内容分发网络 Content Delivery Network)

•添加一个Expire头
•Gzip组件
•将样式表放在顶部
•脚本放在底部
•避免CSS表达式
•将JavaScript和CSS放在外部文件
•减少DNS查找
•减少JavaScript
•避免重定向
•删除重复的脚本
•配置的ETag
•缓存Ajax

参考资料:http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/


Gzip是最常见的算法。Zopfli算法比Gzip压缩强5%,但是压缩和解压更耗时,适用于不是经常变的内容。开启压缩,一般在 .htaccess文件:


<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$

mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>


文本文件最小化,比如下面代码:

<html>
<title> A Sample Page</title>
<body>
with some sample text
<--do more here-->

</body>
</html>

修改为:

<html><title> A Sample Page</title><body>with some sample text</body></html>

通常可以减少20-50%。


图片的质量和大小之间要有个合适点。要存储不同分辨率的图片。要获取图片的MetaData,google的图片通常压缩了85%,要根据不同的场景使用不同的压缩。google的WebP格式也可以考虑。

缓存:客户端开启缓存;服务器端设置缓存时间。

Android 4.0及以上版本开启缓存的方法:

private void enableHttpResponseCache() {
    try {
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    File httpCacheDir = new File(getCacheDir(), "http");
    Class.forName("android.net.http.HttpResponseCache")
        .getMethod("install", File.class, long.class)
        .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
        Log.d(TAG, "HTTP response cache is unavailable.");
    }
}

设备上每个文件的缓存时间由服务器设置在头部。在缓存时间里,文件直接从cache获取。缓存时间过后,会重新请求并设置缓存时间,如果文件没有修改,则会返回304。控制的方法如下:

缓存控制(添加Expire头):是最常用的方法。可以设置Private/Public,多用于CDN;no-store表示不缓存;no-cache:使用之前先验证,实际是有缓存的; max age=X表示缓存时间,单位是秒,通常为 0 (等同于no-cache); 60, 300, 600, 3600 (1 hour),86400 (1 day), 3153600 (1 year)。

ETag或实体标签(entity tag)是万维网协议HTTP的一部分。ETag是HTTP协议提供的若干机制中的一种Web缓存验证机制,并且允许客户端进行缓存协商。这就使得缓存变得更加高效,而且节省带宽。如果资源的内容没有发生改变,Web服务器就不需要发送一个完整的响应。ETag也可用于乐观并发控制,作为一种防止资源同步更新而相互覆盖的方法。


ETag是随机标识符,由Web服务器根据URL上的资源的特定版本而指定,类似于指纹,如果没有修改则返回304了,适用于频繁修改的文件。比如:

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=86400
Content-Type: image/jpeg
Date: Tue, 28 Jan 2014 00:14:55 GMT
Etag: "b17ad00-1f17-46723595372c0"
Expires: Wed, 29 Jan 2014 00:14:55 GMT
Last-Modified: Thu, 09 Apr 2009 18:23:47 GMT
Server: Apache/2.2.3 (CentOS)
X-Cache: HIT
Content-Length: 7959

Expire不如ETag和缓存常用。失效时间单位是天。

尽可能组合连接数。要尽量使用已有连接,蜂窝和无线的使用查询:

public static String getNetworkClass(Context context) {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo info = cm.getActiveNetworkInfo();
    if(info==null || !info.isConnected())
        return "-"; //not connected
    if(info.getType() == ConnectivityManager.TYPE_WIFI)
        return “wifi";
    if(info.getType() == ConnectivityManager.TYPE_MOBILE){
        return “cellular";
        }
    }
    return “unknown";
}

一些动作需要再网络开启的时候再操作,比如:

if (Tel.getDataActivity() >0){
    if (Tel.getDataActivity() <4){
        //1, 2, 3 response means that the cellular radio is transmitting!
        //download the image here using image getter
        imagegetter(counter, numberofimages);
        //and show the ad
        AdRequest adRequest = new AdRequest();
        adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
        adView.loadAd(adRequest);
        // Initiate a generic request to load it with an ad
        adView.loadAd(new AdRequest());
    }
}

超过15s不使用的连接,尽量要关闭。

HttpURLConnection connectionCloseProperly = (HttpURLConnection) ulrn.openConnection();
connectionCloseProperly.setRequestProperty("connection", "close"); //this disables "keep-alive"
connectionCloseProperly.setUseCaches(true);
connectionCloseProperly.connect();
Object response = connectionCloseProperly.getContent();
InputStream isclose = connectionCloseProperly.getInputStream();
...download and render bitmap image
connectionCloseProperly.disconnect();

内容分发网络(Content delivery network或Content distribution network,缩写:CDN)是指一种通过互联网互相连接的电脑网络系统,提供高性能、可扩展性、及低成本的网络将内容传递给用户。


内容分发网络的总承载量可以比单一骨干最大的带宽还要大。这使得内容分发网络可以承载的用户数量比起传统单一服务器多。也就是说,若把有100Gbps处理能力的服务器放在只有10Gbps带宽的数据中心,则亦只能发挥出10Gbps的承载量。但如果放到十个有10Gbps的地点,整个系统的承载量就可以到10*10Gbps。
同时,将服务器放到不同地点,可以减少互连的流量,进而降低带宽成本。
对于TCP传输而言,TCP的速度(throughput)会受到延迟时间(latency)与数据包漏失率(packet loss)影响。为了改善这些负面因素,内容分发网络通常会指派较近、较顺畅的服务器节点将数据传输给用户。虽然距离并不是绝对因素,但这么做可以尽可能提高性能,用户将会觉得比较顺畅。这使得一些比较高带宽的应用(传输高清画质的视频)更容易推动。
内容分发网络另外一个好处在于有异地备援。当某个服务器故障时,系统将会调用其他邻近地区的服务器服务,进而提供接近100%的可靠度。
除此之外,内容分发网络提供给服务提供者更多的控制权。提供服务的人可以针对客户、地区,或是其他因子调整。


路由控制可以使用OpenWrt Linux。Faraday可以用于隔离无线信号。AT&T Network Attenuator 可以模拟各种无线信号:

安卓测试相关_第19张图片

根据网络类型区分速度:

TelephonyManager teleMan = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
int networkType = teleMan.getNetworkType();
switch (networkType)
{case 1: netType = "GPRS";
    networkSpeed = "slow";
    break;
case 2: netType = "EDGE";
    networkSpeed = "slow";
    break;
case 3: netType = "UMTS";
    networkSpeed = "medium";
    break;
// we'll leave out a few network types, but you get the idea.
//You can see the full code on Github
case 13: netType = "LTE";
    networkSpeed = "fast";
    break;}


当然上面代码应该考虑信号强度。然后可以根据不同网络选择不同的图片:

switch(networkSpeed){
    case "fast":
        new ImageDownloader().execute(urlbig); //image is 143KB
        break;
    case "medium":
        new ImageDownloader().execute(urlmed); //image is 41KB
        break;
    case "slow":
        new ImageDownloader().execute(urlsmall); //image is 27KB
        break;
}

记录下时间:1,服务器返回200的时间;2,下载图片的时间。计算出时延和吞吐量。

private Bitmap downloadBitmap(String url) {
    Long start = System.currentTimeMillis(); //download start time
    final DefaultHttpClient client = new DefaultHttpClient();
    final HttpGet getRequest = new HttpGet(url);
        try {HttpResponse response = client.execute(getRequest);
        //check 200 OK for success
            final int statusCode = response.getStatusLine().getStatusCode();
            Long gotresponse = System.currentTimeMillis(); //time 200 response received
        }
        final HttpEntity entity = response.getEntity();
        contentlength = entity.getContentLength();//get ContentLength of file
        if (entity != null) {
            InputStream inputStream = null;
            try {
                inputStream = entity.getContent();
                final Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                Long gotimage = System.currentTimeMillis();
                //time image download completed
                responsetime = gotresponse - start;
                //time to the 200 ok response
                imagetime = gotimage-start;
                //download time
                throughput = ((double)contentlength/1024)/((double)imagetime/1000); //KB/s
                return bitmap;
}

高延时的环境,可以先多下载一些图片。

If (latency = normal){
    if (ImagesBelowtheFold<2){
        <get next batch of images>
    }
}
Else {
    //latency is high
    if (ImagesBelowtheFold<4){
        <get next batch of images>
    //consider getting more images too
    //also, smaller images?
}

Android 4.4.4以后可以开启Bluetooth HCI snoop log。

硬件特性

以三星S5为例:

1.指纹采集仪
2.心率监测仪
3.光监视器
4,相对湿度
5.环境温度
6.晴雨表
7. NFC
8.陀螺仪
9.加速度计
10.蓝牙
11.无线网络
12.调频收音机
13.蜂窝无线
14.正面和背面摄像头
15. GPS
16.磁场
17.光通量
18.电池温度
19.麦克风
20.触摸


谷歌报道,1秒设备使用的能源消耗等于2分钟的待机时间。5分钟的使用会消耗电池的1-1.6%。
电池的问题通常与硬件无关,应用设计与滥用设备功能大多是主要原因。

耗电因素

Android Power Profile

xml文件实例:

<?xml version="1.0" encoding="utf-8"?>
<device name="Android">
<item name="none">0</item>
<item name="screen.on">65</item>
<item name="screen.full">202</item>
<item name="bluetooth.active">87</item>
<item name="bluetooth.on">1</item>
<item name="wifi.on">3</item>
<item name="wifi.active">240</item>
<item name="wifi.scan">129</item>
<item name="dsp.audio">29</item>
<item name="dsp.video">215</item>
<item name="radio.active">125</item>
<item name="radio.scanning">25</item>
<item name="gps.on">1</item>
<array name="radio.on">
<value>4.5</value>
<value>4.5</value>
</array>
<array name="cpu.speeds">
<value>2457600</value>
<value>2265600</value>
<value>1958400</value>
<value>1728000</value>
<value>1574400</value>
<value>1497600</value>
<value>1267200</value>
<value>1190400</value>
<value>1036800</value>
<value>960000</value>
<value>883200</value>
<value>729600</value>
<value>652800</value>
<value>422400</value>
<value>300000</value>
</array>
<item name="cpu.idle">3.1</item>
<array name="cpu.active">
<value>348</value>
<value>313</value>
<value>265</value>
<value>232</value>
<value>213</value>
<value>203</value>
<value>176</value>
<value>132</value>
<value>122</value>
<value>114</value>
<value>97</value>
<value>92</value>
<value>84</value>
<value>74</value>

<value>56</value>
</array>
<item name="battery.capacity">2800</item>
<array name="wifi.batchedscan">
<value>.0002</value>
<value>.002</value>
<value>.02</value>
<value>.2</value>
<value>2</value>
</array>
</device>


大量消耗电池的硬件为屏幕,无线(蜂窝,Wi-Fi,蓝牙和GPS)和CPU(高处理速率)。上述文件存在/System/Frameworks/frameworks-res.apk中,反编译打开res/xml/power_profile.xml即可。单位都是毫安。


屏幕

Android的屏幕主要有两种:LED (Light Emitting Diode)和LCD (Liquid Crystal Display),功耗都比较大。后期的AMOLED、LED3等会更省电。

LCD屏幕有上千的通过背光照亮液晶体。液晶体的能耗很小,主要功耗在背光。LED的每个像素都有颜色和光。黑色功耗最少,白色功耗最大。

微波

尽可能一次下载足够多,然后关闭会更省电。尽量用基站信息代替GPS。

CPU

比如游戏中的后台计算。

其他传感器

注册传感器时可以使用getPower()方法来获得功耗。比如Nexus6的统计:

•加速度计:0.3毫安
•磁力计:10毫安
•陀螺仪:1.5毫安
•灯光:12.675毫安
•光0.175毫安
•晴雨表0.004毫安
•轮转11.8毫安
•地磁旋转 10.3毫安
•方向11.8毫安
•线性加速度1.8毫安
•重力1.8毫安
•倾斜0.3毫安
•设备位置分类    5.6-45毫安
•步骤检测 0.3毫安


休眠

休眠可以省电,但是需要注意唤醒间隔。


Wakelock和Alarm

Wakelock可以唤醒或者保持开启移动设备的部分部件。通常不建议使用,除非确实需要。可能的话,要尽量用JobScheduler代替。KitKat以前有很多Wakelock检测工具。KitKat及以后,root的应用才可使用Wakelock,adb中的batterystats有检测Wakelock的功能。

exact alarm只在使用精确的时间时调用。其他的用inexact alarm。

Doze框架

Android M release中增加了Doze框架限制唤醒频率。研究表明,设备处于空闲状态时电池70%的用于开启无线和连接。Doze框架允许部分窗口可以更新。状态如下:

*ACTIVE: 屏幕开启

*INACTIVE:屏幕关闭,但是设备没有休眠

*IDLE_PENDING: 打盹准备进入Doze。

*IDLE:休眠

*IDLE_MAINTENANCE:维护排队的alarm和更新的窗口。

强行切换Android M的状态:

adb shell dumpsys battery unplug //tricks the device to stop charging
adb shell dumpsys deviceidle step //reusing this step walks you through the various states


基本电池分析

Settings → Battery中可以看到应用的电池使用情况。点击具体应用可以查看应用的消耗。点击上部可以查看历史电池消耗情况。可以比较流量和电量的消耗,计算出流量的速率,如果有大量的低速流量,说明设计不好。

Android M中增加了App Standby功能,阻止不常用的应用在非充电时连接网络或者发起进程。通过adb shell dumpsys usagestats可以查看使用频率。


高级电池监控

安卓4.4以后的adb中增加了batterystats功能。

adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats --enable full-wake-history (5.0才支持)
adb shell dumpsys batterystats --charged (最近充满之后的电池消耗)

下面部分概述各阶段消耗情况:

Discharge step durations:

#0: +2m28s313ms to 88 (screen-on, power-save-off)
#1: +2m38s364ms to 89 (screen-on, power-save-off)
#2: +2m27s323ms to 90 (screen-on, power-save-off)
#3: +2m8s449ms to 91 (screen-on, power-save-off)
#4: +2m17s115ms to 92 (screen-on, power-save-off)
#5: +2m7s924ms to 93 (screen-on, power-save-off)
#6: +2m17s693ms to 94 (screen-on, power-save-off)
#7: +2m6s425ms to 95 (screen-on, power-save-off)
#8: +1m50s298ms to 96 (screen-on, power-save-off)
#9: +3m0s436ms to 97 (screen-on, power-save-off)

下面部分对电源消耗做了统计:

Statistics since last charge:
System starts: 0, currently on battery: false
Time on battery: 30m 36s 621ms (99.3%) realtime, 27m 58s 456ms (90.8%) uptime
Time on battery screen off: 3m 31s 100ms (11.4%) realtime, 52s 935ms (2.9%) uptime
Total run time: 30m 48s 839ms realtime, 28m 10s 674ms uptime
Start clock time: 2014-10-17-22-54-33
Screen on: 27m 5s 521ms (88.5%) 1x, Interactive: 27m 5s 837ms (88.5%)
Screen brightnesses:
dark 27m 5s 521ms (100.0%)
Total full wakelock time: 29m 16s 938ms
Total partial wakelock time: 17s 153ms
Mobile total received: 187.99KB, sent: 201.15KB (packets received 750, sent 742)
Phone signal levels:
none 35s 29ms (1.9%) 10x
poor 11m 7s 494ms (36.3%) 96x
moderate 18m 29s 647ms (60.4%) 94x
good 24s 451ms (1.3%) 7x
Signal scanning time: 0ms


上次充满电后的统计:

Device battery use since last full charge
Amount discharged (lower bound): 10
Amount discharged (upper bound): 11


电池使用预计

Estimated power use (mAh):
Capacity: 3220, Computed drain: 359, actual drain: 322-354
Uid u0a117: 106
Screen: 96.6
Uid 1000: 26.1
Uid 0: 24.9
Cell standby: 22.9


电池历史统计:

adb bugreport > bugreport.txt //download the output to your computer

./historian.py bugreport.txt > out.html //create the html file

主要建议用安卓5以上版本。分析工具下载地址:https://github.com/google/battery-historian。


安卓测试相关_第20张图片


JobScheduler在安卓5.0增加,更好地调度任务。



google相关网址

http://developer.android.com/tools/testing/index.html

http://developer.android.com/tools/testing/testing_android.html

http://developer.android.com/tools/testing/testing-tools.html

Top 5 Android Testing Frameworks (with Examples) http://testdroid.com/tech/top-5-android-testing-frameworks-with-examples


googlesamples/android-testing https://github.com/googlesamples/android-testing


Developing Android unit and instrumentation tests - Tutorial http://www.vogella.com/tutorials/AndroidTesting/article.html


Introduction to Android development with Android Studio - Tutorial http://www.vogella.com/tutorials/Android/article.html


Building Android applications with Gradle - Tutorial http://www.vogella.com/tutorials/AndroidBuild/article.html


How Do Top Android Developers QA Test Their Apps? http://techcrunch.com/2012/06/02/android-qa-testing-quality-assurance/


Android Testing Tutorial: Unit Testing like a True Green Droid http://www.toptal.com/android/testing-like-a-true-green-droid


https://www.youtube.com/watch?v=L-k6dpfXqBY

Android Testing Options https://github.com/codepath/android_guides/wiki/Android-Testing-Options  



你可能感兴趣的:(安卓测试相关)