前言
本文仅供学习探讨之用,如果侵犯了您的权益请联系我删除。
需求背景
使用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
版本,然后打包。
结语
那就这样了,有缘再见~