Last active
August 29, 2015 14:20
-
-
Save MarcMeszaros/6a19c73b5c96ad391856 to your computer and use it in GitHub Desktop.
A python script that wraps the Android adb tool to make it simpler to pull APK files from a device.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import argparse | |
import sys | |
from subprocess import call, check_output | |
# version check | |
if sys.hexversion < 0x02070000: | |
sys.exit('Python 2.7 or newer is required to run this program.') | |
def create_arg_parser(): | |
parser = argparse.ArgumentParser(prog='apk.py', | |
description='Various APK operations on a connected device.', | |
epilog='NOTE: Will only work if adb is on the system path and a device is connected.') | |
subparsers = parser.add_subparsers(help='Available actions') | |
# create the parser for the "list" command | |
parser_list = subparsers.add_parser('list', help='List all the packages on the device') | |
parser_list.set_defaults(func=adb_list) | |
# create the parser for the "path" command | |
parser_path = subparsers.add_parser('path', help='List the APK path for the packages') | |
parser_path.add_argument('package', nargs='+', help='The package name to get paths for') | |
parser_path.set_defaults(func=adb_path) | |
# create the parser for the "pull" command | |
parser_pull = subparsers.add_parser('pull', help='Pull the APK matching the package') | |
parser_pull.add_argument('package', nargs='+', help='The package name to pull from device') | |
parser_pull.set_defaults(func=adb_pull) | |
return parser | |
def adb_list(args): | |
call(['adb', 'shell', 'pm', 'list', 'packages']) | |
def adb_path(args, output=True): | |
adb_pkg_output_prefix = 'package:' # NOTE: Google may change the adb cmd output (but unlikely)... | |
paths = {} # a dict of paths with the package as key | |
for p in args.package: | |
# get the APK path for package | |
cmd_out = check_output(['adb', 'shell', 'pm', 'path', p]) | |
cmd_str = cmd_out.decode('UTF-8').strip() # convert the bytes to str | |
# only add to the results dict if it's the expected str format | |
if cmd_str and cmd_str.startswith(adb_pkg_output_prefix): | |
paths[p] = cmd_str[len(adb_pkg_output_prefix):] | |
# print the path to the apk? | |
if output: | |
print(cmd_str) | |
return paths | |
def adb_pull(args): | |
paths = adb_path(args, False) | |
for key in paths: | |
call(['adb', 'pull', paths[key], '{0}.apk'.format(key)]) | |
def main(): | |
parser = create_arg_parser() | |
args = parser.parse_args() | |
if len(sys.argv) > 1: | |
args.func(args) | |
else: | |
parser.print_help() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment