之前介绍了『Fiddler Everywhere』和『Reqable』两款应用在手机上的抓包流程,最近我在使用 Flutter 开发 HarmonyOS 应用,调试的时候发现,即使我配置了系统代理,它始终都无法抓包,而使用原生 ArkTS 开发的应用却可以抓包成功。

经过一番了解之后才知道,原因在于 Dart 语言标准库的网络请求不会走 Wi-Fi 代理,常规通过配置 Wi-Fi 代理来抓包的方式行不通。这给我们日常开发测试造成了很大的阻碍,严重降低工作效率。

虽然说配置方法变了,倒不至于说非常复杂,只需在代码中指定代理地址即可。

以我们项目中使用的 Dio 库为例:

class HttpUtils {
  ...
  final Dio dio = Dio();
  void init() {
    ...
    if (proxy) {
      (dio.httpClientAdapter as IOHttpClientAdapter).createHttpClient = () {
        final client = HttpClient();
        client.findProxy = (url) => 'PROXY 192.168.1.142:9000'; // 代理地址
        client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
        return client;
      };
    }
  }
}

除了指定代理地址,这里还禁用 HTTPS 证书校验:这是一个回调函数,正常情况下用于验证服务器证书是否可信。返回 true 表示无条件信任所有证书,即使证书无效或过期也不拦截。

把代理地址硬编码在项目中显然不利于协作开发,而且还会污染版本管理,因此最好有一种方式来动态配置代理地址,于是我就仿造系统 Wi-Fi 代理配置的方式,顺手写了个 UI,这样每一位开发或者测试人员就可以直接在手机上配置了。