Qt 6.9.0调试时如何自动签名部署Android APK?
问题背景
从Qt 6.2.2(Qt Creator 6.0.2)迁移至Qt 6.9.0(Qt Creator 16.0.0)后,原无需手动签名即可部署APK的流程失效,部署时出现以下错误:
adb: failed to install .../android-build-release-unsigned.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from ...: Attempt to get length of null array]
17:10:36: The process "C:\Qt\6.9.0\mingw_64\bin\androiddeployqt.exe" exited with code 16.
手动在项目属性中配置签名可成功部署,但每次重启项目需重复设置,开发效率低下。以下是三种可行解决方案:
方案1:让ADB允许部署未签名APK
仅适用于Debug构建的APK,Release构建必须签名:
- 确保设备已开启开发者模式,启用USB调试和USB安装(部分设备名为“允许通过USB调试安装应用”);
- 修改adb安装命令,添加
-t参数强制允许调试安装:
adb install -r -t C:/path/to/your/unsigned.apk
注意:若当前构建模式为Release,需切换至Debug模式,否则即使添加参数也无法安装。
方案2:在.pro文件中预设签名配置,实现会话持久化
直接在项目的.pro文件中添加签名变量,无需每次手动配置:
# 使用Android默认调试密钥库 ANDROID_SIGN_STORE_PATH = C:/Users/me/.android/debug.keystore ANDROID_SIGN_STORE_PASSWORD = android ANDROID_SIGN_KEY_ALIAS = androiddebugkey ANDROID_SIGN_KEY_PASSWORD = android # 强制自动签名(覆盖Qt Creator默认设置) ANDROID_PACKAGE_SIGNED = true
- 路径需用正斜杠
/或双反斜杠\\避免转义错误; - 此方式会将密码明文存储在.pro文件中,仅适合开发环境使用,正式发布需移除。
若偏好使用JSON配置文件,需保证文件结构完整(不能仅包含signing节点),示例JSON内容:
{ "androidBuildToolsVersion": "34.0.0", "androidCompileSdkVersion": "34", "signing": { "store": "C:/Users/me/.android/debug.keystore", "storePassword": "android", "keyAlias": "androiddebugkey", "keyPassword": "android" }, "verbose": false }
然后在.pro文件中指定路径:
ANDROID_DEPLOYMENT_SETTINGS_FILE = $$PWD/android_deployment_settings.json
$$PWD表示当前.pro文件所在目录,确保JSON文件路径正确。
方案3:自定义androiddeployqt命令行参数
方式1:通过Qt Creator构建步骤设置
- 打开项目属性,进入Build Steps -> Build Android APK;
- 在Additional arguments中添加签名参数:
--sign C:/Users/me/.android/debug.keystore androiddebugkey android android
参数格式:--sign <密钥库路径> <密钥别名> <密钥库密码> <密钥密码>
方式2:通过.pro文件配置
在.pro文件中添加变量,自动传递参数给androiddeployqt:
ANDROID_DEPLOYMENT_OPTIONS = "--sign C:/Users/me/.android/debug.keystore androiddebugkey android android"
内容的提问来源于stack exchange,提问作者jpo38

