Cronet库编译

Cronet为Chrome开源项目Chromium的网络模块,此网络库支持HTTP,HTTPS,SPDY,QUIC,HTTP2.0 等协议。
编译Cronet库需要先获取Chromium项目,编译过程比较繁琐,而且Chromium项目比较大,总计19.5GB,google项目需要vpn。

Chromium项目的获取

  • 1.1首先需要获取depot_tools

    此工具在后续编译的时候会用到,安装步骤:

    • 1.1.1 克隆至本地(文件路径自定义)
      git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    • 1.1.2 添加路径至.bash_profile(xxx为depot_tools克隆的文件路径)
      export PATH=”$PATH:xxx/depot_tools”
      注意:此处的xxx路径不能使用“ ~/ ”,否则会报错,“ ~ ”字符串冲突。
  • 1.2获取Chromium项目

    步骤如下:

    • 1.2.1 创建文件夹 chromium
      mkdir chromium && cd chromium
    • 1.2.2 获取项目 (fetch 即为depot_tools中工具)
      fetch —nohooks ios
      这里使用—nohooks是因为不要在获取完项目后直接进行其他依赖更新,一步一步来(当然出现问题解决完 也可以使用gclient sync继续获取)
    • 1.2.3 同步更新
      进入src文件夹执行更新命令
      gclient sync
1.2.2获取项目过程中存在的问题点如下:
  • 1.Git error:

    1
    2
    3
    4
    RPC failed; curl 56 LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
    fatal: the remote end hung up unexpectedly
    fatal: early EOF
    fatal: index-pack failed

    原因:Git pull or push过大文件造成的错误
    解决方法:
    修改git配置项(500MB取值可变)
    git config –global http.postBuffer 524288000

  • 2.Git error:

    1
    2
    3
    fatal: the remote end hung up unexpectedly xxx
    fatal: early EOF
    fatal: index-pack failed

    原因:存在大文件需要压缩,需要配置压缩项
    解决方法:(ompression取值范围:-1~9,可参见:https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-config.html)
    git config –global –add core.compression -1

1.2.3同步时存在的问题点:
  • 1.ssl验证错误
    Python2.7.9 之后,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书。而当目标网站使用的是自签名的证书时就会抛出如下异常
    <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>

    解决方法:
    全局取消证书验证

    1
    2
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context

    文件名如下:

    1
    2
    vpython src/third_party/depot_tools/download_from_google_storage.py
    vpython src/third_party/depot_tools/gsutil.py
  • 1.3构建Cronet

    • 1.3.1链接cr_cronet.py脚本文件
      此时所在文件位置为:xxx/chromium/src
      ln -s ./components/cronet/tools/cr_cronet.py xxx/chromium/src

    • 1.3.2构建环境
      cr_cronet.py gn 即创建默认的构建环境(默认是模拟器的Debug版本)
      这里构建真机发布版本:
      cr_cronet.py gn -i -r
      此时在out/目录下会生成Release-iphoneos文件夹
      ninjia -C out/Release-iphoneos cronet_package

      编译完成后
      在out/Release-iphoneos目录下生成framework文件
      Cronet.framework — 4.7MB
      在out/Release-iphoneos/Static目录下生成静态framework文件
      Cronet.framework — 24.2MB
      在out/Release-iphoneos/obj/components/cronet/ios目录下生成三个.a文件
      libcronet.a — 24.1MB
      libcronet_static.a — 1.4MB
      libcronet_deps_complete.a — 249MB

      Android 库:
      out/Release-iphoneos/lib.java/components/cronet/android/ 所有 jar 包在此目录下,一般不用;
      out/Release-iphoneos/cronet/ 需要使用cronet库的java API的so、jar包;
      out/Release-iphoneos/libcronet.77.0.3825.0.so,strip 后的库,6M;
      out/Release-iphoneos/lib.unstripped,未 strip 的库在此目录下,50.9M;
      out/Release-iphoneos/gen/components/cronet/android/cronet_jni_registration.h,该文件便是自动生成的JNI头文件

      以上脚本默认架构为arm64 如果需要其他架构,需要修改cr_cronet.py脚本cpu对应的参数
      直接修改脚本文件方式欠妥,执行命令动态修改cpu参数即可:
      在创建构建环境后,执行命令
      gn args

      使用:
      gn args out/Release-iphoneos
      在弹出来的文件编辑器里边修改target_cpu参数即可,参数可能取值(使用命令gn help target_cpu查看):
      “arm”,“arm64”,“x86”,“x64”,“mipsel”
      目前想要支持多架构,只能手动合成多架构版本。

关于log:
开启CronetLog模块:
[Cronet startNetLogToFile:[self currentNetLogFileName] logBytes:NO];
[Cronet stopNetLog];
因为Log是json格式,需要主动结束以保证其完整性。
可以使用 https://netlog-viewer.appspot.com/#import 分析Log,也可以使用Chrome扩展程序 Chromium NetLog dump viewer

参考链接:

https://chromium.googlesource.com/chromium/src/+/master/components/cronet/ios/docs/BUILD.md
https://chromium.googlesource.com/chromium/src/+/master/components/cronet/build_instructions.md