Android部署工具
构建 Android 打包包涉及多个步骤,因此 Qt 伴随一个工具可为您处理这些步骤。由 androiddeployqt 工具处理的步骤在 在 Android 上部署应用程序 一节中进行描述。
运行 androiddeployqt 之前的需求
在手动运行工具之前,您需要使用 CMake 或 qmake 配置您的项目以生成 Makefiles 和一个包含重要设置(例如 android-<target_name>-deployment-settings.json)的 JSON 文件,这些设置由 androiddeployqt 使用。
注意: 不建议修改 androiddeployqt JSON 文件。
为了为 androiddeployqt 准备环境,请在与源目录不同的单独目录中配置您的项目。有关配置项目的更多信息,请参阅 从命令行构建 Android 项目 Qt。
命令行参数
运行工具时,仅需要的命令行参数是 --input 和 --output。其他命令行参数是可选的,但非常有用。以下列表可通过传递 --help 参数到 androiddeployqt 获取。
Syntax: androiddeployqt --output <destination> [options]
Creates an Android package in the build directory <destination> and
builds it into an .apk file.
Optional arguments:
--input <inputfile>: Reads <inputfile> for options generated by
qmake. A default file name based on the current working
directory will be used if nothing else is specified.
--deployment <mechanism>: Supported deployment mechanisms:
bundled (default): Includes Qt files in stand-alone package.
unbundled: Assumes native libraries are present on the device
and does not include them in the APK.
--aab: Build an Android App Bundle.
--no-build: Do not build the package, it is useful to just install
a package previously built.
--install: Installs apk to device/emulator. By default this step is
not taken. If the application has previously been installed on
the device, it will be uninstalled first.
--reinstall: Installs apk to device/emulator. By default this step
is not taken. If the application has previously been installed on
the device, it will be overwritten, but its data will be left
intact.
--device [device ID]: Use specified device for deployment. Default
is the device selected by default by adb.
--android-platform <platform>: Builds against the given android
platform. By default, the highest available version will be
used.
--release: Builds a package ready for release. By default, the
package will be signed with a debug key.
--sign <url/to/keystore> <alias>: Signs the package with the
specified keystore, alias and store password.
Optional arguments for use with signing:
--storepass <password>: Keystore password.
--storetype <type>: Keystore type.
--keypass <password>: Password for private key (if different
from keystore password.)
--sigfile <file>: Name of .SF/.DSA file.
--digestalg <name>: Name of digest algorithm. Default is
"SHA-256".
--sigalg <name>: Name of signature algorithm. Default is
"SHA256withRSA".
--tsa <url>: Location of the Time Stamping Authority.
--tsacert <alias>: Public key certificate for TSA.
--internalsf: Include the .SF file inside the signature block.
--sectionsonly: Don't compute hash of entire manifest.
--protected: Keystore has protected authentication path.
--jarsigner: Deprecated, ignored.
NOTE: To conceal the keystore information, the environment variables
QT_ANDROID_KEYSTORE_PATH, and QT_ANDROID_KEYSTORE_ALIAS are used to
set the values keysotore and alias respectively.
Also the environment variables QT_ANDROID_KEYSTORE_STORE_PASS,
and QT_ANDROID_KEYSTORE_KEY_PASS are used to set the store and key
passwords respectively. This option needs only the --sign parameter.
--jdk <path/to/jdk>: Used to find the jarsigner tool when used
in combination with the --release argument. By default,
an attempt is made to detect the tool using the JAVA_HOME and
PATH environment variables, in that order.
--qml-import-paths: Specify additional search paths for QML
imports.
--verbose: Prints out information during processing.
--no-generated-assets-cache: Do not pregenerate the entry list for
the assets file engine.
--aux-mode: Operate in auxiliary mode. This will only copy the
dependencies into the build directory and update the XML templates.
The project will not be built or installed.
--apk <path/where/to/copy/the/apk>: Path where to copy the built apk.
--qml-importscanner-binary <path/to/qmlimportscanner>: Override the
default qmlimportscanner binary path. By default the
qmlimportscanner binary is located using the Qt directory
specified in the input file.
--depfile <path/to/depfile>: Output a dependency file.
--builddir <path/to/build/directory>: build directory. Necessary when
generating a depfile because ninja requires relative paths.
--no-rcc-bundle-cleanup: skip cleaning rcc bundle directory after
running androiddeployqt. This option simplifies debugging of
the resource bundle content, but it should not be used when deploying
a project, since it litters the 'assets' directory.
--copy-dependencies-only: resolve application dependencies and stop
deploying process after all libraries and resources that the
application depends on have been copied.
--help: Displays this information.使用 project_name,在不部署到设备的情况下使用 androiddeployqt 构建应用程序包,请运行以下命令
androiddeployqt --input <build_dir>/android-project_name-deployment-settings.json \
--output <build_dir>/android-build构建并部署包装到设备
androiddeployqt --input <build_dir>/android-project_name-deployment-settings.json \
--output <build_dir>/android-build --install --device <device_serial_id>依赖检测
Qt 随带了一些插件,在运行时按需加载。这些插件可以从连接 SQL 数据库到加载特定的图像格式。由于插件在运行时加载,因此检测插件依赖项是不可能的,但 androiddeployqt 尝试根据您的应用程序的 Qt 依赖项猜测这些依赖项。如果插件有任何不是应用程序依赖项的 Qt 依赖项,则它不会默认包含。例如,为了确保 SVG 图像格式插件包含在内,您需要将 Qt SVG 模块添加到您的项目中,以便它成为应用程序的依赖项
find_package(Qt6 REQUIRED COMPONENTS Svg) ... target_link_libraries(target_name PRIVATE Qt6::Svg)
如果您想知道为什么某个特定插件未自动包含,您可以在运行 androiddeployqt 时使用 --verbose 选项以获取每个排除插件的缺少依赖项列表。您也可以在 Qt Creator 中通过在 项目 > 构建步骤 > 构建 Android APK > 高级操作 中选中 详细输出 复选框来实现。
还可以手动指定应用程序的依赖项。有关更多信息,请参阅 QT_ANDROID_DEPLOYMENT_DEPENDENCIES CMake 变量。
注意:androiddeployqt 会扫描项目中的 QML 文件以收集 QML 导入。但是,如果您在运行时从 C++ 中作为 QString 加载 QML 代码,这可能不会正常工作,因为 androiddeployqt 在部署时可能不知道这一点。为了纠正这个问题,您可以添加一个虚拟的 QML 文件,该文件导入在运行时引用的此类 QML 模块。
Qt Creator 中的部署
Qt Creator 在底层使用 androiddeployqt,并提供了简单直观的用户界面来指定各种选项。有关更多信息,请参阅 Qt Creator:将应用程序部署到 Android 设备。
有关自定义和部署 Qt for Android 应用程序的更多信息,请参阅 在 Android 上部署应用程序。
© 2024 The Qt Company Ltd。此处包含的文档贡献归其各自所有者所有。此处提供的文档受 GNU 自由文档许可证版本 1.3 的条款约束,由自由软件基金会发布。Qt 及其相应标志是 The Qt Company Ltd. 在芬兰和其他国家的商标。所有其他商标均为其各自所有者的财产。