115 lines
3.3 KiB
Python
115 lines
3.3 KiB
Python
|
||
# 导入 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')
|
||
|