0x1、导言
上星期五版本刚提测,这周边改BUG边摸鱼,百无聊赖,想起前不久没业务需求时,随手写的Android抓包库。
就 公司的APP集成了 抓包功用,目的是:便利非Android开发的搭档在 接口联调和测试阶段 能够看到APP的恳求日志,进行一些简单的问题定位(如接口字段错误返回,导致APP UI显示异常),不必动不动就来找Android崽~
手机摇一摇,就能检查 APP发起的恳求列表 及 具体的恳求信息:
能用,但存在一些问题,先是 代码层面:
- 耦合:抓包代码直接硬编码在项目中,线上包不需求抓包功用,也会把这部分代码打包到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试试康~
虽然编译后的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 标签单独创建一个桌面图标,作为抓包页面入口,点击图标即可进入抓包页~
当然,有时或许需求自动跳转抓包页,比如我司便是摇一摇翻开,依旧是反射,代码示例如下:
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、恳求列表页
点击桌面的卡比兽图标即可进入恳求列表页:
能够看到恳求相关的一些基础信息,工具栏的两个按钮:
- 垃圾桶:清空恳求记载
- 设置:进入设置页
设置页便是一些默许设置,接着点击 恳求列表 四个大字,能够翻开 URL过滤,比如过滤article :
点击撤销能够封闭过滤功用,点击列表项,会跳转到恳求信息页~
2、恳求信息页
左边是恳求相关信息,右侧是呼应相关信息
3、点击复制 & 长按查找
恳求/呼应头、恳求/呼应体支持 点击复制到剪切板
不过TextView本身就自带 双击选取文本,接着点击 长按,能够对当时文本进行查找:
点击上下箭头能够查找前一个或后一个匹配项,默许 字符串全匹配(疏忽大小写) ,工具栏的两个按钮:
- Aa:不疏忽大小写
- .* :敞开正则匹配
大约的用法就这些,后续再补个库的开发记载吧,欢迎Star体会,有问题或主张能够提issues,感谢~