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

本文不以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();

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

你可能感兴趣的:(android,Android,monkey)