【转】 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开发相关文章
【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode的更多相关文章
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
随机推荐
- php递归删除所有文件
function del_file($dir) { if (@rmdir($dir)==false && is_dir($dir)) { if ($dp = opendir($dir) ...
- NOI-linux下VIM的个人常用配置
路径:/etc/vim/vimrc 打开终端:Ctrl+Alt+T 输入:sudo vim或gedit /etc/vim/vimrc (推荐用gedit,更好操作) 以下是我的配置: "我的 ...
- $ php app/console fos:user:promote
$ php app/console fos:user:create Please choose a username:admin Please choose an email:admin21@dwq ...
- ACM-最小生成树之继续畅通project——hdu1879
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lx417147512/article/details/27092583 ************** ...
- Bootstrap学习3--栅格系统
备注:最新Bootstrap手册:http://www.jqhtml.com/bootstraps-syntaxhigh/index.html 目录1.简介2.栅格选项3.列偏移4.嵌套列5.列排序 ...
- python元组和列表区别
元组可以简单认为是一个只读的列表 tuper = const list
- chorme 插件
json-handle: json可视化工具 开发中需要用到json,在浏览器显示的json非常乱,难以理解.有没有让人一目了然的工具,让json看起来非常直观呢,json-handle随之而出,包含 ...
- Swift URL encode
前言 在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一 ...
- 【Flask】filter 常用查询条件
1. equal 2. not equal 3. like, ilike 4.in 5. not in 6. is null 7. is not null 8. and 9. or ...
- 2.HelloWorld程序
1.流程图 2./itcast0711/src/main/java/cn/itcast/a_helloworld/HelloWorld.java package cn.itcast.a_hellowo ...