# -*- coding: utf-8 -*- """把一个 dex 塞进已由 aapt2 生成的 APK 里。 用 zipfile 而不是 jar 命令:jar 会顺手写入 META-INF/MANIFEST.MF, 对 APK 来说是不必要的额外内容。 """ from __future__ import annotations import shutil import sys import zipfile from pathlib import Path def add_dex(apk_path: str, dex_path: str) -> int: apk = Path(apk_path) dex = Path(dex_path) if not apk.is_file(): print(f"找不到 APK: {apk}") return 1 if not dex.is_file(): print(f"找不到 classes.dex: {dex}") return 1 tmp = apk.with_suffix(".tmp.apk") with zipfile.ZipFile(apk, "r") as src, \ zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) as dst: for item in src.infolist(): if item.filename == "classes.dex": continue dst.writestr(item, src.read(item.filename)) dst.write(dex, "classes.dex") shutil.move(str(tmp), str(apk)) size = apk.stat().st_size print(f"已写入 classes.dex -> {apk.name} ({size / 1024:.1f} KB)") return 0 if __name__ == "__main__": if len(sys.argv) != 3: print("用法: python pack_apk.py ") sys.exit(2) sys.exit(add_dex(sys.argv[1], sys.argv[2]))