zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-]

    1. adb命令
    2. 模拟器Console
    3. 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开发相关文章

  • 相关阅读:
    Android 模拟系统事件(三)
    全民Scheme(2):来自星星的你
    Java经典23种设计模式之行为型模式(三)
    libmysqld,嵌入式MySQLserver库
    闲云控制台(一)控制台命令解析框架
    怎样改动android系统字体大小
    [多校2015.02.1006 高斯消元] hdu 5305 Friends
    换工作经历和心得
    安卓实训第七天---多线程下载实现(进度条)
    校园双选会,你都懂么
  • 原文地址:https://www.cnblogs.com/blongfree/p/5048015.html
Copyright © 2011-2022 走看看