Android 性能测试实践(一)

B站、小红书、微信公众号请搜索:"测试开发进阶",一起学习、共同成长

前言:

前段时间花了两周的时间做了一个基于Android 客户端的性能测试现在分享给大家,希望对大家有所帮助!

Look-Look

1,既然是基于Android客户端的性能测试那就与后台的一些API、数据接口要区分开来~!
2,Android的性能测试能其实包括很多很多的测试项比如:资源消耗,内存泄露,电量功耗,启动耗时,渲染等等....

怎么去做?
1,采集数据 :采集的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。
2,设计场景 :搞定数据的采集后配合一些固定的场景来收集一些数据(**最好**多取几次而且每次配合不同的设备看平均值)作为最后的对比分析
3,结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的原因

好吧下面慢慢跟大家详细的说吧!

先写下内存篇

内存的采集:

Android的内存的采集这边介绍三种方式:

1,通过Dumpsys 来取值

adb shell dumpsys meminfo 

这里可以看到当前所有进程的内存信息!

如果你要看详细的内存:

adb shell  dumpsys  meminfo  pakagename or Pid

看其中的Size 可以发现 Native Heap 和Dalvik Heap 占据了Heap Size
dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的。
bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
android程序内存一般限制在16M,当然也有24M的或者更高的。

3,用/system/xbin/procrank工具 来取值很直观

adb shell procrank

VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

USS 是针对某个进程开始有可疑内存泄露的情况, 是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放!

3,使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个方法是写一个简单的app去监控的时候用到的,轻便简单)

private void GetMemory() {    

    final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);    

    ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();   

    activityManager.getMemoryInfo(info);    

    Log.i(tag,"系统剩余内存:"+(info.availMem >> 10)+"k");   

    Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);

    Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");

}


 void GetMemory() {    

    final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);    

    ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();   

    activityManager.getMemoryInfo(info);    

    Log.i(tag,"系统剩余内存:"+(info.availMem >> 10)+"k");   

    Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);

    Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");

}


availMem:表示系统剩余内存

lowMemory:它是boolean值,表示系统是否处于低内存运行

hreshold:它表示当系统剩余内存低于好多时就看成低内存运行

我用过以上三种最多,其实Top 也可以 还有很多方法都可以。

adb shell top  

内存拿到后怎么去用呢?

这里我用的方法是用java封装Adb shell dumpsys meminfo再用字符串截取 打印的方式

      public static String GetMemory(String packageName) throws IOException, InterruptedException {

          String str3=null;
            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);
            try {

                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " + proc.exitValue());
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        proc.getInputStream()));
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = in.readLine()) != null) {
                    stringBuffer.append(line+" ");

                }
                String str1=stringBuffer.toString();
                String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));     
                str3=str2.substring(0,10);
                str3.trim();
            } catch (InterruptedException e) {
                System.err.println(e);
            }finally{
                try {
                    proc.destroy();
                } catch (Exception e2) {
                }
            }
          return str3 ;
      }

      }
public static String GetMemory(String packageName) throws IOException, InterruptedException {

          String str3=null;
            Runtime runtime = Runtime.getRuntime();
            Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);
            try {

                if (proc.waitFor() != 0) {
                    System.err.println("exit value = " + proc.exitValue());
                }
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        proc.getInputStream()));
                StringBuffer stringBuffer = new StringBuffer();
                String line = null;
                while ((line = in.readLine()) != null) {
                    stringBuffer.append(line+" ");

                }
                String str1=stringBuffer.toString();
                String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));     
                str3=str2.substring(0,10);
                str3.trim();
            } catch (InterruptedException e) {
                System.err.println(e);
            }finally{
                try {
                    proc.destroy();
                } catch (Exception e2) {
                }
            }
          return str3 ;
      }

      }

截取好之后呢 可以跟 其他的一些系统资源值拼在一起打印出来:

拿到这些值之后可以配合手工或自动化来做数据收集,你会看到有些步骤内存占用很高或者Cpu消耗也会较高,这样你就可以去check一下 关于这个步骤相关 的Code

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Studio是一个基于IntelliJ IDEA开发的专门针对Android平台的集成开发环境(IDE)。它提供了强大的代码编辑器和开发者工具,使Android应用的构建更加高效。Android Studio使用Gradle作为灵活的构建系统,具有以下特点和功能: - 提供快速且功能丰富的模拟器,包括视图预览功能。 - 提供统一的开发环境,可以针对所有Android设备进行开发。 - Instant Run功能可以将变更直接推送到正在运行的应用中,无需构建新的APK。 - 提供丰富的代码模板和GitHub集成,可以帮助您构建常用应用功能和导入示例代码。 - 提供了各种测试工具和框架,以及Lint工具来帮助您捕捉性能、易用性、版本兼容性和其他问题。 - 支持C和NDK开发,在Android Studio中进行NDK开发更加便捷,同时提供断点调试功能。 与Eclipse相比,Android Studio具有以下不同之处: - Android Studio是基于IntelliJ IDEA开发的,而ADT是作为Eclipse的Android开发插件存在的。 - Android Studio使用基于Gradle的编译系统,而ADT使用基于Ant的编译系统。 - Android Studio的视图布局UI预览功能是实时的,而ADT的UI预览是非实时的。 - Android Studio的工程目录结构是基于功能逻辑的,而ADT划分工程目录是以构建、代码逻辑等为基础,只有project和Modules两个目录。 - Android Studio提供了更方便进行NDK开发以及断点调试的支持。 总结来说,Android Studio是一个功能强大且针对Android应用开发的专用开发工具,它基于IntelliJ IDEA,并使用Gradle作为构建系统,提供了丰富的功能和工具来提高开发效率和便利性。与Eclipse相比,Android Studio具有更智能和方便的Java开发提示、实时UI预览、基于功能逻辑的工程目录结构等优势,同时对于NDK开发也提供了更好的支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值