java - 如何在Android的Qt上使用HockeyApp SDK

标签 java android c++ qt hockeyapp

我正在尝试将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 responsethis 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源代码是降低成本的地方。试图使功能失调的工具正常工作已经浪费了太多时间:
  • 首先,我不会评论用C++编写构建工具有多聪明-在一个约3000行的main.cpp文件
  • 我将不评论对src/android/java源中的androiddeployqt路径(以及许多其他路径)进行一次硬编码的实践,而不是多次-而不是至少准备适当(即外部)工具配置
  • const QString的实践
  • 我不会评论违反一种工具,一种目的的〜50年最佳实践并复制Qt,Android或Java工具提供的大量功能(例如构建,签名,部署,安装)有多聪​​明。软件包等。
  • 但是,这个工具已经使它在过去的代码审查中进入了许多主要的Qt版本,这一事实令人震惊-也许是一个很好的指示,它是时候考虑将Qt放弃作为一种通用技术

  • 在我撰写本文时,Qt 5.8.0的安装一直保持冻结状态,从而使一个CPU内核最大化(并且在过去约12个小时内一直如此)。我休息一下
    我的问题
  • 是否有人在Qt,Android和HockeyApp上取得了成功?
  • 是否有人对这里的问题有任何提示/指针/疯狂的猜测?
  • 没有其他问题;我看够了

  • 步骤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/

    相关文章:

    C++ OOP 基础 - 正确返回对象引用?

    java - 如何使用 GeoTools/ProJ.4(或其他 api)将坐标从 HK80 GRID 转换为纬度/经度?

    java - Intellij 坚持使用 javac 11.0.3 而不是 Java 7 进行编译

    java - 测试 java jersey 应用程序

    android - 点击 Android 通知后的 AlertDialog

    android - 应用程序未安装 android 4.0 ICS

    java - 如何通过一次检查父标签和子标签来使用sax解析xml?

    android - 在西类牙语中,Date.getTime() 需要花费很多时间来处理

    c++ - 双格式和字符串流格式

    c++ - 没有匹配函数错误[模板]