在调试安卓程序的过程中,受不了每次看日志查看网络的响应和导出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的建议(干货)

  1. 建立一个单独的productFlavor来集成功能,不要在正式的环境中集成这个东西。会使得应用变得更加庞大,也给应用留下漏洞
    比如在build.gradle建立一个productflavor

     productFlavors {{}
    }
    

    在应用的的main目录中建立一个productFlavor innerteset的目录,然后把,通过清单合并操作中的替换application类的方式重新指定application.

  2. 关于网络的请求中,有的应用的报文是有加解密的。这里需要做一些额外的动作
    修改默认的网络请求拦截类 StethoInterceptor.class,新建的一个类把原来的类文件中东西拷贝出来进行调整
    解密请求的报文,主要是修改内部类OkHttpInspectorRequestbody(),拿到原始报文的,请求体,完成解密动作后重新包装生成一个请求体,给原来的代码使用。下面有一个我在自己应用中使用的实例

      @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的那点事相关推荐

  1. Android 调试神器-Stetho(Facebook出品)的使用

    前言 Chrome的Developer Tools对于WEB开发者来讲几乎是一个神器,而Chrome Store里也有无奇不有的插件,如果Chrome能调安卓应用应该是一件美好的事,而Facebook ...

  2. Android 借助Stetho在Chrome上调试Android网络、数据库、Sharedpreferences

    Android 借助Stetho在Chrome上调试Android网络.数据库.Sharedpreferences 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/a ...

  3. Stetho简化Android调试(二)

    Stetho简化Android调试(一) 一文中讲述了如何使用Stetho结合Chrome远程调试Android App. Stetho给我们调试带来很大的便利,效率显著提升的同时也产生一个问题:如果 ...

  4. Android手游SDK那点事(二)SDK项目结构设计(初版,废弃)

    项目构建 上一个完整架构图 以KSDK为名称模拟项目构建 项目建议: 1.这里游戏sdk不使用mvp或者mmvm的方式,其实这两种模式开发者在开发应用的时候不要盲目的使用,根据自己项目业务情况选择一个 ...

  5. android广播传递参数,Android调试助手(AndroidDebugger)

    测试:xxx工,你的程序又出bug了!界面切换几下就不行了. 开发:没道理啊,我都测过好几遍了,应该不会 测试:我这复现好几次了. 开发:拉个Log来分析下啦. 测试:拉取日志命令输入中....... ...

  6. android调试推荐使用BlueStacks模拟器调试Android应用

    在写这篇文章之前,xxx已经写过了几篇关于改android调试主题的文章,想要了解的朋友可以去翻一下之前的文章 BlueStacks是一家印度公司开辟的Android模拟器(或曰仿真器),可以运行在W ...

  7. Android调试系列之dumpsys命令

    Android调试系列之dumpsys命令 版权声明:本文为[viclee]原创,如需转载请注明出处~ https://blog.csdn.net/goodlixueyong/article/deta ...

  8. Android 系统(249)---Android调试技巧(一)

    Android调试技巧(一) 本文介绍一些Android常见的调试技巧 一. 获取Trace 调用栈信息(Trace)是分析异常经常使用的,这里简单划分两类情况: 当前线程Trace: 当前执行流所在 ...

  9. (转)当android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 .

    转:http://blog.csdn.net/wangdong20/article/details/20839533 做Android调试的时候经常会遇到,程序写好了,准备接上手机调试,可不一会儿出现 ...

最新文章

  1. JQuery+CSS3实现封装弹出登录框效果
  2. 3年,感谢你与几维安全一起经历的风风雨雨
  3. 使用halcon结合机械XY轴对相机进行9点标定
  4. java实现社交平台_GitHub - akpaul9527/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...
  5. OpenCV学习笔记(十二):边缘检测:Canny(),Sobel(),Laplace(),Scharr滤波器
  6. python部分 + 数据库 + 网络编程
  7. python数据挖掘笔记】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取
  8. 服务器虚拟化techtarget技术社区,服务器上的应用程序虚拟化
  9. 从零开始刷Leetcode——数组(27.35.53)
  10. Screen Recorder for Mac屏幕录制软件
  11. 运维之道 | Linux常用网络命令
  12. 黑莓8330、8830写号,上网,输入法,汉化
  13. win2003系统的序列号
  14. kafka-manger监控部署
  15. Win10触摸板右键无法使用,解决办法
  16. Python迭代器和生成器详解(包括yield详解)
  17. 【数据结构】图1——图的基本概念和术语、类型定义
  18. 音视频处理基础知识扫盲:数字视频YUV像素表示法以及视频帧和编解码概念介绍
  19. spin_lock浅析
  20. 仿简书登录框,可删除内容或显示密码框的内容

热门文章

  1. 做自媒体视频的各种常用工具合集奉上
  2. Deep Learning with Differential Privacy翻译
  3. Hadoop安装(比较简单,适合刚入门的小伙伴)
  4. 六十星系之04太阴独坐巳亥
  5. 一行中,中间的TextView自适应功能实现(ConstraintLayout)
  6. 【金融统计】R语言获取股票数据,计算资产组合等权重收益率,与上证380指数收益进行比较
  7. vue的通信方式有哪些
  8. EFAK - Kafka可视化管理工具
  9. 物联网毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)
  10. 中国人民大学信息学院79级同学聚会感言