这是一个用于处理XAPK文件的Python脚本,我将逐行解释:
导入模块 (1-5行)
import zipfile # 用于处理ZIP压缩文件
import os # 提供文件和目录操作功能
import shutil # 提供高级文件操作,如复制、移动
import sys # 访问命令行参数
import subprocess # 运行外部命令(如adb)
解压函数 (7-9行)
def unzip_file(src, dst):
with zipfile.ZipFile(src, 'r') as z:
z.extractall(dst)
- 功能:解压ZIP文件
- src:源文件路径
- dst:目标目录
- 使用
with语句自动管理文件资源
查找文件函数 (11-17行)
def find_files(base, ext):
result = []
for root, _, files in os.walk(base):
for f in files:
if f.endswith(ext):
result.append(os.path.join(root, f))
return result
- 功能:递归查找指定扩展名的所有文件
- os.walk:遍历目录树,返回(root, dirs, files)
- 忽略目录名(用
_占位)
- 匹配文件扩展名并返回完整路径列表
复制文件函数 (19-24行)
def copy_files(files, dst):
os.makedirs(dst, exist_ok=True)
for f in files:
shutil.copy(f, dst)
- 功能:将文件列表复制到目标目录
exist_ok=True:如果目录存在也不会报错
shutil.copy:复制文件(不保留元数据)
复制obb文件夹函数 (26-30行)
def copy_obb(base, dst):
for root, dirs, _ in os.walk(base):
for d in dirs:
if d == 'obb':
shutil.copytree(os.path.join(root, d), os.path.join(dst, d), dirs_exist_ok=True)
- 功能:查找并复制名为"obb"的文件夹
- OBB是Android应用的扩展数据文件
dirs_exist_ok=True:允许覆盖已存在的目录
ADB安装函数 (32-44行)
def adb_install_multiple(apk_dir):
apk_list = sorted(find_files(apk_dir, '.apk'))
if not apk_list:
print('no apk files to install')
return
print('installing via adb...')
cmd = ['adb', 'install-multiple'] + apk_list
try:
subprocess.run(cmd, check=True)
print('install success')
except subprocess.CalledProcessError:
print('install failed')
- 功能:使用adb安装多个APK文件
adb install-multiple:Android命令,同时安装多个APK
check=True:如果命令执行失败会抛出异常
- 异常处理捕获安装失败的情况
主转换函数 (46-67行)
def convert_xapk(xapk_path, output_dir=None, auto_install=False):
if not os.path.exists(xapk_path):
print('file not found')
return
if output_dir is None:
output_dir = os.path.splitext(xapk_path)[0]
os.makedirs(output_dir, exist_ok=True)
- 检查XAPK文件是否存在
- 如果没有指定输出目录,使用XAPK文件名(不含扩展名)
- 创建输出目录
unzip_file(xapk_path, output_dir)
apk_dir = os.path.join(output_dir, 'apk')
obb_dir = os.path.join(output_dir, 'obb')
apk_files = find_files(output_dir, '.apk')
if apk_files:
copy_files(apk_files, apk_dir)
print('apk extracted')
copy_obb(output_dir, obb_dir)
print('obb extracted')
- 查找所有APK文件并复制到apk目录
- 查找并复制obb文件夹
if auto_install:
adb_install_multiple(apk_dir)
print('done:', output_dir)
- 如果启用了自动安装,调用ADB安装函数
- 输出完成信息
主程序入口 (69-76行)
if __name__ == '__main__':
if len(sys.argv) < 2:
print('usage: python xapk_to_apk.py app.xapk [output_dir] [--install]')
else:
xapk = sys.argv[1]
out = sys.argv[2] if len(sys.argv) > 2 and not sys.argv[2].startswith('--') else None
install_flag = '--install' in sys.argv
convert_xapk(xapk, out, install_flag)
- 检查命令行参数
- 解析参数:
- 第一个参数:XAPK文件路径
- 第二个参数(可选):输出目录(不以"--"开头)
- 检查是否包含"--install"标志
- 调用主转换函数
使用示例
# 基本用法
python xapk_to_apk.py app.xapk
# 指定输出目录
python xapk_to_apk.py app.xapk output_folder
# 解压并自动安装
python xapk_to_apk.py app.xapk --install
# 指定输出目录并安装
python xapk_to_apk.py app.xapk output_folder --install