您的位置:首页 > 移动开发 > Android开发

Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

2013-11-14 14:29 441 查看

adb命令

我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Content Provider(上)

abd –e shell
-e是表面连接模拟器emulator,-d则是连接设备。在模拟器中,我们有一个提升的Linux权限,而在真实设备是没有的,我们可以在模拟器中处理SQLite数据,但是不能在真实设备这样做,即便是我们自己部署的应用。

模拟器Console

我们可以通过telnet接入到模拟器,端口一般为5554,在模拟器的window title中显示。我们在当中模拟GPS事件,短信,电池状态和网络状态改变,具体可以参考:http://developer.android.com/guide/developing/devices/emulator.html#console



StrictMode

Android 2.3引入StrictMode(在android.os包中),用于检查线程和虚拟器的策略破坏,当检测到policy vialation,会生产一个含有stack trace的告警,据此可以强制程序崩溃或只是log记录继续执行。
Thread策略检查通常用于main thread,也成为UI线程。在主线程中一般不建议进行磁盘读写、网络访问,以及自定义的slow call(调用某代码慢)如果发现这类事件将进行告警,根据告警的内容,我们可以选择logcat记录、弹框显示、屏闪、写DropBox log file,或者直接crash程序。相关的代码例子如下:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

.detectDiskReads()

.detectDiskWrites()

.detectNetwork() //可以用detectAll(),表示全部监测。如果除了读disk外都检测,可以 .detectAll().permitDiskReads()

.penaltyLog() //用LogCat来显示,可以在后面加上penaltyDeach()来crash应用

.build());
一旦打开strictmode,则适用于整个线程,可以在运行初期的onCreate()中设置,设置一次就足够。
VM策略检查用于检测内存泄漏,如SQLite对象,Activity对象,以及可以Closeable的对象,如调用close()进行关闭,使用例子如下。和线程策略检测很相似,不同之处在于虚拟机不能通过弹框来进行告警。

StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

.detectLeakedSqlLiteObjects()

.penaltyLog()

.penaltyDeath()

.build());
StrictMode应用于开发版本,而避免在生产版本中使用。简单地,我们可以直接删除相关的代码,但这不是好的处理方式。我们可以设置应用变量,例如static boolean PRODUCT_MODE = false; 先进行检测。推荐利用在AndroidManifest.xml中<application>中的android:debuggable参数,如果为true则开启strictmode,否则不开启。当eclipse在模拟器或设备中部署时,该值设置为true,而作为生产版本释放时,该值设置为false。代码例子如下:

ApplicationInfo appInfo = context.getApplicationInfo();

int appFlags = appInfo.flags;


if ((appFlags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) {

// Do StrictMode setup here

}
StrictMode只能在Android 2.3及之后版本使用,如果应用允许部署在2.3之前的版本。我们可以进行一些判断,但是2.2及之前的版本已经很少,可以不考虑它们。作为通用的版本API存在差别,可以使用下面的方法:

try {

Class sMode = Class.forName("android.os.StrictMode"); //1、检测该类是否存在,如不存在,将抛出ClassNotFoundException

Method enableDefaults = sMode.getMethod("enableDefaults");
//2、获取该类某个方法,例如strictMode.enableDefaults()


enableDefaults.invoke(null); //3、调用该方法。本例有静态方法

}

catch(Exception e) {

// StrictMode not supported on this device, punt

Log.v("StrictMode", "... not supported. Skipping...");

}
但这种方式调用起来很满分,简单地我们可以将相关的代码用try{}catch(Throwable throwale){ …. }包括起来。如果没有StrictMode,则会抛出VerifyError出来,如下:

try {

…… //相关的处理 ……

}

catch(Throwable throwable) {

Log.v("StrictMode", "... is not available. Punting...");

}
相关链接:
我的Android开发相关文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: