Qt 6.4.2中QT_ANDROID_SIGN_APK等CMake变量配置无效致APK签名失败求助
问题翻译
有没有人用过这些CMake变量?涉及变量包括:QT_ANDROID_SIGN_APK、QT_ANDROID_KEYSTORE_PATH、QT_ANDROID_KEYSTORE_ALIAS、QT_ANDROID_KEYSTORE_STORE_PASS、QT_ANDROID_KEYSTORE_KEY_PASS。我在Qt 6.4.2中尝试用set()声明为普通变量,或通过set_target_properties()设置为目标属性,但均无效果,Release构建失败,报错信息如下:
失败 [INSTALL_PARSE_FAILED_NO_CERTIFICATES: 无法收集/data/app/vmdl1175743032.tmp/base.apk的证书:无法从/data/app/vmdl1175743032.tmp/base.apk收集证书:尝试获取空数组的长度]
解决方案
1. 修正变量设置时机与作用域
这些签名变量属于全局CMake变量,必须在find_package(Qt6 ...)之前设置,否则Qt Android模块无法读取到配置。正确示例:
# 优先设置签名相关全局变量 set(QT_ANDROID_SIGN_APK ON) set(QT_ANDROID_KEYSTORE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/your-keystore.keystore") set(QT_ANDROID_KEYSTORE_ALIAS "your-key-alias") set(QT_ANDROID_KEYSTORE_STORE_PASS "your-store-pass") set(QT_ANDROID_KEYSTORE_KEY_PASS "your-key-pass") # 再引入Qt依赖包 find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
2. 区分全局变量与目标属性
这些签名配置不属于目标属性,不能用set_target_properties()设置,必须使用全局set()确保作用域覆盖Qt的Android构建逻辑。
3. 验证密钥库路径有效性
确保QT_ANDROID_KEYSTORE_PATH指向的密钥库文件真实存在,建议使用绝对路径(如示例中用CMAKE_CURRENT_SOURCE_DIR拼接)。若密钥库文件无法被CMake读取,签名步骤会静默跳过,最终生成未签名APK,触发证书缺失报错。
4. 检查版本兼容特性
Qt 6.4.x要求CMake版本不低于3.21,同时确认未手动关闭QT_ANDROID_BUILD_APK(默认开启,若被覆盖需重新设置为ON)。
5. 手动验证签名流程
若以上配置仍无效,可通过apksigner手动签名验证密钥库可用性:
apksigner sign --ks your-keystore.keystore --ks-key-alias your-key-alias base.apk
手动签名后若安装成功,说明CMake配置中存在后续逻辑覆盖了签名变量,需排查是否有重复set()操作改写了配置。
内容的提问来源于stack exchange,提问作者morte

