Python 实现 apk 信息解析

203 阅读1分钟

相关代码

需要依赖 aapt 来实现, aapt 位于 ANDROID_HOME/build-tools/33.0.2 下,之所以用 Python,是因为想人生苦短,用 Python 就对了

import os
import re
import subprocess

apk_path = "E://app-manongbao-arm64-v8a-release.apk"
ANDROID_HOME = os.getenv('ANDROID_HOME')
#获取当前操作系统
current_os = os.name

# 根据当前操作系统选择换行符
if current_os == 'nt':  # Windows系统
    line_break = '\r\n'
elif current_os == 'posix':  # Linux、Unix-like系统
    line_break = '\n'
else:  # 其他操作系统,默认使用换行符'\n'
    line_break = '\n'

# 使用aapt命令获取APK信息 (apk_path:替换为你的APK文件路径)

command = ['aapt', 'dump', 'badging', apk_path]
os.chdir("{}/build-tools/33.0.2".format(ANDROID_HOME))
result = subprocess.run(command, capture_output=True)

# 解析输出以获取常见信息
output = result.stdout.decode('utf-8', 'ignore')
lines = output.split(line_break)

package_name = re.search(r"package: name='(.*?)'", lines[0]).group(1)
version_code = re.search(r"versionCode='(.*?)'", lines[0]).group(1)
version_name = re.search(r"versionName='(.*?)'", lines[0]).group(1)
sdk_version = re.search(r"sdkVersion:'(.*?)'", lines[1]).group(1)

app_name = ""
for i in range(0,len(lines)):
    search = re.search(r"application-label:'(.*?)'", lines[i])
    if search == None:
        continue

    if len(app_name) == 0:
        app_name = search.group(1)
        break
    

is_arch32 = lines[len(lines)-2].find("armeabi-v7a") != -1 or lines[len(lines)-2].find("armeabi") != -1
is_arch64 = lines[len(lines)-2].find("arm64-v8a") != -1

# 打印获取的信息
print("App Name:", app_name)
print("Package Name:", package_name)
print("Version Code:", version_code)
print("Version Name:", version_name)
print("SDK Version:", sdk_version)
print("是否支持32位:", is_arch32)
print("是否支持64位:", is_arch64)

我这边的的输出结果是:

App Name: 码农宝
Package Name: com.lujianfei.phoneinfo
Version Code: 38
Version Name: 4.7
SDK Version: 21
是否支持32位: False
是否支持64位: True