【使用Python和ADB过滤与处理Android包名】

简介

在开发和调试Android应用时,获取和处理设备上的应用包名是一项常见任务。通过ADB(Android Debug Bridge),我们可以轻松列出设备上的所有包名。本文将介绍如何使用Python脚本获取这些包名,并通过灵活的过滤条件筛选出我们感兴趣的包名。

环境准备

首先,确保你已经在系统中安装了ADB工具,并且已经将设备通过USB连接到电脑。你可以在终端中运行以下命令,来验证ADB是否正常工作:

bash 复制代码
adb devices

如果显示了连接的设备列表,说明ADB已经正常工作。

Python脚本

下面是我们要实现的Python脚本。这个脚本会执行ADB命令获取所有的包名,并通过一些预定义的过滤条件筛选出最终结果。

python 复制代码
import subprocess

def get_third_party_packages():
    try:
        # 执行ADB命令,获取所有第三方应用包名
        result = subprocess.run(['adb', 'shell', 'pm', 'list', 'packages'], capture_output=True, text=True, check=True)
        
        # 包名过滤关键字列表
        filter_keywords = ['server', 'engineermode']
        # 完整包名匹配(删除这些包名)
        exact_matches = ['com.android.car.settings']
        # 以特定词结尾(删除以.android结尾的包名)
        ends_with = ['.android']
        
        packages = result.stdout.splitlines()
        filtered_packages = []
        
        for pkg in packages:
            pkg_name = pkg.replace('package:', '')
            # 过滤逻辑
            if (all(keyword not in pkg_name for keyword in filter_keywords) and
                all(not pkg_name.endswith(suffix) for suffix in ends_with) and
                pkg_name not in exact_matches):
                filtered_packages.append(pkg_name)
        
        return filtered_packages
    except subprocess.CalledProcessError as e:
        print(f"An error occurred while executing adb command: {e}")
        return []

def write_packages_to_file(packages, filename):
    try:
        with open(filename, 'w') as file:
            for pkg in packages:
                file.write(pkg + '\n')
    except IOError as e:
        print(f"An error occurred while writing to the file: {e}")

if __name__ == "__main__":
    packages = get_third_party_packages()
    write_packages_to_file(packages, 'packages.txt')
    print("Packages have been written to packages.txt")
脚本解析
  • get_third_party_packages:

    • 这个函数首先执行adb shell pm list packages命令来获取设备上的所有包名。
    • 通过过滤条件来筛选包名,确保我们最终获取到的包名不包含某些不需要的关键字或特定格式。
  • filter_keywords:

    • 这个列表包含我们想要过滤掉的包名中不希望包含的关键字,如'server''engineermode'
  • exact_matches:

    • 列表中的包名会被完整匹配,并从结果中过滤掉,如'com.android.car.settings'
  • ends_with:

    • 包名以特定词结尾时会被过滤掉,如以.android结尾的包名。
  • write_packages_to_file:

    • 这个函数将最终过滤后的包名写入到指定的文本文件中。
灵活的过滤条件

通过将过滤条件提取到列表中,脚本的扩展性和可维护性得到了极大提高。你可以根据需要,轻松地添加或删除过滤条件,而无需深入理解脚本的逻辑。

结论

使用这个简单的Python脚本,我们可以轻松地从设备中提取并处理应用包名。这对于需要分析或管理Android设备上安装的应用程序的开发人员和测试人员来说,是非常有用的工具。


相关推荐
叫我DPT8 分钟前
Python 中 `finally` 的执行时机与 `return` 的微妙关系
python
CodeClimb1 小时前
【华为OD-E卷 - 最大矩阵和 100分(python、java、c++、js、c)】
java·c++·python·华为od·矩阵
aiweker3 小时前
Selenium 使用指南:从入门到精通
python·selenium·测试工具
SteveKenny4 小时前
Python 梯度下降法(六):Nadam Optimize
开发语言·python
dreadp6 小时前
解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩
图像处理·python·opencv·计算机视觉·数据分析
Tester_孙大壮6 小时前
第32章 测试驱动开发(TDD)的原理、实践、关联与争议(Python 版)
驱动开发·python·tdd
小王子102410 小时前
设计模式Python版 组合模式
python·设计模式·组合模式
Mason Lin11 小时前
2025年1月22日(网络编程 udp)
网络·python·udp
清弦墨客11 小时前
【蓝桥杯】43697.机器人塔
python·蓝桥杯·程序算法
恋猫de小郭13 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio