前言

本文仅供学习探讨之用,如果侵犯了您的权益请联系我删除。

需求背景

使用UnrealEngine4.18.3版本打包Android APP的时候报错:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project ''.
> Could not resolve all dependencies for configuration ':classpath'.
   > Could not find com.android.tools.build:gradle:2.2.2.
     Searched in the following locations:
         https://jcenter.bintray.com/com/android/tools/build/gradle/2.2.2/gradle-2.2.2.pom
         https://jcenter.bintray.com/com/android/tools/build/gradle/2.2.2/gradle-2.2.2.jar
     Required by:
         ::unspecified

打开https://jcenter.bintray.com/com/android/tools/build/gradle/一看发现2.2.2版本已经没了,于是打算用Fiddler代理一下gradle的请求,然后把请求地址给替换成2.3.0版本的地址。

设置Gradle代理

打开C:\Users\{你的用户名}\.gradle\gradle.properties,添加以下内容:

# 设置为Fiddler的代理地址
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8888
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8888

测试

打包测试一下出现以下报错:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project ''.
> Could not resolve all dependencies for configuration ':classpath'.
   > Could not resolve com.android.tools.build:gradle:2.2.2.
     Required by:
         ::unspecified
      > Could not resolve com.android.tools.build:gradle:2.2.2.
         > Could not get resource 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.2.2/gradle-2.2.2.pom'.
            > Could not GET 'https://jcenter.bintray.com/com/android/tools/build/gradle/2.2.2/gradle-2.2.2.pom'.
               > PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Java使用的是自己的证书库,而不是系统证书库(Fiddler安装证书是安装到系统证书库的),所以需要把Fiddler的证书导入到Java的证书库中。

导入证书

打开Fiddler,点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop,导出证书。

然后在JDK/JRE文件夹的bin目录里打开powershell,或者直接打开控制台然后cd切换到bin目录也行。

然后执行命令:

  • ./keytool -import -alias fiddler -keystore ../lib/security/cacerts -file {刚才导出的FD证书的路径}

提示输入密钥库口令:,默认是changeit,输入changeit

提示是否信任此证书? [否]:,输入y

抓包测试

重新打包,可以看到请求已经成功抓取到了。

抓包成功

替换请求地址

点击Rules -> Customize Rules,在打开的文件里搜索OnBeforeRequest,在OnBeforeRequest方法里添加以下代码:

if (-1 !== oSession.url.indexOf("tools/build/gradle/2.2.2")) {
   var replacedUrl = oSession.url.Replace("2.2.2", "2.3.0");
   FiddlerApplication.Log.LogFormat("[=] Gradle replace {0} -> {1}", oSession.url, replacedUrl);
   oSession.url = replacedUrl;
}

Ctrl + S保存之后重新打包测试,可以看到请求地址已经成功替换了。

替换成功

打包日志:

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project ''.
> Could not resolve all dependencies for configuration ':classpath'.
   > Could not resolve com.android.tools.build:gradle:2.2.2.
     Required by:
         ::unspecified
      > Could not resolve com.android.tools.build:gradle:2.2.2.
         > inconsistent module metadata found. Descriptor: com.android.tools.build:gradle:2.3.0 Errors: bad version: expected='2.2.2' found='2.3.0'

可以看到虽然请求地址已经替换和正确请求了,但是打包还是报错了,过不了2.2.2版本的校验。

题外

正确做法应该是通过修改{UnrealEngine引擎目录}\Engine\Build\Android\Java\gradle目录中的模板文件来实现,比如修改build.gradle文件,把2.2.2版本替换成2.3.0版本,然后打包。

结语

那就这样了,有缘再见~