我的预制件不包含二进制文件或包含

时间:2020-07-04 19:06:55

标签: c++ boost android-ndk

prefab成功运行,但是生成的预制目录中仅包含CMake文件,没有其他资产。我的目标是轻松地与同事共享二进制资产,并将其包含在我的Android版本中。我在做什么错了?

我正在尝试创建一个增强的预制件(尽管Google可能会it gets enough votes制造一个)。我使用Boost-for-Android来构建boost 1.73.0,将相关的include和库复制到 assembly 目录中,并用prefab.jsonmodule.json和{ {1}}个文件,然后运行

abi.json

但是结果目录每个abi仅包含两个CMake文件。

prefab --output "/home/developer/workspace/boost-prefab/out/boost/x86_64" \
  --build-system cmake        \
  --platform     android      \
  --abi          "x86_64"     \
  --os-version   "21"         \
  --ndk-version  "21"         \
  --stl          "c++_static" \
  "/home/developer/workspace/boost-prefab/assembly/boost"

我创建的程序集目录如下(我遵循prefab structure prescribed in the docs):

 $ find x86_64 -type f
 x86_64/lib/x86_64-linux-android/cmake/boost/boostConfig.cmake
 x86_64/lib/x86_64-linux-android/cmake/boost/boostConfigVersion.cmake

boost/prefab.json modules/filesystem/ module.json include/boost/... libs/android.x86_64/ abi.json libboost_filesystem.a modules/system/ module.json include/boost/... libs/android.x86_64/ abi.json libboost_system.a

prefab.json

{"schema_version": 1, "name": "boost", "version": "1.73.0", "dependencies": []}

modules/filesystem/module.json

{"library_name": "libboost_filesystem"}

modules/filesystem/libs/android.x86_64/abi.json

我承认我对预制{"abi": "x86_64", "api": 21, "ndk": "21", "stl": "c++_static"} 感到困惑,因为我可以说它只是NDK版本(因为它不是API版本或Android主要版本号),但我不认为那是问题。

我还尝试通过vcpkg生成一个boost预制,但是boost现在无法在vcpkg中构建(有一些PR可以解决这个问题,但是我无法构建它。)无论如何,vcpkg's example的布局也略有不同,在预制件中插入AAR的情况也是如此。

我的目标是拥有一个预先构建的boost存档,我的同事可以轻松地将其导入到他们的Android项目中。

  • 我只是误解了预制文件的用途吗?
  • 与默认的增强文件相比,确实生成的CMake文件看起来是原始的。与在此处创建的预制文件相比,我更喜欢增强CMake文件。
  • 我应该先尝试创建一个用于增强功能的AAR吗?

今天结束时,我能够在Android项目中使用Boost的唯一方法是将其构建包含在我的os-version中,但是如果归结为这一点,预制的优势是什么?我觉得我也integrate conan into my gradle build就好。

1 个答案:

答案 0 :(得分:1)

我只是误解了预制文件的用途吗?

仅根据您的下一个问题。它是用于以与构建系统无关的方式分发预构建库的系统。除了“不可知的构建系统”之外,这与您要执行的操作保持一致。

与默认的boost文件相比,确实生成的CMake文件似乎是原始文件,即与在此处创建的预制文件相比,我更喜欢boost CMake文件。

Prefab旨在支持任意构建系统,而无需包编写者关心每个组件的支持。这对于Android很重要,因为尽管有很多人使用CMake,但ndk-build也是官方支持的选项,并且还经常使用其他数十种构建系统。

boost自己的CMake文件将提供哪些功能?如果我们可以通过与构建系统无关的方式来执行此操作,则可以在https://github.com/google/prefab/issues上提出功能请求。

如果无法以构建系统不可知的方式对其进行描述,则Prefab不适合。 vcpkg可能是一个更好的选择。

我应该先尝试创建一个用于增强的AAR吗?

是使用AGP的预制包装的最简单方法。通常,vcpkg是给定现有语料库的最简单路径,但是如您所述,您需要向他们发送补丁(或错误报告),以便首先修复其构建。

或者,https://android.googlesource.com/platform/tools/ndkports/是我们构建当前发布的少数文件的方式。应该很容易检出,添加您自己的端口文件,并构建您的AAR。如果您将补丁程序发送给我们,那么我可能会在测试基础架构启动并运行后将其合并(当前,由于测试是手动的,因此我们无法支持许多软件包)。

最后,我能够在Android项目中使用Boost的唯一方法是将其构建包含在我的CMAKE_FIND_ROOT_PATH中,但是如果归结为这一点,那么预制的优势是什么?

如果使用AAR,则无需这样做。 AGP会为您处理详细信息。预期的用例是用于构建系统以集成预制件,而不是用户必须要做的工作。 AGP已经做到了这一点,但仅在从AAR进行消费时如此。