monkey的使用及与leakcanary结合测试内存泄漏并禁止点击状态栏音量键返回键
2017-09-15 15:05
579 查看
本文不以monkey和leakcanary的用法为主,要看它们用法百度一下大把的。本文要讲的是monkey使用的坑和与leakcanary结合以后的坑。
一、monkey的简单使用
新建一个whitelist的txt文档,里面写上包名
将这个文档导入手机的根目录下。
打开命令提示行,执行adb shell,然后执行命令。至于命令是什么意思,百度一下非常详细了。
monkey --pkg-whitelist-file /mnt/sdcard/whitelist.txt --throttle 200 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -s 1000 -v -v -v 10000 1 >> /mnt/sdcard/Stability_base.txt 2 >> /mnt/sdcard/Stability_base_err.txt
在根目录下就可以看到跑monkey的日志了,跑完后发送到电脑上看最好。
关闭monkey的方法:adb shell->ps | grep monkey->kill pid(例如第二步看到的pid为15248,第三步输入kill 15248即可)。
二、leakcanary的使用
依赖
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
Application里初始化。源码是LeakCanary,我这里用的LeakCanaryWithoutDisplay。
if (!LeakCanaryWithoutDisplay.isInAnalyzerProcess(this)) { // This process is dedicated to LeakCanary for heap analysis. // You should not init your app in this process. LeakCanaryWithoutDisplay.install(this); }
运行我们的程序后会安装一个Leaks应用,我们的程序有内存泄漏会在通知栏弹出提示。
三、遇到的问题
1.monkey会自动打开状态栏,会播放音乐,打开和关闭wifi。
首先,手机要root,下载360的一键root即可。Adb shell,如果是$,就输入su,变成#,再输入pm disable com.android.systemui,显示已经屏蔽系统ui,然后重启手机,可以输入reboot重启。 第二条步骤也可以通过bat脚本,代码如下
@echo off cls title 别忘了跑monkey啊 :menu cls color 0A echo. echo 1.禁用systemui并重启 echo. echo 2.启用systemui并重启 echo. echo q.退出 echo. :cho set choice= set /p choice= 请选择: IF NOT "%choice%"=="" SET choice=%choice:~0,1% if /i "%choice%"=="1" goto disable if /i "%choice%"=="2" goto enable if /i "%choice%"=="Q" exit echo 选择无效,请重新输入 echo. goto cho :disable adb shell "su -c" pm disable com.android.systemui adb shell reboot pause&exit :enable adb shell "su -c" pm enable com.android.systemui adb shell reboot pause&exit
2.屏蔽音量、返回等按键,在BaseActivity中加入如下代码,测试时打开,不测试时注释掉。
/**monkey 测试屏蔽按键*/ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch(keyCode){ case KeyEvent.KEYCODE_HOME:return true; case KeyEvent.KEYCODE_CALL:return true; case KeyEvent.KEYCODE_SYM: return true; case KeyEvent.KEYCODE_VOLUME_DOWN: return true; case KeyEvent.KEYCODE_VOLUME_UP: return true; case KeyEvent.KEYCODE_STAR: return true; case KeyEvent.KEYCODE_POWER: return true; } return super.onKeyDown(keyCode, event); }
2.屏蔽锁屏键、home键,这个真的不知道。谁知道的话麻烦告诉我。
3.monkey会自动打开leakcanary,会删除内存泄漏的记录。
新建一个包,命名为squareup.leakcanary,新建一个类,命名为LeakCanaryWithoutDisplay,把LeakCanary的代码直接复制过去。以5.1为例作修改。修改install方法public static RefWatcher install(Application application) { RefWatcher refWatcher = ((AndroidRefWatcherBuilder) refWatcher(application).listenerServiceClass(DisplayLeakService.class).excludedRefs( AndroidExcludedRefs.createAppDefaults().build())).buildAndInstall(); enableDispl a83b ayLeakActivity(application); return refWatcher; }
修改enableDisplayLeakActivity方法,实际上是把true改为了false,
public static void enableDisplayLeakActivity(Context context) { LeakCanaryInternals.setEnabled(context, DisplayLeakActivity.class, false); }
进源码里可以看到,最终调用了PackageManager的setComponentEnabledSetting方法,解释是,设置四大组件的enable状态,它将覆盖manifest里面可能已经设置了的状态。
public abstract void setComponentEnabledSetting(ComponentName componentName, int newState, int flags);
记住测试完后要打开enableDisplayLeakActivity,把false改为true。重新运行就看到leakcanary的界面了。
四、总结:事实上即使不需要检查内存泄漏我们也要跑monkey测试一下崩溃情况。之前也一直遇到状态栏和音量按键的问题,现在总算解决了。很遗憾的是锁屏按键还是没能解决,只能在它按掉锁屏后自己手动打开。
相关文章推荐
- iOS使用UIPageViewController结合多个UITableView后点击状态栏无法让UITableView置顶问题
- android Toolbar的使用结合状态栏与返回键
- 网站内存泄漏问题追踪--初始访问后,三次查询点击内存使用量达400M
- 使用spring提供的测试功能结合JUnit4进行单元测试
- 如何理解、使用Android LogCat以及通过Monkey进行压力测试
- 使用PhotoShop与Matlab结合测试Shape Context Matching
- 使用FastMM4结合View CPU避免内存泄漏
- 禁止页面使用backspace返回到上一级目录
- 网站内存泄漏问题追踪--初始访问后,三次查询点击内存使用量达400M
- 结合测试驱动领悟依赖注入的正确使用
- android 使用Monkey进行压力测试
- 使用Jrtplib结合opencv2.2传输一张图像的测试
- 使用AJAX的方法将TextBox控件和Calendar控件结合使用,点击TextBox后弹出Calendar控件
- 超级链接href,点击禁止使用URL转向
- 使用FastMM4结合View CPU避免内存泄漏
- 火车头采集测试发布返回来路信息被禁止的问题
- Android中使用Monkey进行UI或应用程序测试
- 以LinkedHashMap和ArrayList的结合使用,返回一个类似记录集的ArrayList