【问题标题】:How can I launch an Android app on a device through Python?如何通过 Python 在设备上启动 Android 应用程序?
【发布时间】:2021-10-20 10:57:04
【问题描述】:

我已经查阅了有关该主题的几个主题,但我没有看到任何与直接使用 ppadb 命令在设备上启动应用程序相关的内容。

我设法完成了这段代码:

import ppadb
import subprocess

from ppadb.client import Client as AdbClient

# Create the connect functiun

def connect():

   client = AdbClient(host='localhost', port=5037)
   devices = client.devices()
   for device in devices:
       print (device.serial)

   if len(devices) == 0:
       print('no device connected')
       quit()

   phone = devices[0]
   print (f'connected to {phone.serial}')

   return phone, client

if __name__ == '__main__':
    phone, client = connect()

    import time
    time.sleep(5)

    # How to print each app on the emulator
    list = phone.list_packages()
    for truc in list:
       print(truc)

# Launch the desired app through phone.shell using the package name
phone.shell(????????????????)

从那里,我可以访问每个应用程序包 (com.package.name)。我想通过phone.shell() 命令启动它,但我无法访问正确的语法。

我可以执行敲击或按键事件,而且效果很好,但我想确保我的代码不会因位置的任何变化而受到干扰。

【问题讨论】:

    标签: python adb


    【解决方案1】:

    来自How to start an application using Android ADB tools,启动应用的shell命令是

    am start -n com.package.name/com.package.name.ActivityName
    

    因此你会打电话

    phone.shell("am start -n com.package.name/com.package.name.ActivityName")
    

    一个给定的包可能有多个活动。要找出它们是什么,您可以使用dumpsys package,如下所示:

    def parse_activities(package, connection, retval):
        out = ""
        while True:
            data = connection.read(1024)
            if not data: break
            out += data.decode('utf-8')
        retval.clear()
        retval += [l.split()[-1] for l in out.splitlines() if package in l and "Activity" in l]
        connection.close()
    
    activities = []
    phone.shell("dumpsys package", handler=lambda c: parse_activities("com.package.name", c, activities))
    print(activities)
    

    【讨论】:

    • phone.shell ('am .......") 不幸无法正常工作
    • “不起作用”:会发生什么?您收到错误消息吗?什么信息?
    • 您展示的方法需要访问 package.name 和 ActivityName。我仍然不知道如何访问 ActivityName 所以因为我的地址不完整,所以没有发生任何操作或错误。
    • 啊,我明白了。重要的是要知道您想要作为单个应用程序的哪个活动通常会有多个。我在答案中添加了一个 sn-p,它将帮助您列出属于您手机上某个包的活动,ppadb
    【解决方案2】:

    这是正确和最简单的答案:

    phone.shell('monkey -p com.package.name 1')
    

    此方法无需访问 ActivityName 即可启动应用

    【讨论】:

      【解决方案3】:

      使用AndroidViewClient/cluebra可以启动包的MAINActivity,如下:

      #! /usr/bin/env python3
      # -*- coding: utf-8 -*-
      
      from com.dtmilano.android.viewclient import ViewClient
      
      ViewClient.connectToDeviceOrExit()[0].startActivity(package='com.example.package')
      

      这会连接到设备(必要时等待),然后仅使用包名调用startActivity()

      startActivity() 也可以收到component,当您知道包和活动时使用它。

      【讨论】:

        猜你喜欢
        • 2020-02-10
        • 1970-01-01
        • 2014-07-22
        • 2022-07-15
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 2016-07-02
        相关资源
        最近更新 更多