android调试stetho的那点事
在调试安卓程序的过程中,受不了每次看日志查看网络的响应和导出db的动作(甚至有时候都无法导出db),这里安利一个facebook出品的神器 stetho,不过这个有些限制,在使用的时候一定的通过usb与调试的手机相连通的,也要使用chrome浏览器
1. stetho支持的功能
支持的功能主要是针对网络和db的,看github项目上的趋势,应该是在准备一些后续的功能(按照需求集成咯,我觉得网络和db的最重要了),把官网的介绍抠了下来官网stetho介绍
1. 支持应用的网络请求返回报文的查看
在chrome浏览器中输入chrome://inspect
来进入。(第一次使用这个功能的时候要翻墙,翻墙,翻墙,重要的事情要说三遍,不然你点击了inpect永远是空白的,如果没法翻墙,请查看这篇文章)
2. 支持的db查看功能 和 支持的sql语句直接进行交互功能(增删改查都是可以的)
2. 集成stetho
导入依赖
implementation ‘com.facebook.stetho:stetho:1.5.0’根据网络请求框架导入不同的依赖包
implementation ‘com.facebook.stetho:stetho-okhttp3:1.5.0’
or:
implementation ‘com.facebook.stetho:stetho-urlconnection:1.5.0’在application中进行集成
public class MyApplication extends Application {public void onCreate() {super.onCreate();Stetho.initializeWithDefaults(this);}
}
- 如果是有网络请求的,以okhttp举例,创建okhttpClient的时候需要加入一个拦截器
new OkHttpClient.Builder().addNetworkInterceptor(new StethoInterceptor()).build()
3. 集成stetho的建议(干货)
建立一个单独的productFlavor来集成功能,不要在正式的环境中集成这个东西。会使得应用变得更加庞大,也给应用留下漏洞
比如在build.gradle建立一个productflavorproductFlavors {{} }
在应用的的main目录中建立一个productFlavor innerteset的目录,然后把,通过清单合并操作中的替换application类的方式重新指定application.
关于网络的请求中,有的应用的报文是有加解密的。这里需要做一些额外的动作
修改默认的网络请求拦截类StethoInterceptor.class
,新建的一个类把原来的类文件中东西拷贝出来进行调整
解密请求的报文,主要是修改内部类OkHttpInspectorRequest
的body()
,拿到原始报文的,请求体,完成解密动作后重新包装生成一个请求体,给原来的代码使用。下面有一个我在自己应用中使用的实例@Nullablepublic byte[] body() throws IOException {//我的测试应用的请求报文都是data:{}的格式,所以这里这么写,各个应用要按照自己应用的需求改写FormBody copyedBody = (FormBody) (this.mRequest.body());List<String> nameList = new ArrayList<>();List<String> valusList = new ArrayList<>();for (int i=0; i< copyedBody.size(); i++) {nameList.add(copyedBody.encodedName(i));if ("data".equals(copyedBody.encodedName(i))) {valusList.add(new JsonFormatUtil().formart(这里解密请求的报文));}}FormBody copyedBody2 = new FormBody.Builder().add(nameList.get(0), valusList.get(0)).build();FormBody body = copyedBody2;//下面这块代码不动,保持原样,上面重新生成了requestBody而已if (body == null) {return null;} else {OutputStream out = this.mRequestBodyHelper.createBodySink(this.firstHeaderValue("Content-Encoding"));BufferedSink bufferedSink = Okio.buffer(Okio.sink(out));try {body.writeTo(bufferedSink);} finally {bufferedSink.close();}return this.mRequestBodyHelper.getDisplayBody();}}
解密返回报文,返回的报文,stetho是保存在文件中的然后进行的发送,需要修改默认的
ResponseHandler
抄袭原来的ReponseHanlder,主要修改的onEOF方式
//调整原来的类,增加一个readFile的方法public void onEOF() {this.reportDataReceived();try {readFile(this.mRequestId);} catch (IOException e) {Log.e(TAG, "readFile Exception onEOF: " + e);}this.mEventReporter.responseReadFinished(this.mRequestId); }//读取默认的文件 public ResponseBodyData readFile(String requestId) throws IOException {ResponseBodyFileManager responseBodyFileManager = new ResponseBodyFileManager(CeshiApplication.getApplication());ResponseBodyData responseBodyData = responseBodyFileManager.readFile(requestId);OutputStream outputStream = null;//这个对象是数据的对象,用于json转换使用SfReponseBodyData sfReponseBodyData = new Gson().fromJson(responseBodyData.data, SfReponseBodyData.class);sfReponseBodyData.data = 这里就可以进行解密的动作,得到解密的字符串;try {outputStream = responseBodyFileManager.openResponseBodyFile(requestId, responseBodyData.base64Encoded);String data = new Gson().toJson(sfReponseBodyData);data = data.replace("\\", "");data = new JsonFormatUtil().formart(data);outputStream.write(data.getBytes());} catch (Exception e) {Log.e(TAG, "readFile Exception: " + e);} finally {if (null != outputStream) {outputStream.close();}}LogUtils.getInstance().showLogD(TAG, "readFile" ,"new record");return null; }
为了在浏览器上好看,报文最后都需要进行格式化,比如我这里是默认的json报文,就进行格式化后传给浏览器
//网络上随便抠的一段格式代码
public class JsonFormatUtil {public String formart(String s) {int level = 0;//存放格式化的json字符串StringBuilder jsonForMatStr = new StringBuilder();for (int index = 0; index < s.length(); index++)//将字符串中的字符逐个按行输出{//获取s中的每个字符char c = s.charAt(index);//level大于0并且jsonForMatStr中的最后一个字符为\n,jsonForMatStr加入\tif (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {jsonForMatStr.append(getLevelStr(level));}//遇到"{"和"["要增加空格和换行,遇到"}"和"]"要减少空格,以对应,遇到","要换行switch (c) {case '{':case '[':jsonForMatStr.append(c + "\n");level++;break;case ',':jsonForMatStr.append(c + "\n");break;case '}':case ']':jsonForMatStr.append("\n");level--;jsonForMatStr.append(getLevelStr(level));jsonForMatStr.append(c);break;default:jsonForMatStr.append(c);break;}}return jsonForMatStr.toString();}private static String getLevelStr(int level) {StringBuilder levelStr = new StringBuilder();for (int levelI = 0; levelI < level; levelI++) {levelStr.append("\t");}return levelStr.toString();}
}
android调试stetho的那点事相关推荐
- Android 调试神器-Stetho(Facebook出品)的使用
前言 Chrome的Developer Tools对于WEB开发者来讲几乎是一个神器,而Chrome Store里也有无奇不有的插件,如果Chrome能调安卓应用应该是一件美好的事,而Facebook ...
- Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences
Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...
- Stetho简化Android调试(二)
Stetho简化Android调试(一) 一文中讲述了如何使用Stetho结合Chrome远程调试Android App. Stetho给我们调试带来很大的便利,效率显著提升的同时也产生一个问题:如果 ...
- Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)
项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...
- android广播传递参数,Android调试助手(AndroidDebugger)
测试:xxx工,你的程序又出bug了!界面切换几下就不行了. 开发:没道理啊,我都测过好几遍了,应该不会 测试:我这复现好几次了. 开发:拉个Log来分析下啦. 测试:拉取日志命令输入中....... ...
- android调试推荐使用BlueStacks模拟器调试Android应用
在写这篇文章之前,xxx已经写过了几篇关于改android调试主题的文章,想要了解的朋友可以去翻一下之前的文章 BlueStacks是一家印度公司开辟的Android模拟器(或曰仿真器),可以运行在W ...
- Android调试系列之dumpsys命令
Android调试系列之dumpsys命令 版权声明:本文为[viclee]原创,如需转载请注明出处~ https://blog.csdn.net/goodlixueyong/article/deta ...
- Android 系统(249)---Android调试技巧(一)
Android调试技巧(一) 本文介绍一些Android常见的调试技巧 一. 获取Trace 调用栈信息(Trace)是分析异常经常使用的,这里简单划分两类情况: 当前线程Trace: 当前执行流所在 ...
- (转)当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 .
转:http://blog.csdn.net/wangdong20/article/details/20839533 做Android调试的时候经常会遇到,程序写好了,准备接上手机调试,可不一会儿出现 ...
最新文章
- JQuery+CSS3实现封装弹出登录框效果
- 3年,感谢你与几维安全一起经历的风风雨雨
- 使用halcon结合机械XY轴对相机进行9点标定
- java实现社交平台_GitHub - akpaul9527/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...
- OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
- python部分 + 数据库 + 网络编程
- python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
- 服务器虚拟化techtarget技术社区,服务器上的应用程序虚拟化
- 从零开始刷Leetcode——数组(27.35.53)
- Screen Recorder for Mac屏幕录制软件
- 运维之道 | Linux常用网络命令
- 黑莓8330、8830写号,上网,输入法,汉化
- win2003系统的序列号
- kafka-manger监控部署
- Win10触摸板右键无法使用,解决办法
- Python迭代器和生成器详解(包括yield详解)
- 【数据结构】图1——图的基本概念和术语、类型定义
- 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍
- spin_lock浅析
- 仿简书登录框,可删除内容或显示密码框的内容
热门文章
- 做自媒体视频的各种常用工具合集奉上
- Deep Learning with Differential Privacy翻译
- Hadoop安装(比较简单,适合刚入门的小伙伴)
- 六十星系之04太阴独坐巳亥
- 一行中,中间的TextView自适应功能实现(ConstraintLayout)
- 【金融统计】R语言获取股票数据,计算资产组合等权重收益率,与上证380指数收益进行比较
- vue的通信方式有哪些
- EFAK - Kafka可视化管理工具
- 物联网毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)
- 中国人民大学信息学院79级同学聚会感言