0x1、导言

上星期五版本刚提测,这周边改BUG边摸鱼,百无聊赖,想起前不久没业务需求时,随手写的Android抓包库。

花亿点时间,写个Android抓包库

就 公司的APP集成了 抓包功用,目的是:便利非Android开发的搭档在 接口联调和测试阶段 能够看到APP的恳求日志,进行一些简单的问题定位(如接口字段错误返回,导致APP UI显示异常),不必动不动就来找Android崽~

手机摇一摇,就能检查 APP发起的恳求列表具体的恳求信息

花亿点时间,写个Android抓包库

能用,但存在一些问题,先是 代码层面

  • 耦合:抓包代码直接硬编码在项目中,线上包不需求抓包功用,也会把这部分代码打包到APK里
  • 复用性差:其它APP想增加抓包功用,需求手动CV大量代码…
  • 安全:是否启用抓包功用,经过 BuildConfig.DEBUG 来判断,二次打包修正AndroidManifest.xml文件增加 android:debuggable=”true” 或者 root手机后修正ro.debuggable为1 设置手机为可调试形式,生产环境的接口恳求一览无余。

当然,上面的安全性有点 夸大 了,编译时,编译器会进一步优化代码,或许 会删去未运用的变量或代码块。比如这样的代码:

if (BuildConfig.DEBUG) {
    xxx.setBaseUrl(Config.DEBUG_BASE_URL);
} else {
    xxx.setBaseUrl(Config.RELEASE_BASE_URL);
}

Release打包,BuildConfig.DEBUG永远为false,编译器会优化下代码,编译后的代码或许就剩这句:

xxx.setBaseUrl(Config.RELEASE_BASE_URL);

不信的读者能够设置 minifyEnabled true 后打包,反编译自己的APP试试康~

花亿点时间,写个Android抓包库

虽然编译后的Release包不包含 启用抓包的代码,但是把抓包代码打包到APK里,始终是不妥的。

究竟,反编译apk,smail加个启用抓包的代码,并不是什么难事,最好的处理方法还是不要把抓包代码打包到Release APK中!

接着说说 实用性层面

  • 恳求相关信息太少:只要URL、恳求参数和呼应参数这三个数据,状态码都没有,有时需求看下恳求头或呼应头参数。
  • 只能看不能复制:有时需求把恳求参数发给后端。
  • 字段查找全赖肉眼扫:恳求/呼应Json很长的时分,看到眼花‍。
  • 不支持URL过滤: 执行一个操作,唰唰唰一堆恳求,然后便是滑滑滑,肉筛URL。
  • 恳求记载不会动态更新,要看新恳求得封闭页面再翻开。
  • 等等

综上,还是有必要完善下这个库的,究竟也是能 进步团队研制功率的一小环~

上面说的天花龙凤,其实没啥技术难点,库的实质便是

自定义一个okhttp拦截器获取恳求相关信息然后进行一系列功用封装 罢了。

所以:库不支持HttpUrlConnection、Flutter、其它协议包的抓取!!!

它的定位仅仅:便利非Android崽,检查公司APP的恳求日志。 像笔者就不需求这个,电脑直接看不香么~

如果是 Android崽或者愿意折腾,想抓手机一切APP包 的朋友,能够参考下面两篇文章:

  • 手机已root:《Python爬虫从入门到入狱》学习札记
  • 手机未root:《用两仪进行免 ROOT 抓包》

接着介绍下怎么集成这个库,以及一些运用小技巧~

0x2、库的集成

1、增加依靠

// 根目录的build.gradle 增加 JitPack的Maven库房
maven { url 'https://jitpack.io' }
// 增加依靠
debugImplementation 'com.github.coder-pig:CpNetworkCapture:0.0.11'

抓包库应该只在 调试阶段 起作用,所以这里运用debugImplementation,即库不参加release包的打包进程。当然,你硬要implementation也是能够的

2、增加拦截器

我也想让你完全无侵入地运用这个库,但是抱歉,做不到,你仍需求 手动增加一个拦截器,并且是运用 反射的方法 代码示例如下:

// 反射获取抓包拦截器类实例初始化
var captureInterceptor: Interceptor? = null
try {
    val clazz = Class.forName("cn.coderpig.cp_network_capture.interceptor.CaptureInterceptor")
    val constructor = clazz.getDeclaredConstructor()
    captureInterceptor = constructor.newInstance() as Interceptor
} catch (e: Exception) {
    e.printStackTrace()
}
val builder = OkHttpClient.Builder()
// 抓包拦截器不为null,增加拦截器
captureInterceptor?.let { builder.addInterceptor(it) }
//...
builder.build()

想省去这一步的话,能够运用 ASM,不过这玩意一堆坑,得花不少时间折腾,我是懒的搞,感兴趣想搞能够参考下这个库房:lygttpod/AndroidMonitor

3、跳转抓包页

利用 activity-alias 标签单独创建一个桌面图标,作为抓包页面入口,点击图标即可进入抓包页~

花亿点时间,写个Android抓包库

当然,有时或许需求自动跳转抓包页,比如我司便是摇一摇翻开,依旧是反射,代码示例如下:

 try {
    Class<?> clazz = Class.forName("cn.coderpig.cp_network_capture.ui.activity.NetworkCaptureActivity");
    Intent starter = new Intent(mContext, clazz);
    starter.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(starter);
} catch (Exception e) {
    e.printStackTrace();
}

0x3、库的运用

1、恳求列表页

点击桌面的卡比兽图标即可进入恳求列表页:

花亿点时间,写个Android抓包库

能够看到恳求相关的一些基础信息,工具栏的两个按钮:

  • 垃圾桶:清空恳求记载
  • 设置:进入设置页

花亿点时间,写个Android抓包库

设置页便是一些默许设置,接着点击 恳求列表 四个大字,能够翻开 URL过滤,比如过滤article

花亿点时间,写个Android抓包库

点击撤销能够封闭过滤功用,点击列表项,会跳转到恳求信息页~

2、恳求信息页

左边是恳求相关信息,右侧是呼应相关信息

花亿点时间,写个Android抓包库

3、点击复制 & 长按查找

恳求/呼应头、恳求/呼应体支持 点击复制到剪切板

花亿点时间,写个Android抓包库

不过TextView本身就自带 双击选取文本,接着点击 长按,能够对当时文本进行查找:

花亿点时间,写个Android抓包库

点击上下箭头能够查找前一个或后一个匹配项,默许 字符串全匹配(疏忽大小写) ,工具栏的两个按钮:

  • Aa:不疏忽大小写
  • .* :敞开正则匹配

大约的用法就这些,后续再补个库的开发记载吧,欢迎Star体会,有问题或主张能够提issues,感谢~