/
/
public static final
class
Builder
public static Okhttp3FakeClass okHttpClientBuilderCheck(Class clz) {
/
/
java.net.Proxy proxy;
boolean hasProxyField
=
false;
/
/
java.net.ProxySelector proxySelector;
boolean hasProxySelectorField
=
false;
/
/
javax.net.SocketFactory socketFactory;
boolean hasSocketFactoryField
=
false;
/
/
javax.net.ssl.SSLSocketFactory sslSocketFactory;
boolean hasSSLSocketFactoryField
=
false;
/
/
javax.net.ssl.HostnameVerifier
boolean hasHostnameVerifierField
=
false;
/
/
public Builder sslSocketFactory(javax.net.ssl.SSLSocketFactory
/
/
sSLSocketFactory)
boolean hasSslSocketFactoryMethod
=
false;
String sslSocketFactoryMethodName
=
null;
/
/
public Builder sslSocketFactory(javax.net.ssl.SSLSocketFactory
/
/
sSLSocketFactory, javax.net.ssl.X509TrustManager x509TrustManager)
boolean hasSslSocketFactory2Method
=
false;
String sslSocketFactoryMethod2Name
=
null;
try
{
String className
=
clz.getName();
if
(clz.isInterface() || clz.isArray() || clz.isAnnotation() || clz.isEnum()
|| className.startsWith(
"java."
) || className.startsWith(
"android"
) || className.startsWith(
"com"
)
|| !className.contains(
"$"
)) {
/
/
XLog.appendText(
"okHttpClientBuilderCheck 111"
);
return
null;
}
/
/
校验 public static final
class
Builder 类声明
if
(!Modifier.isFinal(clz.getModifiers()) || !Modifier.isPublic(clz.getModifiers())
|| !Modifier.isStatic(clz.getModifiers())) {
/
/
XLog.appendText(
"okHttpClientBuilderCheck 222"
);
return
null;
}
Field[] fields
=
clz.getDeclaredFields();
for
(Field field : fields) {
String fieldClassName
=
field.getType().getName();
if
(
"java.net.Proxy"
.equals(fieldClassName)) {
hasProxyField
=
true;
}
else
if
(
"java.net.ProxySelector"
.equals(fieldClassName)) {
hasProxySelectorField
=
true;
}
else
if
(
"javax.net.SocketFactory"
.equals(fieldClassName)) {
hasSocketFactoryField
=
true;
}
else
if
(
"javax.net.ssl.SSLSocketFactory"
.equals(fieldClassName)) {
hasSSLSocketFactoryField
=
true;
}
else
if
(
"javax.net.ssl.HostnameVerifier"
.equals(fieldClassName)) {
hasHostnameVerifierField
=
true;
}
}
Method[] methods
=
clz.getDeclaredMethods();
for
(
int
i
=
0
; i < methods.length; i
+
+
) {
Method method
=
methods[i];
/
/
如果方法非public或static方法直接
continue
if
(!Modifier.isPublic(method.getModifiers()) || Modifier.isStatic(method.getModifiers())) {
continue
;
}
/
/
校验方法返回值为Builder自己
if
(!clz.equals(method.getReturnType())) {
continue
;
}
Class<?>[] parameterTypes
=
method.getParameterTypes();
int
parameterCount
=
parameterTypes.length;
if
(parameterCount
=
=
1
) {
if
(
"javax.net.ssl.SSLSocketFactory"
.equals(parameterTypes[
0
].getName())) {
hasSslSocketFactoryMethod
=
true;
sslSocketFactoryMethodName
=
method.toString();
}
}
else
if
(parameterCount
=
=
2
) {
Class parameter0Clz
=
parameterTypes[
0
];
Class parameter1Clz
=
parameterTypes[
1
];
if
(
"javax.net.ssl.SSLSocketFactory"
.equals(parameter0Clz.getName())
&&
"javax.net.ssl.X509TrustManager"
.equals(parameter1Clz.getName())) {
hasSslSocketFactory2Method
=
true;
sslSocketFactoryMethod2Name
=
method.toString();
}
}
}
} catch (Throwable e) {
/
/
XLog.appendText(new Exception(e));
}
/
/
7
项核心指标全部达标,我们可以判断这个类就是okhttp3.OkHttpClient$Builder的混淆类了
if
(hasProxyField && hasProxySelectorField && hasSocketFactoryField && hasSSLSocketFactoryField
&& hasHostnameVerifierField) {
/
/
返回混淆的类名和方法名
Okhttp3FakeClass okhttp3FakeClass
=
new Okhttp3FakeClass(
"okhttp3.OkHttpClient$Builder"
, clz.getName());
if
(hasSslSocketFactoryMethod && hasSslSocketFactory2Method) {
okhttp3FakeClass.addFakeMethod(new FakeMethod(
"public okhttp3.OkHttpClient$Builder okhttp3.OkHttpClient$Builder.sslSocketFactory(javax.net.ssl.SSLSocketFactory)"
,
sslSocketFactoryMethodName));
okhttp3FakeClass.addFakeMethod(new FakeMethod(
"public okhttp3.OkHttpClient$Builder okhttp3.OkHttpClient$Builder.sslSocketFactory(javax.net.ssl.SSLSocketFactory,javax.net.ssl.X509TrustManager)"
,
sslSocketFactoryMethod2Name));
}
return
okhttp3FakeClass;
}
return
null;
}