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

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开发相关文章

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。