Cronet 库是谷歌开发的移动端网络库。支持 HTTP、HTTP/2 以及 QUIC 协议。支持 Android 和 iOS 平台。 其编译工具是 gn 和 ninja,类似于 cmake 与 make 的关系。 下面介绍 Cronet 库的编译及编译注意事项。
1、获取源码
iOS 的必须在 mac 下编译,Android 必须要 linux 平台下编译。源码获取细节具体参考此博客Get Chromium source code。
- 1.1 安装 depot_tools 工具 在任意目录下载 depot_tools 源码,并将该项目根目录添加到 PATH,从而可以使用其工具比如 fetch。
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
- 1.2 拉取 chromium 源码 这里需要区分是拉取 Android 平台的,还是 iOS 平台的。
mkdir chromium
fetch --no-history --nohooks android # fetch --no-history ios
此时 chromium 目录会生成一个 '.gclient' 隐藏文件,若中间拉取失败,可以执行 gclient sync 继续拉取, 拉取结束后,该目录会生成一个 src 目录,包含 cronet 源码。
2、编译
编译环境要求:
- Linux:python 2.7.5,及 openjdk 8,较高版本由于接口不兼容需避免使用。
- Mac: python 2.7.5,openjdk 8,以及 xcode。 进入 chromium/src 目录,执行下面命令,
./components/cronet/tools/cr_cronet.py gn --out_dir=out/Cronet # 生成 ninja 文件
ninja -C out/Cronet cronet_package # 输入 ninja 文件执行编译,必须指定为 cronet_package
若要编译 cronet 库的 Release 版本,在生成 ninja 文件时需要添加 '--release' 选项。 另外 iOS 版本会区分模拟器和真机,区别是 cpu 架构不一样,模拟器使用 x86 架构,真机使用的 ARM 架构。 上述 cr_cronet.py 命令默认生成模拟器版本的库,生成真机的库需要添加 '-i' 选项,同时必须具有 iOS 开发者证书,并在 xcode 中配置好, 生成真机的 Release 库,使用如下命令:
./components/cronet/tools/cr_cronet.py gn -i --release --out_dir=out/Cronet-iphoneos-release
3、生成的文件
iOS 库:
- out/Debug-iphonesimulator/obj/components/cronet/ios/libcronet.a, 大小为 89M;
- out/Debug-iphonesimulator/obj/components/cronet/ios/libcronet_static.a, 大小为 17M;
- out/Debug-iphonesimulator/obj/components/cronet/ios/libcronet_deps_complete.a,大小为 1G。
Android 库:
- out/Cronet-android/lib.java/components/cronet/android/ 所有 jar 包在此目录下;
- out/Cronet-android/libcronet.77.0.3825.0.so,strip 后的库,6M;
- out/Cronet-android/lib.unstripped,未 strip 的库在此目录下。
这里 strip 掉的主要应该是 debug info,具体 strip 内容暂不清楚。
4、错误记录
- 无 iOS 开发者证书,编译真机库失败。
