5618apktool复习
本文最后由方少年更新于2025 年 11 月 14 日,已超过16天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
下面是“apktool 流程:反编译 → 改资源/Smali → 重打包签名 → 安装运行”的实战讲义,附带常见命令、注意事项、排错清单,以及 8 道单选练习题(不含答案,选项分布均匀)。
一、目标与适用场景
- 目标:在合规授权前提下,对 Android APK 做静态修改(资源或 Smali 逻辑),并成功重打包、签名、安装运行。
- 典型用途:教学练习、逆向修复 UI 文案、开关调试开关、打补丁验证缺陷;严禁用于违法用途。
二、基本工具
- apktool:反编译/重编译 Android 应用(资源 + Smali)。
- apksigner 或 jarsigner + zipalign:对重打包的 APK 进行对齐与签名。
- keytool:生成签名密钥(keystore)。
- adb:安装与调试。
三、标准流程与命令范式
- 反编译(decode)
命令
apktool d app.apk -o app_src结果
- app_src/AndroidManifest.xml(可读)
- app_src/res/(资源)
- app_src/smali*/(Smali 代码包)
- app_src/assets/ 等
- 修改内容
改资源
- 文本/图片:res/values/strings.xml、res/drawable-*/、layout/
- 注意引用与资源 ID(apktool 会在重编译时重建 R)。
改 Smali
- 位置:smali/包名路径/类名.smali
- 语法:基于 Dalvik 指令(.method、invoke-/const- 等)
- 例:将 const/4 v0, 0x0 改为 const/4 v0, 0x1,可切换布尔逻辑。
Manifest
- 调试标志 android:debuggable="true"
- 权限/导出属性调整(注意兼容性与安全影响)
- 重打包(build)
命令
apktool b app_src -o app-unsigned.apk- 如果报 aapt/aapt2 相关错误,考虑用 apktool 对应版本或指定 framework(系统 app 时需要先“安装”framework-res.apk)。
- 对齐(zipalign,可选但推荐)
命令
zipalign -v -p 4 app-unsigned.apk app-aligned.apk若无 zipalign,可直接下一步签名(apksigner 也会提示)。
- 签名(sign)
生成测试密钥(首次)
keytool -genkeypair -v -keystore my.keystore -alias mykey \ -keyalg RSA -keysize 2048 -validity 10000使用 apksigner 签名(推荐)
apksigner sign --ks my.keystore --ks-key-alias mykey \ --out app-signed.apk app-aligned.apk # 或直接对未对齐包签名:apksigner sign --ks ... --out app-signed.apk app-unsigned.apk验证签名
apksigner verify --verbose --print-certs app-signed.apk
- 安装与运行
卸载同包名旧版本(如果签名不一致)
adb uninstall com.example.demo安装
adb install app-signed.apk日志调试
adb logcat | grep -i mytag
四、签名与安装的要点
- 同包名的 APP 不能覆盖安装不同证书签名的 APK;要么先卸载,要么用原证书重签(通常拿不到原签名)。
- Android 7.0+ 默认要求 V2 签名(apksigner 会自动处理);jarsigner 仅 V1,可能安装失败。
- 若需要覆盖安装以便“增量调试”,应使用相同 keystore 重签。
五、Smali 修改小贴士
定位入口
- 从崩溃堆栈/日志找类路径;
- 通过 strings.xml/布局 id 推断类名;
- 使用搜索工具在 smali 里找关键字。
常见修改
- 布尔/常量开关(const 指令)
- 条件跳转(if-eq/if-nez → 反转条件)
- 返回值(return v0 / return-const)
- 保持寄存器数量与方法签名一致,避免破坏寄存器约束。
六、常见错误与排错
安装失败 INSTALL_PARSE_FAILED_NO_CERTIFICATES
- 未签名或签名不正确 → 用 apksigner 重新签名。
INSTALL_FAILED_UPDATE_INCOMPATIBLE
- 设备上已有相同包名不同签名版本 → 先 adb uninstall。
运行崩溃 ClassNotFound/NoSuchMethod
- 改动破坏了类/方法签名或寄存器数量 → 回看 smali 修改。
资源 id 冲突
- 清理 app_src/build,然后再 apktool b。
系统 app 反编译失败
- 需先安装相应 framework:apktool if framework-res.apk
七、合规与安全
- 仅在授权/教学环境操作;
- 不要把包含第三方资源的修改包传播;
- 不要移除合法安全机制(防篡改、证书校验)用于不当用途。
八、8 道单选练习题(仅一项正确,选项分布均匀;题末【】填写)
- 使用 apktool 反编译 APK 的正确命令形式是?【B】
A. apktool b app.apk -o app_src
B. apktool d app.apk -o app_src
C. apktool sign app.apk -o app_src
D. apktool if app.apk -o app_src - 修改 Smali 后重打包生成未签名 APK 的命令是?【B】
A. apktool d app_src -o app-unsigned.apk
B. apktool b app_src -o app-unsigned.apk
C. apksigner sign app_src -o app-unsigned.apk
D. zipalign -v -p 4 app_src app-unsigned.apk - 若要将 APK 签名且兼容 Android 7.0+ 的 V2 签名,应优先使用哪种方式?【A】
A. jarsigner 直接签名
B. apksigner sign
C. 用压缩软件重新打包
D. 仅使用 zipalign - 安装重签后的 APK 提示 UPDATE_INCOMPATIBLE,最可能的解决方式是?【B】
A. 修改包名即可覆盖安装
B. 先卸载设备上同包名旧版本,再安装新签名包
C. 关机重启设备
D. 用 zipalign 重新对齐 - 下列哪项最适合作为“生成新 keystore”的命令?【A】
A. apksigner generate --ks my.keystore
B. keytool -genkeypair -keystore my.keystore -alias mykey ...
C. jarsigner -keystore my.keystore -alias mykey
D. zipalign -keystore my.keystore - 发现反编译的系统应用构建失败(缺 framework),应先执行哪步?【A】
A. apktool if framework-res.apk
B. apksigner verify framework-res.apk
C. zipalign framework-res.apk
D. jarsigner framework-res.apk - 修改 Smali 时,下列哪项做法更稳妥?【C】
A. 可随意增减寄存器数量,不会影响
B. 任意更改方法签名以便快速实现
C. 保持方法签名与寄存器约束一致,仅调整必要指令
D. 删除 .locals 与 .registers 提高兼容性 - 处理“资源 ID 冲突/构建缓存影响”的常见做法是?【D】
A. 直接多次 apktool b 直到成功
B. 删除 app_src/build 后再重编译
C. 在 APK 内手动编辑 resources.arsc
D. 用 zipalign 修复资源 ID
需要的话,我可以根据你的实际 APK,给出:
- “改资源”与“改 Smali”的具体定位示例(含搜索关键词与差异补丁)
- 一键化脚本(decode → build → align → sign → install)与失败时自动打印日志的排错模板
批改结果
- 得分:5/8
- 答对:1、2、4、6、7
- 需改:3、5、8
逐题讲解与更正
- 反编译命令
你的答案:B(正确)
说明:apktool d app.apk -o app_src - 重打包生成未签名 APK
你的答案:B(正确)
说明:apktool b app_src -o app-unsigned.apk - 兼容 Android 7.0+ 的签名方式
你的答案:A(错误) → 正确:B
说明:Android 7.0+ 要求支持 V2 签名。apksigner 会同时处理 V1/V2(可兼容更高版本);jarsigner 只做 V1,可能导致安装失败。 - UPDATE_INCOMPATIBLE 覆盖失败
你的答案:B(正确)
说明:同包名不同证书不能直接覆盖安装。先 adb uninstall com.xxx.yyy 再安装新签名包;或必须用原证书重签。 - 生成新 keystore 的命令
你的答案:A(错误) → 正确:B
说明:使用 keytool 生成密钥对/keystore:
keytool -genkeypair -v -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000 - 系统应用缺 framework 构建失败
你的答案:A(正确)
说明:先安装框架资源:apktool if framework-res.apk,然后再 decode/build。 - 修改 Smali 的稳妥做法
你的答案:C(正确)
说明:保持方法签名与寄存器约束一致,仅改必要指令;否则容易 ClassNotFound/寄存器溢出等崩溃。 - 资源 ID 冲突/构建缓存影响
你的答案:D(错误) → 正确:B
说明:清理构建缓存:删除 app_src/build 后再 apktool b。zipalign 只做对齐,不会修复资源 ID。
一页速记(高频易错)
解包/打包
- 解包:apktool d app.apk -o app_src
- 打包:apktool b app_src -o app-unsigned.apk
对齐/签名/验证
- zipalign -v -p 4 app-unsigned.apk app-aligned.apk
- apksigner sign --ks my.keystore --ks-key-alias mykey --out app-signed.apk app-aligned.apk
- apksigner verify --verbose --print-certs app-signed.apk
keystore 生成
- keytool -genkeypair -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000
安装
- adb uninstall 包名 ;adb install app-signed.apk
常见报错
- INSTALL_PARSE_FAILED_NO_CERTIFICATES → 未签名或只 V1 → 用 apksigner
- UPDATE_INCOMPATIBLE → 先卸载旧包或用原证书重签
- 构建失败缺 framework → apktool if framework-res.apk
- 资源冲突 → 删 app_src/build 重编译
需要我把这套流程做成一键脚本(decode → build → align → sign → install),或给你一个“Smali 改布尔开关”的最小示例吗?
好的,下面是新的 8 道单选练习题(仅围绕 apktool 反编译→改资源/Smali→重打包签名→安装运行)。每题只有一个最合适选项,选项分布均匀,题末【】留空,不提供答案。
- 仅修改资源文件(strings.xml、图片),不改 Smali 时,为加快反编译速度更合适的做法是?【B】
A. apktool d -r app.apk -o app_src(不解码资源)
B. apktool d -s app.apk -o app_src(跳过 Smali 解码)
C. apktool d -d app.apk -o app_src(降级模式)
D. apktool d app.apk -o app_src(默认完整解码) - zipalign 步骤在签名流程中的正确时机是?【B】
A. 应在签名之后执行
B. 应在签名之前执行
C. 任何顺序都可,结果一致
D. 只在调试包需要,发布包不需要 - 多 dex 应用中,额外类文件通常会被 apktool 解到哪里?【D】
A. smali_extra/
B. smali_classes2/、smali_classes3/…
C. classes/
D. dex_bin/ - 希望“覆盖安装”修改后的 APK 而不卸载旧版本,下列哪种前提最关键?【C】
A. 随机生成任意 keystore 即可
B. 修改包名后就能覆盖
C. 使用原应用的签名密钥进行重签
D. 先运行 zipalign 再安装 - 关于 APK V1/V2 签名的说法,哪项更准确?【C】
A. V1 签名在 ZIP 级别校验整个 APK,V2 只校验单个条目
B. V1/V2 都只校验 META-INF 目录
C. V1 校验单个 ZIP 条目,V2 在 APK 整体层面进行签名校验
D. V2 仅在 Android 5.0 及以下有效 - 将 AndroidManifest.xml 中 minSdkVersion 从 24 改为 29 后,在 Android 7.0(API 24)设备上安装会出现什么结果?【B】
A. 正常安装,运行时可能崩溃
B. 安装失败,提示设备系统版本过低(例如 INSTALL_FAILED_OLDER_SDK)
C. 正常安装,系统自动降级特性
D. 仅第一次安装失败,重试即可成功 - 需要检查 APK 的签名并打印证书颁发者/有效期等信息,下列哪条命令更合适?【A】
A. zipalign --print-certs app.apk
B. apksigner verify --verbose --print-certs app.apk
C. keytool -verify app.apk
D. jarsigner -zipalign app.apk - 安装报错 “INSTALL_PARSE_FAILED_NO_CERTIFICATES”,更直接的修复方式是?【B】
A. 重新解包后删除 META-INF 目录再装
B. 用 apksigner 或兼容方式对 APK 正确签名(确保符合目标系统签名要求)
C. 只执行 zipalign 即可
D. 把 APK 重命名为 .zip 再改回 .apk
批改结果
- 得分:6/8
- 答对:1、2、4、5、6、8
- 需改:3、7
逐题反馈
- 仅改资源时的更快解包方式
你的答案:B(正确)
说明:-s/--no-src 跳过 Smali 解码,修改资源足够。对比 -r/--no-res 是“跳过资源”,用于仅改 Smali 的场景。 - zipalign 的时机
你的答案:B(正确)
说明:应先 zipalign,再签名。签名后再对齐会破坏签名。 - 多 dex 应用的 Smali 输出位置
你的答案:D(错误) → 正确:B
说明:apktool 会把额外 dex 解到 smali_classes2/、smali_classes3/… 目录。没有 dex_bin/ 这一目录。 - 覆盖安装的关键前提
你的答案:C(正确)
说明:同包名覆盖安装必须使用“原签名密钥”重签;否则需先卸载旧包。 - V1/V2 签名差异
你的答案:C(正确)
说明:V1 校验 ZIP 条目,V2 在 APK 整体层面签名校验(Android 7.0+ 需要)。 - 提高 minSdkVersion 导致的结果
你的答案:B(正确)
说明:设备系统版本低于 minSdkVersion 会直接安装失败(如 INSTALL_FAILED_OLDER_SDK)。 - 打印证书信息的命令
你的答案:A(错误) → 正确:B
说明:apksigner verify --verbose --print-certs app.apk 可查看证书颁发者、指纹、有效期等。zipalign 没有 --print-certs 选项。 - “NO_CERTIFICATES” 的直接修复
你的答案:B(正确)
说明:用 apksigner(或兼容方案)正确签名,确保符合目标系统的签名要求(V1/V2 等)。
速记补充
- 只改资源:apktool d -s app.apk -o app_src → 改 res → apktool b … → zipalign → apksigner
- 只改 Smali:apktool d -r app.apk -o app_src(跳过资源)
- 多 dex:smali_classes2/3/…
- 查签名:apksigner verify --verbose --print-certs app.apk
需要我再出一套“Smali 定位与修改”的练习(含最小布尔开关改法与寄存器检查要点)吗?我可以给出具体类片段与正确改法的对比。
文章标题:5618apktool复习
文章链接:https://www.fangshaonian.cn/archives/138/
最后编辑:2025 年 11 月 14 日 18:48 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)