分享一下AI帮我写的XAPK 转apk脚本
最近搞国外的网站老遇到XAPK 就自己找东西 让ai写了一个 脚本。大家可以看看另外设置100个 回帖奖励吧~~~
import zipfile
import os
import shutil
import sys
import subprocess
def unzip_file(src, dst):
with zipfile.ZipFile(src, 'r') as z:
z.extractall(dst)
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
def copy_files(files, dst):
os.makedirs(dst, exist_ok=True)
for f in files:
shutil.copy(f, dst)
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)
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')
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)
os.makedirs(output_dir, exist_ok=True)
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')
if auto_install:
adb_install_multiple(apk_dir)
print('done:', output_dir)
if __name__ == '__main__':
if len(sys.argv) < 2:
print('usage: python xapk_to_apk.py app.xapk [--install]')
else:
xapk = sys.argv
out = sys.argv if len(sys.argv) > 2 and not sys.argv.startswith('--') else None
install_flag = '--install' in sys.argv
convert_xapk(xapk, out, install_flag) q2119990 发表于 2026-3-3 13:35
这个咋用,不懂这个
# xapk_turn_apk
###💡 简介
这是一个用 Python 编写的实用工具,用于处理 Android **`.xapk`** 文件。
`.xapk` 是一种特殊的 Android 应用程序包格式,它将基础 **`.apk`** 文件与大型游戏数据文件(通常是 **`.obb`** 文件)打包在一起。
本脚本可以帮助你:
1. 将 **`.xapk`** 文件解压,并自动提取出所有 **`.apk`** 文件和 **`.obb`** 数据文件。
2. (可选) 使用 **ADB (Android Debug Bridge)** 工具自动安装提取出的所有 `.apk` 文件。
### ⚙️ 使用方法
#### 🛠️ 前提条件
1. **Python 3:** 确保你的系统上安装了 Python 3。
2. **ADB:** 如果需要使用自动安装功能 (`--install`),请确保 ADB 已安装且在系统环境变量 (PATH) 中。
#### 🚀 运行脚本
将脚本保存为 `xapk_converter.py` 后,在命令行中执行以下命令:
| **功能** | **命令格式** | **结果** |
| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **仅转换** | `python xapk_converter.py app_name.xapk` | 在同目录下创建 `app_name` 文件夹,包含提取的 APK 和 OBB 文件。 |
| **指定输出目录** | `python xapk_converter.py app_name.xapk /path/to/output` | 将文件提取到指定的文件夹。 |
| **转换并安装** | `python xapk_converter.py app_name.xapk --install` | 转换完成后,尝试通过 ADB 安装所有 `.apk` 文件。 |
| **指定目录并安装** | `python xapk_converter.py app_name.xapk /path/to/output --install` | 转换到指定位置,并尝试通过 ADB 安装。 | 这是一个用于处理XAPK文件的Python脚本,我将逐行解释:
## 导入模块 (1-5行)
```python
import zipfile# 用于处理ZIP压缩文件
import os # 提供文件和目录操作功能
import shutil # 提供高级文件操作,如复制、移动
import sys # 访问命令行参数
import subprocess # 运行外部命令(如adb)
```
## 解压函数 (7-9行)
```python
def unzip_file(src, dst):
with zipfile.ZipFile(src, 'r') as z:
z.extractall(dst)
```
- **功能**:解压ZIP文件
- **src**:源文件路径
- **dst**:目标目录
- 使用`with`语句自动管理文件资源
## 查找文件函数 (11-17行)
```python
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行)
```python
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行)
```python
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行)
```python
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行)
```python
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)
os.makedirs(output_dir, exist_ok=True)
```
- 检查XAPK文件是否存在
- 如果没有指定输出目录,使用XAPK文件名(不含扩展名)
- 创建输出目录
```python
unzip_file(xapk_path, output_dir)
apk_dir = os.path.join(output_dir, 'apk')
obb_dir = os.path.join(output_dir, 'obb')
```
- 解压XAPK文件
- 定义APK和OBB的目标目录
```python
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文件夹
```python
if auto_install:
adb_install_multiple(apk_dir)
print('done:', output_dir)
```
- 如果启用了自动安装,调用ADB安装函数
- 输出完成信息
## 主程序入口 (69-76行)
```python
if __name__ == '__main__':
if len(sys.argv) < 2:
print('usage: python xapk_to_apk.py app.xapk [--install]')
else:
xapk = sys.argv
out = sys.argv if len(sys.argv) > 2 and not sys.argv.startswith('--') else None
install_flag = '--install' in sys.argv
convert_xapk(xapk, out, install_flag)
```
- 检查命令行参数
- 解析参数:
- 第一个参数:XAPK文件路径
- 第二个参数(可选):输出目录(不以"--"开头)
- 检查是否包含"--install"标志
- 调用主转换函数
## 使用示例
```bash
# 基本用法
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
``` 这个咋用,不懂这个 一般都是用XAPK Installer直接安装 现在要得到这个xapk文件也不容易了 虽然看不懂,但觉得很厉害{:1_918:} 大佬,看着很厉害! 这个ai竟然没写代码注释 可以直接做成一个小工具 不错不错,感谢楼主,解决了我一个大问题,拿来试试看