使用 androiddeployqt 为 android 构建 Qt 应用程序时出现 Gradle 构建错误

Posted

技术标签:

【中文标题】使用 androiddeployqt 为 android 构建 Qt 应用程序时出现 Gradle 构建错误【英文标题】:Gradle build error while building Qt app for android using androiddeployqt 【发布时间】:2016-10-07 21:32:00 【问题描述】:

我有一个用于 android 的 Qt 应用程序,我使用 shell 脚本在命令行构建它。我想使用gradle。所以我在安装步骤中使用了以下命令。

androiddeployqt --sign mykey.keystore --storepass mypassword --output android-build --verbose --gradle --input MyApp/myapplib.so-deployment-settings.json

我在使用 gradle 2.2.1 时遇到了问题。因此,我通过下载 gradle 3.1 更新了我的 gradle 包装器。但是在运行命令 gradle 时似乎仍然在尝试下载 2.2.1 并给出以下错误。

Pregenerating entry list for assets file engine.
Downloading https://services.gradle.org/distributions/gradle-2.2.1-all.zip

Exception in thread "main" java.net.UnknownHostException: services.gradle.org
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)
    at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:173)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
    at     sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Abs    tractDelegateHttpsURLConnection.java:200)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1124)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:999)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1513)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at org.gradle.wrapper.Download.downloadInternal(Download.java:58)
    at org.gradle.wrapper.Download.download(Download.java:44)
    at org.gradle.wrapper.Install$1.call(Install.java:61)
    at org.gradle.wrapper.Install$1.call(Install.java:48)
    at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:69)
    at org.gradle.wrapper.Install.createDist(Install.java:48)
    at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:107)
    at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
Building the android package failed!

谁能指出我怎样才能摆脱这个错误并使用 gradle 构建我的 Qt 应用程序?

【问题讨论】:

浏览至:your_project/gradle/wrapper,编辑文件 gradle-wrapper.properties 并确保“distributionUrl”指向您打算使用的正确 Gradle 版本。 @ItaiGanot。感谢您的关注。我已经设置为 3.1 - distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip 但是,它仍然试图获得 2.2.1。不知道为什么,是否有一些缓存需要清除?或者我可以通过某种方式强制进行干净的构建? 是的,如果您没有明确设置变量“GRADLE_USER_HOME”,那么您的 gradle 用户主页 vy 默认为:~/.gradle(在 linux/mac os 中)或/Users/username/gradle 在 Windows 中,浏览那里并删除名为“缓存”的文件夹,然后重试,请告诉我它是如何为您工作的。 我在 Mac OS 上。我删除了~/.gradle 文件夹。但这无济于事。我已将分发 url 明确设置为 3.1。现在将 GRADLE_USER_HOME 定义为显式文件夹以进行更好的控制。但徒劳无功!!真的很奇怪。 在你的项目目录中,运行:gradle wrapper,让它生成新的 Gradle Wrapper 文件,然后重试告诉我 【参考方案1】:

窗口

在环境变量中使用以下值设置新变量“_JAVA_OPTIONS”

-Dhttp.proxyHost=192.168.0.1 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=1234 -Dhttp.proxyPassword=5678 -Dhttps.proxyHost=192.168.0.1 -Dhttps.proxyPort=8080 -Dhttps.proxyUser=1234 -Dhttps.proxyPassword=5678

Unix

export _JAVA_OPTIONS="-Dhttp.proxyHost=192.168.0.1 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=1234 -Dhttp.proxyPassword=5678 -Dhttps.proxyHost=192.168.0.1 -Dhttps.proxyPort=8080 -Dhttps.proxyUser=1234 -Dhttps.proxyPassword=5678"

【讨论】:

【参考方案2】:

第一个:更正 QT 的构建设置/构建环境中的一些无效变量(即错误的斜杠是 / 而不是 )...并添加一些。具体来说:

ANDROID_HOME = D:\Android-SDK
ANDROID_SDK_ROOT = D:\Android-SDK
GRADLE_USER_HOME = C:\Users\pc\.gradle
JAVA_HOME = D:\Program Files\Java\jdk1.8.0_201

(显然这些需要为您的安装目录更新。即通常在 C: 驱动器上)

注意:我在 Windows 环境设置中指定了这些,但似乎需要在 QT 的环境覆盖中专门设置它们。

第二次:通过 Android Studio SDK 管理器从 Android SDK 构建工具中删除 29.0.0RC1。申请。 选择“显示包详细信息”,然后可以选择 28.0.3 版本。申请。

第 3 次:进入 QT 项目/应用程序的文件夹并编辑 gradle.properties 文件...将行更改为:

androidBuildToolsVersion=28.0.3

最后:您可能应该关闭并重新打开 QT 和项目。

【讨论】:

【参考方案3】:

根据https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_environment_variables

定义环境变量 GRADLE_OPTS 像这样为 http 和 https 代理

GRADLE_OPTS=-Dhttp.proxyHost=123.23.23.123 -Dhttp.proxyPort=8080 -Dhttps.proxyHost=123.23.23.123 -Dhttps.proxyPort=8080

【讨论】:

【参考方案4】:

老问题,不过最近我也被这个困扰了:

我通过下载 gradle 3.1 更新了我的 gradle 包装器。 但是在运行命令 gradle 时似乎仍在尝试下载 2.2.1

事实证明,在较旧的 Qt 版本(至少 5.5.1)中,androiddeployqt 本身会修改 gradle.properties 中的 gradle 版本:

bool updateGradleDistributionUrl(const QString &path) 

    // check if we are using gradle 2.x
    GradleProperties gradleProperties = readGradleProperties(path);
    QString distributionUrl = QString::fromLocal8Bit(gradleProperties["distributionUrl"]);
    QRegExp re(QLatin1String(".*services.gradle.org/distributions/gradle-2..*.zip"));
    if (!re.exactMatch(distributionUrl)) 
        gradleProperties["distributionUrl"] = "https\\://services.gradle.org/distributions/gradle-2.2.1-all.zip";
        return mergeGradleProperties(path, gradleProperties);
    
    return true;

【讨论】:

【参考方案5】:

这是网络问题或代理问题。如果 gradle 无法通过代理设置,则在 ~/.gradle 中创建 gradle.settings 或在 PATH 中创建您自己定义的 GRADLE_USER_HOME。

systemProp.http.proxyHost=proxy
systemProp.http.proxyPort=port
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost

【讨论】:

以上是关于使用 androiddeployqt 为 android 构建 Qt 应用程序时出现 Gradle 构建错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ant 命令行来选择我的自定义 build.xml

MySQL 的 INSTR 和排序规则

ANDR-PERF tryGetService 失败; SELinux

属性的 CNContact 编码

a fantastic try out right Andre Reed Bills jersey now

160个crackme 008 Andrénalin.1