【转】 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等参数 什 ...
随机推荐
- TRansportation ANalysis and SIMulation System
https://www.fhwa.dot.gov/planning/tmip/transims/background.cfm?from=groupmessage
- c#的const可以用于引用类型吗
答案是可以的.不过用const修饰的类实例只能是null. class A{ public int a=0; } class B{ const A constA=null; const object ...
- redis持久化RDB详细操作步骤
1.xshell远程登录服务器ssh root@192.168.142.130 2.切换到redis目录 3.创建一个配置文件s2-redis.conf 4.编辑文件 vi s2-redis.conf ...
- openstack 官方镜像qcow2 下载和修改密码
下载地址: CentOS6:http://cloud.centos.org/centos/6/images/ CentOS7:http://cloud.centos.org/centos/7/imag ...
- 阿里云服务(一) OSS
阿里电子商务迄今是中国最大的电商网站,各个厂商都在去模仿.就像google的大数据处理,Hadoop的思想等等,只有做出了一些成绩,起了带头羊,那么将会是非常吃香的.从今天开始简单学习了解一下阿里的各 ...
- 读:Instance-aware Image and Sentence Matching with Selective Multimodal LSTM
摘要:有效图像和句子匹配取决于如何很好地度量其全局视觉 - 语义相似度.基于观察到这样的全局相似性是由图像(对象)和句子(词)的成对实例之间的多个局部相似性的复合聚集,我们提出了一个实例感知图像和句子 ...
- Java实现将一段汉字变成unicode码
public class T { public static void main(String[] args) { String s = "java 中文编码"; System.o ...
- 转 Hadoop傻瓜化:Datameer大数据收入翻三番
淘薛奎发布到 <数据极客> 06-28 16:04 随着分析正在成为企业IT的核心,昔日的BI- ETL-EDW分析范型已经完全落伍,不再适用.而力推“大数据傻瓜化”的Datameer ...
- P3338 [ZJOI2014]力(FFT)
题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...
- ConcurrentHashMap以及HashMap,HashTable的区别
ConcurrentHashMap与HashMap,和HashTable 的区别? ConcurrentHashMap是一个线程安全的key-value数据结构,而HashMap不是.Concurre ...