杰瑞科技汇

Python如何调用Android API?

最主流、最强大、最灵活的方式是使用 pure-python-adb 库,它允许你通过 Python 脚本直接执行 ADB (Android Debug Bridge) 命令,从而控制你的 Android 设备。

Python如何调用Android API?-图1
(图片来源网络,侵删)

下面我将分步介绍如何实现这一点。


核心概念:ADB (Android Debug Bridge)

ADB 是一个强大的命令行工具,它允许你与模拟器或连接的 Android 设备进行通信,ADB 是整个过程的桥梁,你的 Python 脚本会发送命令给 ADB,ADB 再在 Android 设备上执行这些命令并返回结果。

ADB 的主要功能:

  • 安装和调试应用。
  • 访问 Unix Shell (可以执行 shell 命令)。
  • 管理模拟器或手机上的端口映射。
  • 在设备上复制文件。

使用 pure-python-adb 库 (推荐)

这是最推荐的方法,因为它不依赖 Java 环境,安装简单,功能全面。

Python如何调用Android API?-图2
(图片来源网络,侵删)

步骤 1:准备工作

  1. 开启开发者选项和 USB 调试

    • 在你的 Android 手机或模拟器上,进入 设置 -> 关于手机
    • 连续点击 版本号内部版本号 7次左右,直到提示“您已处于开发者模式”。
    • 返回 设置 -> 系统 -> 开发者选项
    • 打开 USB 调试 开关。
  2. 安装 ADB

    • Windows: 最简单的方式是安装 Android Studio,它会自动为你配置好 ADB,或者,你可以下载 Platform Tools 并将其 platform-tools 文件夹路径添加到系统环境变量 PATH 中。
    • macOS / Linux: 通常可以通过包管理器安装。
      • macOS (使用 Homebrew): brew install android-platform-tools
      • Ubuntu/Debian: sudo apt-get install android-tools-adb
  3. 连接设备

    • 通过 USB 连接: 使用 USB 线将手机连接到电脑,并在手机弹出的窗口中允许 USB 调试。
    • 通过 Wi-Fi 连接 (推荐,更方便):
      1. 确保 手机和电脑在同一个 Wi-Fi 网络下。
      2. 通过 USB 连接手机,在命令行执行 adb tcpip 5555 (5555 是默认端口,可以自定义)。
      3. 断开 USB 线。
      4. 在电脑上执行 adb connect <手机的IP地址>:5555adb connect 192.168.1.10:5555
      5. 之后你的设备就会一直保持无线连接状态,直到你执行 adb disconnect
  4. 验证连接

    Python如何调用Android API?-图3
    (图片来源网络,侵删)
    • 在电脑的命令行中输入 adb devices,你应该能看到你的设备列表,并显示为 device 状态。
      List of devices attached
      192.168.1.10:5555   device

步骤 2:安装 Python 库

打开你的终端或命令提示符,安装 pure-python-adb

pip install pure-python-adb

步骤 3:编写 Python 脚本

现在你可以开始编写 Python 代码来与你的 Android 设备交互了。

示例 1:获取设备信息

from adb import adb_device
from adb.adb_device import AdbDeviceUsb, AdbDeviceTcp
import time
# --- 1. 连接到设备 ---
# 自动查找通过USB连接的设备
try:
    device = AdbDeviceUsb().find()
    if not device:
        raise ConnectionError("未找到通过USB连接的设备,请确保已开启USB调试并连接。")
    print(f"已通过USB连接到设备: {device.serial}")
except Exception as e:
    print(f"USB连接失败: {e}")
    # 如果USB失败,可以尝试TCP连接 (需要先配置好无线连接)
    try:
        device = AdbDeviceTcp("192.168.1.10", 5555) # 替换成你的设备IP和端口
        device.connect()
        print(f"已通过TCP连接到设备: {device.serial}")
    except Exception as e_tcp:
        print(f"TCP连接也失败: {e_tcp}")
        exit()
# --- 2. 执行 ADB 命令并获取输出 ---
# 获取设备型号
model = device.shell("getprop ro.product.model")
print(f"设备型号: {model.strip()}")
# 获取Android系统版本
android_version = device.shell("getprop ro.build.version.release")
print(f"Android版本: {android_version.strip()}")
# 获取屏幕分辨率
resolution = device.shell("wm size")
print(f"屏幕分辨率: {resolution.strip()}")
# 检查Wi-Fi IP地址
ip_address = device.shell("ip addr show wlan0 | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}'")
print(f"Wi-Fi IP地址: {ip_address.strip() if ip_address else '未连接Wi-Fi'}")
# --- 3. 安装和卸载应用 ---
# 注意:你需要一个真实的APK文件路径
# apk_path = "/path/to/your/app.apk"
# print(f"正在安装应用: {apk_path}")
# device.install(apk_path)
# print("应用安装成功!")
# # 卸载应用 (包名)
# package_name = "com.example.myapp"
# print(f"正在卸载应用: {package_name}")
# device.uninstall(package_name)
# print("应用卸载成功!")
# --- 4. 截屏 ---
print("正在截屏...")
device.shell("screencap -p /sdcard/screenshot.png")
# 从设备拉取截图到电脑
device.pull("/sdcard/screenshot.png", "screenshot_from_python.png")
print("截图已保存为 'screenshot_from_python.png'")
# --- 5. 启动一个应用 (包名/Activity名) ---
# 启动浏览器
# device.shell("am start -a android.intent.action.VIEW -d https://www.google.com")
time.sleep(2) # 等待2秒
device.close() # 关闭连接

示例 2:自动化操作 (点击、输入)

自动化操作通常需要借助 UI 自动化框架,如 uiautomator2pure-python-adb 本身不直接提供 UI 元素定位,但它可以启动这些框架的服务。

准备工作: 在设备上安装 uiautomator2 的服务器端。

adb shell pm install -r --user 0 https://github.com/openatx/uiautomator2/releases/download/v2.16.3/app-uiautomator2-v2.16.3.apk
adb shell pm grant --user 0 com.github.uiautomator

Python 脚本示例:

from adb import adb_device
import uiautomator2 as u2
# 连接到设备
# 使用uiautomator2的连接方式,它会自动处理ADB连接
d = u2.connect("192.168.1.10:5555") # 替换成你的设备IP和端口
# 1. 点击屏幕上的某个坐标 (x, y)
# 假设我们要点击屏幕中央
# width, height = d.window_size()
# x, y = width // 2, height // 2
# d.click(x, y)
# print(f"已点击坐标: ({x}, {y})")
# 2. 启动一个应用并输入文本
# 启动设置应用
d.app_start("com.android.settings")
print("已启动 '设置' 应用")
# 等待应用启动并找到 "关于手机" 的文本元素
about_element = d(text="关于手机").wait.exists(timeout=10000)
if about_element:
    print("找到 '关于手机' 元素,正在点击...")
    about_element.click()
    print("已点击 '关于手机'")
else:
    print("未找到 '关于手机' 元素")
# 等待并找到 "版本号" 元素,并点击几次来激活开发者选项
version_element = d(text="版本号").wait.exists(timeout=5000)
if version_element:
    print("找到 '版本号' 元素,正在快速点击7次...")
    for i in range(7):
        version_element.click()
        time.sleep(0.1)
    print("已快速点击7次,开发者选项已激活!")
else:
    print("未找到 '版本号' 元素")
# 回到桌面
d.press("home")
print("已返回桌面")
# 关闭所有后台应用
d.press("recent")
time.sleep(1)
# 关闭第一个应用卡片
d(resourceId="com.android.systemui:id/dismiss_task").click()
d.session("uiautomator2").close() # 关闭uiautomator2会话

使用 SL4A (Scripting Layer for Android)

这是一种比较老但仍然有效的方法,它的原理是:在 Android 设备上安装一个 SL4A 服务器和 Python 解释器,然后你的 Python 脚本(部分)可以直接在设备上运行,从而直接调用 Android API。

工作流程:

  1. 在手机上安装: 你需要在手机上安装 SL4A 应用、Python for Android 解释器以及一些 Android API 的库(如 api_sl4a.py, android.py)。
  2. 编写脚本: Python 脚本通过一个 socket 连接到手机上的 SL4A 服务器。
  3. 调用 API: 连接成功后,你就可以调用 android 模块里的函数来操作手机,如 makeToast(), vibrate(), startActivity() 等。

优点:

  • Python 代码直接在 Android 环境中执行,响应速度快。
  • 可以直接访问 Android 硬件传感器(加速度计、GPS等)。

缺点:

  • 配置极其复杂,需要在手机上手动安装一堆依赖。
  • 社区不活跃,文档和教程都比较陈旧。
  • 灵活性不如 pure-python-adb + uiautomator2 的组合。

简单示例代码 (需要先在手机上配置好SL4A):

import socket
import json
# SL4A 默认端口是 9999
HOST, PORT = '192.168.1.10', 9999
# 连接到手机上的SL4A服务
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
# 发送一个RPC请求,调用Android的makeToast函数
# RPC协议是JSON格式
rpc_call = {
    "id": 1,
    "method": "call",
    "params": ["self", "makeToast", "Hello from Python via SL4A!"]
}
# 发送请求
s.sendall((json.dumps(rpc_call) + '\n').encode())
# 接收响应
response = s.recv(1024)
print(f"SL4A 响应: {response.decode()}")
s.close()

总结与对比

特性 pure-python-adb (推荐) SL4A
工作原理 Python在电脑上,通过ADB命令控制手机 Python脚本在手机上运行
安装配置 简单 (只需安装ADB和Python库) 复杂 (需在手机上安装多个组件)
主要用途 自动化测试、设备管理、文件操作、UI自动化 (配合uiautomator2) 快速原型开发、直接调用Android API
性能 依赖ADB命令,有网络/USB延迟 ,直接在设备上执行
灵活性 极高,几乎可以执行任何ADB命令 受限于SL4A提供的API
社区与维护 活跃,是当前自动化测试的主流选择 不活跃,项目较老

对于绝大多数 Python 与 Android 交互的需求,特别是自动化测试、UI操作、设备管理等场景,使用 pure-python-adb (通常结合 uiautomator2) 是最佳选择,它简单、强大且社区支持良好。

只有当你需要开发一个直接运行在手机上的、需要实时访问传感器等硬件资源的 Python 应用时,才需要考虑 SL4A

分享:
扫描分享到社交APP
上一篇
下一篇