# 导入 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')