Skip to content

pure python adb library for google adb service.

License

Notifications You must be signed in to change notification settings

williamfzc/adbutils

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

49 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

adbutils

Build Status PyPI

Python adb library for adb service (Only support Python3.6+)

Install

pip install adbutils

Usage

Example

Connect ADB Server

import adbutils

adb = adbutils.AdbClient(host="127.0.0.1", port=5037)
print(adb.devices())

The above code can be short to from adbutils import adb

List all the devices and get device object

from adbutils import adb

for d in adb.devices():
    print(d.serial) # print device serial

d = adb.device(serial="33ff22xx")

# You do not need to offer serial if only one device connected
# RuntimeError will be raised if multi device connected
d = adb.device()

The following code will not write from adbutils import adb for short

Connect remote device

Same as command adb connect

output = adb.connect("127.0.0.1:5555")
print(output)
# output: already connected to 127.0.0.1:5555

List forward

Same as adb forward --list

# list all forwards
for item in adb.forward_list():
    print(item.serial, item.local, item.remote)
    # 8d1f93be tcp:10603 tcp:7912
    # 12345678 tcp:10664 tcp:7912

# list only one device forwards
for item in adb.forward_list("8d1f93be"):
    print(item.serial, item.local, item.remote)
    # 8d1f93be tcp:10603 tcp:7912
    # 12345678 tcp:10664 tcp:7912

Run shell command and transfer files

I assume there is only one device connected.

import io
from adbutils import adb

d = adb.device()

print(d.serial) # 获取序列号
print(d.shell(["getprop", "ro.serial"])) # 获取Prop信息
d.sync.push(io.BytesIO(b"Hello Android"), "/data/local/tmp/hi.txt") # 推送文件

# 读取文件
for chunk in d.sync.iter_content("/data/local/tmp/hi.txt"):
    print("Chunk", chunk)

# 拷贝到本地
d.sync.pull("/data/local/tmp/hi.txt", "hi.txt")

# 获取包的信息
info = d.package_info("com.example.demo")
if info:
    print(info) # expect {"version_name": "1.2.3", "version_code": "12", "signature": "0xff132"}

Run in command line 命令行使用

# List devices
$ python -m adbutils -l
8d1f93be              MI 5s
192.168.190.101:5555  Google Nexus 5X - 7.0.0 - API 24 - 1080x1920

# Show adb server version
$ python -m adbutils -V
39

# Install apk from local filesystem 安装本地apk(带有进度)
$ python -m adbutils -i some.apk
# Install apk from URL 通过URL安装apk(带有进度)
$ python -m adbutils -i http://example.com/some.apk

# Uninstall 卸载应用
$ python -m adbutils -u com.github.example

# List installed packages 列出所有应用
$ python -m adbutils --list-packages
com.android.adbkeyboard
com.buscode.whatsinput
com.finalwire.aida64
com.github.uiautomator

For more usage, please see the code for details. (Sorry I'm too lazy.)

Extra Functions

AdbUtils provided some custom functions for some complex operations.

You can use it like this:

# simulate click
d.click(100, 100)

# swipe from(10, 10) to(200, 200) 500ms
d.swipe(10, 10, 200, 200, 0.5)

d.list_packages()
# example output: ["com.example.hello"]

d.window_size() 
# example output: (1080, 1920)

d.rotation()
# example output: 1
# other possible valus: 0, 1, 2, 3

d.package_info("com.github.uiautomator")
# example output: {"version_name": "1.1.7", "version_code": "1007"}

d.keyevent("HOME")

# There still too many functions, please see source codes

For further usage, please read mixin.py for details.

Logcat

Logcat is really important in android development and test. And you can use it easily:

import adbutils
import time

adb = adbutils.AdbClient(host="127.0.0.1", port=5037)
device = adb.device()

# clean logcat before catching
device.logcat.clean()

# start catching log, and save them to /sdcard/something.txt (in your phone)
device.logcat.start('/sdcard/something.txt')
# with some extra args?
# same as: `adb logcat -v long ActivityManager:I *:S`
device.logcat.start('/sdcard/something.txt', arg_str='-v long ActivityManager:I *:S')

time.sleep(5)
# and you can sync the log file anytime
device.logcat.sync_to_pc('./something1.txt')
time.sleep(5)

# stop catching log
device.logcat.stop()
# or you can stop it and pull it to your pc easily
device.logcat.stop('./something1.txt')
# with removing the origin file in your phone?
device.logcat.stop('./something1.txt', remove=True)

More about logcat: awesome-adb

Develop

git clone https://github.com/openatx/adbutils adbutils
pip install -e adbutils # install as development mode

Now you can edit code in adbutils and test with

import adbutils
# .... test code here ...

Run tests requires one device connected to your computer

# change to repo directory
cd adbutils

pip install pytest
pytest tests/

Thanks

LICENSE

MIT

About

pure python adb library for google adb service.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%