Skip to content

自定义 APK 签名脚本 ​

平台证书、厂商密钥或远端签名服务无法放进本地 Gradle SigningConfig 时,Jugg 默认的本地 keystore 签名会产出签名身份错误的 APK,更新已有系统包时会得到 INSTALL_FAILED_UPDATE_INCOMPATIBLE。启用 Enable custom APK sign script 后,Jugg 把待签名 APK 交给项目脚本处理,写回内容、校验、原子替换和后续安装流程保持不变。

支持范围 ​

场景当前支持情况用户可见结果
Manifest 变化写回 APK支持zipalign 后执行项目脚本签名,校验通过才替换并安装
native lib 变化写回 APK支持同上
embedded dex 与 Embedded APK支持同上
Gradle 完整构建产出的 APK不支持签名仍由 Gradle 自身完成,不执行脚本
CLI 增量构建与手工导出增量 APK不支持继续使用默认本地签名
本地签名配置无效支持启用脚本时不再要求本地 SigningConfig 可用

同一轮 Run 里,只有 Jugg 自己改写过的 APK 会走项目脚本。

触发与结果 ​

text
本轮生成 Manifest、resources.arsc 或 native lib 增量产物
  -> 写入最近的 Gradle APK
  -> zipalign
  -> 启用脚本: <配置的命令> <待签名 APK 绝对路径>
  -> apksigner verify 校验脚本产出的 APK
  -> 校验通过才替换原 APK 并继续安装

Jugg 在本地工程根目录执行脚本,并把待签名 APK 的绝对路径作为最后一个位置参数传入。路径包含空格、括号或 Unicode 字符时仍作为单个参数传递。脚本必须原地覆盖这个 APK;签名服务把结果写到其它文件时,脚本需要在退出前替换该路径。

bash
# Run Configuration 中配置
./scripts/sign-system-apk.sh --server production

# Jugg 实际执行
./scripts/sign-system-apk.sh --server production "/path/to/.app-debug.apk.tmp_aligned"

示例工程 android_demo_project 提供 scripts/sign-system-apk.sh,接收 $1 作为 APK 路径,使用工程已有默认签名和 Android SDK apksigner 原地签名,可直接用于验证这条能力。

使用边界 ​

  • 勾选开关后脚本不能为空,为空时 Run Configuration 校验失败;未勾选时只显示开关,现有签名行为完全不变。
  • 脚本退出码 0 只表示执行完成。Jugg 随后仍执行 apksigner verify,校验失败时原 APK 保持不变,本轮不进入安装。
  • 脚本非零退出、被取消或校验失败时,当次更新不会回退到本地 keystore 签名,避免产生签名身份错误的 APK。
  • 脚本输出转发到 Run 窗口,取消 Run 会终止脚本进程。Jugg 不对已知失败自动重试,上传、等待、下载及其重试策略由项目脚本负责。
  • 部署 retry 和 recover 安装的是已经签好的 APK,不会重复执行脚本。
  • 多设备 Run 可能对同一个 APK 重复执行脚本,重复执行的语义和副作用由项目脚本负责。
  • 脚本内容属于敏感配置,Jugg 日志和诊断信息只显示 (configured) / (not_configured),不记录脚本原文。
  • 远程编译只改变产物来源:APK 的改写和签名仍在连接设备的本地 IDE 主机完成。

相关页面 ​