autool/utils_android/download_app/apks_export_import.py
2026-06-17 19:44:18 +08:00

115 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 导入 ADB Helper 而不是 download_controller.run_cmd
import sys
import os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
from adb_helper import ADBHelper
from DroidBot.exceptions import ADBException
import re
# 延迟初始化的 ADB Helper 实例
# 不在模块导入时创建,避免设备未连接时导入失败
_adb_helper = None
def _get_adb_helper():
"""获取 ADB Helper 实例(延迟初始化)
避免在模块导入时就尝试连接设备,这样可以让主进程有机会
先恢复模拟器,再执行 ADB 相关操作。
Returns:
ADBHelper 实例
Raises:
ADBException: 设备未连接时抛出
"""
global _adb_helper
if _adb_helper is None:
_adb_helper = ADBHelper()
return _adb_helper
def reset_runtime_state():
"""清空模块级 ADBHelper避免模拟器重启后复用旧连接。"""
global _adb_helper
_adb_helper = None
def extract_apk_names(path_string):
"""从 pm path 输出中提取所有 APK 路径"""
return re.findall(r'package:(/[^\s]+\.apk)', path_string)
def get_file_paths(folder):
"""获取文件夹下所有文件的完整路径"""
return [os.path.join(folder, f) for f in os.listdir(folder)
if os.path.isfile(os.path.join(folder, f))]
def export_multi_apk(package_name, export_path):
path_list = []
try:
output = _get_adb_helper().shell(f"pm path {package_name}")
apk_list = extract_apk_names(output)
if not apk_list:
print(f'未找到应用 {package_name} 的 APK 文件')
return 0
dir_path = os.path.join(export_path, package_name)
os.makedirs(dir_path, exist_ok=True)
print(f"导出目录: {dir_path}")
for apk_path in apk_list:
path_list.append(apk_path)
_get_adb_helper().run_cmd(['pull', apk_path, dir_path])
except Exception as e:
print(e)
if len(path_list) != 0:
print(f'导出应用{package_name}成功: {len(path_list)}个apk文件')
else:
print(f'导出应用{package_name}失败: {len(path_list)}个apk文件')
return len(path_list)
def import_multi_apk(adb_target, package_name):
folder = r'{0}\{1}'.format(export_path, package_name)
print(folder)
print(f"尝试导入{package_name}应用apks")
print(f"文件路径:{folder}")
multi_path = ''
if os.path.isdir(folder):
print("找到的文件:")
for path in get_file_paths(folder):
print(path)
multi_path = multi_path + ' ' + path
else:
print("无效路径")
import_state = 1
try:
if len(multi_path) != 0:
multi_path = multi_path
# 使用 ADBHelper 安装多个 APK延迟初始化
apk_list = multi_path.strip().split()
_get_adb_helper().install_multiple(apk_list)
import_state = 0
else:
print(f'未找到应用apk文件')
except Exception as e:
print(f'导入apks发生错误{e}')
if import_state == 0:
print(f'导入应用{package_name}成功')
elif import_state == 1:
print(f'导入应用{package_name}失败')
return import_state
if __name__ == '__main__':
export_multi_apk('com.google.android.youtube', './saveapk')