monkey的使用及与leakcanary结合测试内存泄漏并禁止点击状态栏音量键返回键

来源:互联网 发布:编写linux脚本执行命令 编辑:程序博客网 时间:2024/05/22 06:44

本文不以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 offclstitle 别忘了跑monkey啊:menuclscolor 0Aecho.echo 1.禁用systemui并重启echo.echo 2.启用systemui并重启echo.echo q.退出echo.:choset choice=set /p choice=          请选择:IF NOT "%choice%"=="" SET choice=%choice:~0,1%if /i "%choice%"=="1" goto disableif /i "%choice%"=="2" goto enableif /i "%choice%"=="Q" exitecho 选择无效,请重新输入echo.goto cho:disableadb shell "su -c" pm disable com.android.systemuiadb shell rebootpause&exit:enableadb shell "su -c" pm enable com.android.systemuiadb shell rebootpause&exit

2.屏蔽音量、返回等按键,在BaseActivity中加入如下代码,测试时打开,不测试时注释掉。

/**monkey 测试屏蔽按键*/@Overridepublic 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();enableDisplayLeakActivity(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测试一下崩溃情况。之前也一直遇到状态栏和音量按键的问题,现在总算解决了。很遗憾的是锁屏按键还是没能解决,只能在它按掉锁屏后自己手动打开。

阅读全文
1 0
原创粉丝点击