前提
最近一段时间,线上有一个偶现问题被报给客户端,这个问题比较难复现。经过代码调试验证,发现大概率可能是接口数据的问题,为了最准确的定位问题,最终决定用Charles抓包来进行问题定位。但是之前没接触过这个, 所以只能自己慢慢摸索了。

手机端安装证书
1. 以Mac电脑为例,打开电脑端Charles, 首先设置抓包端口,这里设置为 28888。

2. 做完这一步,好了,已经有一个完美的开始了。

接下来我们来看看我们电脑的本地IP是多少:

3. 下面我们就开始在手机端操作,保证手机和电脑连接的是同一个Wifi. 设置手机端的代理:
ip地址设置为电脑的局域网ip: 192.168.3.167
端口号为我们第一步设置的端口:28888
设置结束后,保存即可。

4. 进行 charles 证书安装。这一步可能会遇到问题,我是卡在这一段时间, 官网的方法是在浏览器输入:chls.pro/ssl。但是发现根本不会自动下载 charles 的代理证书啊。

研究了一下之后,发现 charles 给我们开了一个后门,那就是导出电脑 CA 证书,
Charles -> Help -> SSL Proxying -> Save Charles Root Certificate...

将证书保存到本地后, 通过 Android Studio 导入到手机, 记得自己的放入位置。

然后进行证书安装。
5. charles-ssl-proxying-certificate.pem 导入之后, 我们进入到下面的界面:
设置 -> 安全 -> 更多安全设置 -> 加密和凭证 -> 从存储设备安装
点击左上角按钮, 选择我们刚才放置 pem 证书的位置。点击安装。

选择WLAN (如果不可以,可以再选择 VPN和应用)。安装完,我们就可以在用户凭据里面看到。也可以在受信任凭据里面的用户Tab 查看到。
6. 接下来,我们需要在我们的工程里面做一点小小的设置(`因为 Android 7.0之后,默认不能对APP的https请求进行抓包`)。
在app的res目录下新建xml文件夹, 新建一个network_security_config.xml
<?xml version="1.0" encoding="utf-8"?><network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="user"/><certificates src="system"/></trust-anchors></base-config></network-security-config>
接下来还需要在AndroidManifest.xml中配置android:networkSecurityConfig属性来让上述配置生效:
<application...android:networkSecurityConfig="@xml/network_security_config">...</application>
做完上面的步骤,我们就可以开心的进行抓包啦!

总结
经过一系列的折腾和抓包,最终定位了问题出在CDN解析的地方。也算是完美的甩了一锅。生命在于折腾,让我们继续接下来的冒险之旅吧。




