我正在尝试将HockeyApp中的latest version 4.1.2 Android SDK集成到我们的Qt Android应用程序中。我对Android开发或Java总体上并不了解-也不了解任何Qt或HockeyApp内部。
关于将第三方Android(即Java)库包含到Qt项目中的做法,有些通用的official documentation;但是,它提到了在“Qt Creator 4.2.0”当前版本中不存在的““部署设置”中的“创建AndroidManifest.xml”按钮”,因此,我不确定此文档的过时程度或可能仍适用的部分。
HockeyApp documentation仅涵盖使用Android Studio的“典型Android开发”,其支持为not supportive。
附带说明一下,集成HockeyApp iOS SDK仅花费了几个小时,并且主要是编写一些Objective C桥代码。
步骤1:将SDK添加到项目中
第一种方法
我尝试遵循上述文档,并添加了带有内容的解压缩HockeySDK-Android-4.1.2
文件夹和project.properties
文件
android.library.reference.1=HockeySDK-Android-4.1.2/libs/
到项目文件夹;我还将<my project>.pro
中的ANDROID_PACKAGE_SOURCE_DIR设置到该项目文件夹。问题:
androiddeployqt
构建步骤发出错误消息(为便于阅读而包装)Error: <path to build folder>/android-build/HockeySDK-Android-4.1.2/libs
is not a valid project (AndroidManifest.xml not found).
但无论如何仍会继续,最终会失败并显示一条错误消息(也为便于阅读而包装)BUILD FAILED
/opt/Android/android-sdk-macosx/tools/ant/build.xml:573:
HockeySDK-Android-4.1.2/libs/ resolve to a path
with no project.properties file for project <path to build folder>/android-build
使用androiddeployqt
开关运行--verbose
可显着增加输出,但有用信息为零。第二种方法
下载的HockeyApp Android SDK的zip压缩文件除了一些文档外还包含了
libs/HockeySDK-4.1.2.aar
文件;从this response和this comment中,我收集到的AAR format只是一个zip存档,其中包含AndroidManifest.xml
文件。我解压缩了libs/HockeySDK-4.1.2.aar
,然后将其删除了;现在,构建中的第一条错误消息消失了。问题:构建失败并显示
BUILD FAILED
/opt/Android/android-sdk-macosx/tools/ant/build.xml:597:
The following error occurred while executing this line:
/opt/Android/android-sdk-macosx/tools/ant/build.xml:649:
The following error occurred while executing this line:
/opt/Android/android-sdk-macosx/tools/ant/build.xml:655:
<path to build folder>/android-build/HockeySDK-Android-4.1.2/libs/src does not exist.
同样,将运行中的--verbose
添加到androiddeployqt
只会增加噪音。查看提到的build.xml
位置也无济于事。更新:
我只是尝试从错误消息中创建丢失的文件夹;现在构建失败,如下所示:
-dex:
[dex] input: <path to build folder>/android-build/bin/classes
[dex] input: <path to build folder>/android-build/HockeySDK-Android-4.1.2/libs/bin/classes.jar
[dex] input: <path to build folder>/android-build/libs/QtAndroid-bundled.jar
[dex] input: <path to build folder>/android-build/libs/QtAndroidBearer-bundled.jar
[dex] Pre-Dexing <path to build folder>/android-build/libs/QtAndroid-bundled.jar -> QtAndroid-bundled-a06280f40655c27b25038380a4d7f67c.jar
[dex] Pre-Dexing <path to build folder>/android-build/libs/QtAndroidBearer-bundled.jar -> QtAndroidBearer-bundled-a69fa323dbfa477411ea082423128813.jar
[dex] Converting compiled files and external libraries into <path to build folder>/android-build/bin/classes.dex...
[dx]
[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
[dx] java.io.FileNotFoundException: <path to build folder>/android-build/HockeySDK-Android-4.1.2/libs/bin/classes.jar (No such file or directory)
[dx] at java.util.zip.ZipFile.open(Native Method)
[dx] at java.util.zip.ZipFile.<init>(ZipFile.java:219)
[dx] at java.util.zip.ZipFile.<init>(ZipFile.java:149)
[dx] at java.util.zip.ZipFile.<init>(ZipFile.java:163)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)
[dx] at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
[dx] at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
[dx] at com.android.dx.command.dexer.Main.processOne(Main.java:677)
[dx] at com.android.dx.command.dexer.Main.processAllFiles(Main.java:574)
[dx] at com.android.dx.command.dexer.Main.runMonoDex(Main.java:311)
[dx] at com.android.dx.command.dexer.Main.run(Main.java:277)
[dx] at com.android.dx.command.dexer.Main.main(Main.java:245)
[dx] at com.android.dx.command.Main.main(Main.java:106)
[dx] 1 error; aborting
BUILD FAILED
/opt/Android/android-sdk-macosx/tools/ant/build.xml:888: The following error occurred while executing this line:
/opt/Android/android-sdk-macosx/tools/ant/build.xml:890: The following error occurred while executing this line:
/opt/Android/android-sdk-macosx/tools/ant/build.xml:902: The following error occurred while executing this line:
/opt/Android/android-sdk-macosx/tools/ant/build.xml:283: null returned: 1
我显然不能仅仅组成一些classes.jar
文件,但是在<path to build folder>/android-build/HockeySDK-Android-4.1.2/libs
中只有一个名称相同的文件,因此我可以创建丢失的bin
文件夹,并在其中创建指向../classes.jar
的符号链接(symbolic link)。现在构建成功。步骤1完成。
步骤2:在项目中使用SDK
回到对应的HockeyApp documentation,我收集到我需要修改一些类似于
public class YourActivity extends Activity
...
在<path to build folder>/android-build/src/org/qtproject/qt5/android/bindings/QtActivity.java
中的项目中只有一次这样的代码:public class QtActivity extends Activity
...
该文件由 androiddeployqt
工具(属于Qt SDK的一部分)从Qt SDK内的源文件夹复制到$QTDIR/src/android/java
,即我机器上的/opt/Qt/Qt_5.7.1/5.7/android_armv7/src/android
。查看
androiddeployqt
源代码,我发现没有办法(例如通过命令行参数)更改这些.java
文件的来源文件夹,因此无法提供我自己的文件集并具有androiddeployqt
复制它。因此,为了使这项工作有效,我必须扩展/修复androiddeployqt
功能(对不起,我不会碰那个代码-糟糕!)或直接在源代码处修改复制的文件-这显然会影响使用该代码构建的所有项目Qt SDK实例。第三种方法是,在
androiddeployqt
将Java源代码复制到build文件夹后,我可以尝试修补Java源代码。不幸的是,这不仅使开发和构建工作流变得非常痛苦。 androiddeployqt
“一个工具可以完成所有工作”的设计失败也使它完全不可能(参见下文):在构建过程中,没有时间点项目中存在Java源,并且尚未构建.apk
包。我认为androiddeployqt
--no-build
参数将启用该功能:--no-build: Do not build the package, it is useful to just install
a package previously built.
但是这里的“构建”是指构建Qt / Java桥代码,而不是实际的应用程序,因此该参数对于手头的任务来说几乎没有用。构建失败并显示以下消息-这本身就是一个错误,因为消息中的.apk
文件不存在,因此Android软件包构建失败:Android package built successfully in 1.011 ms.
-- File: <path to build folder>/android-build//bin/QtApp-release-unsigned.apk
当然,我可以将源复制到其他地方,进行修补并将其手动复制到最终目标位置,但是我认为这是我划清界限的地方。实际上,查看
androiddeployqt
源代码是降低成本的地方。试图使功能失调的工具正常工作已经浪费了太多时间:main.cpp
文件src/android/java
源中的androiddeployqt
路径(以及许多其他路径)进行一次硬编码的实践,而不是多次-而不是至少准备适当(即外部)工具配置const QString
的实践在我撰写本文时,Qt 5.8.0的安装一直保持冻结状态,从而使一个CPU内核最大化(并且在过去约12个小时内一直如此)。我休息一下
我的问题
步骤3:从C++调用SDK Java代码
(由于步骤2中的砖墙而被取消)
最佳答案
回答我自己的问题:
如果不修补Qt SDK工具源代码或Qt SDK Java模板源文件,则无法在Android上将HockeyApp SDK与Qt一起使用。
实际上,根据我的收集,如果需要修改Java源代码,则无法在Android上的Qt上使用任何第三方库。
关于java - 如何在Android的Qt上使用HockeyApp SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41832291/