提取APK路径
使用adb shell中的pm指令,可以获取到所有应用的安装路径
adb shell pm list package -f
结果是类似于这种
package:/vendor/overlay/WifiResMainlineOverlay/WifiResMainlineOverlay.apk=com.android.wifi.mainline.resources.overlay
package:/product/overlay/DisplayCutoutEmulationTall/DisplayCutoutEmulationTallOverlay.apk=com.android.internal.display.cutout.emulation.tall
package:/data/app/~~JwpHJZ8nzv5pbUlphtekiw==/in.amazon.mShop.android.shopping-iWC3XFdrdoPcAoaxOo1Uhg==/base.apk=in.amazon.mShop.android.shopping
package:/system/priv-app/MtkMmsService/MtkMmsService.apk=com.android.mms.service
如果单个提取的话就直接pull就好了,如果很多的话还是用脚本来处理吧
import subprocess
import os
def extract_apks():
# 执行adb shell命令获取手机上安装的所有应用包名
package_names = subprocess.check_output(["adb", "shell", "pm", "list", "packages", "-f"]).decode("utf-8").splitlines()
apk_path_base = {}
apk_paths = []
# 提取包名中的apk路径并保存到列表中
for line in package_names:
if line.startswith("package:"):
path = line.rsplit("=", 1)[0].split(":")[1]
if path.endswith("base.apk"):
apk_path_base[path] = line.rsplit("=", 1)[1].replace(".", "_") + ".apk"
else:
apk_paths.append(path)
# 创建保存APK文件的目录
output_dir = "extracted_apks"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 使用adb pull命令将APK文件从手机中提取到本地目录
for apk_path in apk_paths:
apk_file_name = os.path.basename(apk_path)
output_path = os.path.join(output_dir, apk_file_name)
subprocess.call(["adb", "pull", apk_path, output_path])
print(f"Extracted: {output_path}")
print("------------------------------------")
for apk_path, value in apk_path_base.items():
#apk_file_name = os.path.basename(apk_path)
apk_file_name = os.path.basename(value)
output_path = os.path.join(output_dir, apk_file_name)
subprocess.call(["adb", "pull", apk_path, output_path])
print(f"Extracted: {output_path}")
if __name__ == "__main__":
extract_apks()
解压所有apk
还是用脚本对提取出来的apk进行解压
import os
import zipfile
def extract_apks(source_folder, target_folder):
# 遍历match文件夹下的所有文件
for file_name in os.listdir(source_folder):
if file_name.endswith('.apk'): # 如果文件是APK文件
# 获取APK文件的路径
apk_path = os.path.join(source_folder, file_name)
# 创建解压后的文件夹路径
folder_name = os.path.splitext(file_name)[0] # 移除文件扩展名
target_path = os.path.join(target_folder, folder_name)
# 创建目标文件夹
if not os.path.exists(target_path):
os.makedirs(target_path)
# 解压APK文件到目标文件夹
with zipfile.ZipFile(apk_path, 'r') as zip_ref:
zip_ref.extractall(target_path)
print(f"Extracted: {apk_path} to {target_path}")
if __name__ == "__main__":
source_folder = "extracted_apks" # 包含所有APK文件的文件夹路径
target_folder = "extracted_zips" # 解压后的文件夹路径
extract_apks(source_folder, target_folder)