313 字
2 分钟
APK 改包签名链路:反编译、改包名、回编、签名一次讲清
链路总览
.apk -> apktool decode(反编译) -> 改包名(AndroidManifest + 资源 + smali) -> apktool build(回编译出 unsigned 包) -> zipalign(4 字节对齐) -> apksigner sign(v1+v2 签名) -> apksigner verify(验签确认) -> _signed.apkchange_apk_package.sh(600+ 行)把这条链串起来,set -euo pipefail 打底,任何一步失败立刻停,不产出半成品包。
CLI 设计:默认能跑,参数能调
./change_apk_package.sh \ --apk TokenPocket.apk \ --new-package com.example.mtsports.lab \ --build --sign--old-package省略时自动从AndroidManifest.xml读--new-package省略时按com.wallet.app.android.pkg + 时间戳自动生成--force-decode覆盖旧的解包目录,--dry-run只演练不落盘--apksigner/--zipalign默认从 Android SDK build-tools 自动探测,也支持手动指定
签名:对齐 → 签名 → 验签,缺一不可
顺序不能错:先 zipalign 再 sign,签完立刻 verify。脚本里签名密码支持三种来源——参数传入、环境变量 APK_SIGN_PASSWORD、交互式输入,CI 和手工两不误。
踩过的坑
- 包名替换不能只改 Manifest,provider 的
authorities、smali 里的引用要一起走,否则装得上、跑不起来 - build-tools 版本要锁死(我们用 36.0.0),不同版本 apksigner 行为有差异,Docker 构建时用 ARG 固定
Android 打包链路是体力 + 细心活,我的原则:失败即停、产物可验、版本锁定。下篇聊怎么把这一整套装进 Docker。