不是有位大神说过学习编码的最好途径就是:Read the fucking source
code。工欲善其事,必先利其器。今天我们先把源码弄下来吧!
Okhttp3.14.x
一 okhttp3源码
1.1 源码版本说明
github源码地址
源码分支4.x后使用kotlin
后续文章分析使用okhttp_3.14.x分支
Okhttp是使用Maven构建
1.2 源码编译
1.2.1 编译平台
系统:ubuntu14.04
IDE:IntelliJ IDEA
JDK:openjdk version “1.8.0_222”
1.2.2 工具选择
Okhttp3 工程不是Android工程,不要用Android Studio打开,不要用Android Studio打开,不要用Android Studio打开。
查看此源码的最好工具是IntelliJ IDEA。下载、安装IntelliJ IDEA请自行研究,没有什么难的。
1.2.3 导入源码
打开IDEA(第一次需要选在是否导入已存在的配置,按需选择),点击Import Project—进入源码现在目录—点击pom.xml文件,一直next下去—finish(如需修改工程名字,在finish界面修改即可),等待IDEA导入所需的依赖包,此过程有点长,亲试编译差不多用了半小时。
导入成功后是这样的:
1.2.4 项目结构
1.mockwebserver — 模拟服务器,有用
2.okhttp — 源码
3.okhttp-logging-interceptor — 日志拦截器,可以自己实现的
4.okhttp-urlconnection — 连接方式,用不上
我们主要研究的是okhttp源码,负责项目mockwebserver,其他目前没用。
二 okhttp3遇到的问题
2.1 首次编译okhttp工程报version错误
问题描述:
原因:
这是因为okhttp的版本号是自动生成的,Version.java不在src文件夹下,我们要自动添加。
解决方法:
选中okhttp工程,右键-open module settings
2.2 AndroidPlatform.java平台相关报错
原因:
主要是Android sdk没有引入,此处使用的是4.1.1.4的sdk,在pom.xml中可以查看。
解决方法:
引入相关的Android sdk
如果实在无能导入(原因你懂的)把AndroidPlatform.java中的
public void log(int level, String message, Throwable t) {
// 里面的语句注释掉,此处使用了Log,没有任何影响,再次编译即可
}
2.3 Android10Platform.java相关报错
public void configureTlsExtensions(
SSLSocket sslSocket, String hostname, List<Protocol> protocols) throws IOException {
try {
......
//需要使用java11
//sslParameters.setApplicationProtocols(protocolsArray);
......
} catch (IllegalArgumentException iae) {
......
}
}
public @Nullable String getSelectedProtocol(SSLSocket socket) {
//需要使用java11
// String alpnResult = socket.getApplicationProtocol();
//
// if (alpnResult == null || alpnResult.isEmpty()) {
// return null;
// }
//
// return alpnResult;
return null;
}
因为我的JDK环境是java8,需要java11,所以这编译不过去,暂时注掉了,不影响源码编译。
2.4 JDK相关报错
问题描述:
IntelliJ中无编译错误,运行测试时报错:java: javacTask: source release 8 requires target release 1.8
原因:
需要使用jdk1.8
解决方案:
将目标字节码版本设为1.8。
2.5 run的时候没有可选择的module
操作步骤:
具体操作:Edit Configurations
在左上角添加一个Application,然后设置,如图所示: