You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python从Android应用包名获取应用标签名称

如何通过Python从Android应用包名获取应用标签名称

嘿,我来帮你搞定这个问题!你已经能成功获取到Android应用的包名了,接下来要拿到对应的应用标签其实并不难,不用在dumpsys里乱找啦,我给你分享两个实用的Python实现方法~

方法一:逐个查询单包的应用标签(适合单包或少量包处理)

这个方法通过adb shell pm dump命令获取单个包的详细信息,再用Python解析出应用标签。如果标签是资源ID形式,还可以进一步用aapt工具解析(aapt是Android SDK build-tools里的工具,记得把它加到系统环境变量里哦)。

import subprocess
import re

def get_app_label(package_name):
    try:
        # 执行adb命令获取目标包的详细信息
        result = subprocess.check_output(
            ["adb", "shell", "pm", "dump", package_name],
            stderr=subprocess.STDOUT,
            text=True
        )
        # 正则匹配直接显示的应用标签
        label_match = re.search(r"label=(.*?)\n", result)
        if label_match:
            return label_match.group(1).strip()
        # 如果标签是资源ID形式,调用解析函数
        res_id_match = re.search(r"labelRes=0x[0-9a-fA-F]+", result)
        if res_id_match:
            res_id = res_id_match.group().split("=")[1]
            return get_label_from_resource(package_name, res_id)
        return "未找到应用标签"
    except subprocess.CalledProcessError as e:
        return f"获取失败:{e.output.strip()}"

def get_label_from_resource(package_name, res_id):
    # 解析资源ID对应的标签文本
    try:
        result = subprocess.check_output(
            ["aapt", "dump", "resources", package_name, "--values"],
            stderr=subprocess.STDOUT,
            text=True
        )
        res_match = re.search(rf"{res_id}\s+.*?\s+(.*?)\n", result)
        return res_match.group(1).strip() if res_match else "资源ID解析失败"
    except Exception as e:
        return f"解析资源ID出错:{str(e)}"

# 使用示例
if __name__ == "__main__":
    package = "com.android.settings"
    print(f"应用标签:{get_app_label(package)}")

方法二:批量获取所有应用的标签(适合批量包处理)

如果需要处理大量包名,逐个查询效率太低,你可以一次性获取设备上所有应用的包名和标签映射,之后直接根据包名查找即可,效率会高很多。

import subprocess
import re

def get_all_app_labels():
    app_label_map = {}
    try:
        # 执行dumpsys命令获取所有应用的包信息
        result = subprocess.check_output(
            ["adb", "shell", "dumpsys", "package", "packages"],
            stderr=subprocess.STDOUT,
            text=True
        )
        # 正则匹配所有包名和对应的标签
        pattern = r"Package \[([a-zA-Z0-9\.]+)\].*?label=(.*?)\n"
        matches = re.findall(pattern, result, re.DOTALL)
        for package, label in matches:
            cleaned_package = package.strip()
            cleaned_label = label.strip()
            # 如果标签为空,用包名代替
            app_label_map[cleaned_package] = cleaned_label if cleaned_label else cleaned_package
        return app_label_map
    except subprocess.CalledProcessError as e:
        print(f"执行命令出错:{e.output.strip()}")
        return app_label_map

# 使用示例
if __name__ == "__main__":
    all_labels = get_all_app_labels()
    # 查找指定包的标签
    target_package = "com.tencent.mm"
    print(f"{target_package}的应用标签:{all_labels.get(target_package, '未找到')}")

一些注意事项

  • 确保你的设备已经开启USB调试,并且可以通过adb devices命令看到设备(如果没识别到,检查USB连接模式或者驱动)
  • 应用标签会跟随设备的系统语言变化,你获取到的是当前设备语言环境下的显示名称
  • 少数系统核心应用可能需要特殊权限,但大部分普通应用和常用系统应用都能直接获取标签
  • 不同品牌的Android设备,pm dump或dumpsys的输出格式可能略有差异,如果正则匹配失败,可以手动执行对应的adb命令(比如adb shell pm dump com.android.settings),查看输出结构后微调正则表达式

备注:内容来源于stack exchange,提问作者martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:48:07