#Datawhale #AI夏令营 #Mobile Agent 设计与实践 (2)

系列文章目录

Task1: 第一篇文章
Task2 (loading…)
Task3 (loading…)


Task 2


前言

 
本篇文章延续上一篇对Mobile-Agent(移动智能体)的相关学习,主要记录了扩展动作空间、增加复合动作、开发创新应用的idea、初步尝试和实践结果。至于其框架原理和原始开源代码,请参考Datawhale官方文件和第一篇文章的详细讲解。

必看:本文有对以下报错的详细讲解,亲测有效!!!

  • Could not automatically detect an ADB binary. Some emulator
    functionality will not work until a custom path to ADB is added. This
    can be done in Extended Controls > Settings > General tab > 'Used
    detected ADB location
  • The ADB binary found at \SDK\platform-tools\adb.exe is obsolete and has
    seriousperformance problems with the Android Emulator. Please update
    to a newer version to get significantly faster app/ file transfer
  • Timed out after 300 seconds waiting for emulator to come online
  • Pixel 8 API 35 Emulator failed to connect within 5 minutes
  • adb server version (31) doesn’t match this client (41); killing…error: cannot connect to daemon
  • adb server version (22361) doesn’t match this client (41); killing…error: cannot connect to daemon

本篇文章主要是记录和分享自己在夏令营中的学习过程和遇到的困难


一、创新场景的idea

1. 股票小助手

自动总结目标股票当日涨跌

2. 群聊小助手

与新进群的群成员进行自主互动,按照指令完成群功能

3. 壁纸生成助手

根据用户兴趣点自主下载背景图片

4. 桌面整理大师

根据用户要求自主完成移动设备APP归类与整理

本次主要聚焦壁纸生成助手,先尝试保存10张满足要求的图片到Gallery指定图册


二、Mobile-Agent 扩展初步实践

step 1: controller修改

这里给controller.py文件末尾添加了一个search函数,用以搜索图片、截屏并保存到Gallery

# 添加search函数
def search(adb_path):
    # 打开谷歌浏览器并搜索关键词
    subprocess.run([adb_path, 'shell', 'am', 'start', '-a', 'android.intent.action.VIEW', '-d', 'https://www.google.com/search?q=brown+dog'])
    # 等待页面加载
    time.sleep(5)  # 可能需要更长时间等待页面加载

    for i in range(10):
        # 模拟点击第一张图片
        subprocess.run([adb_path, 'shell', 'input', 'tap', 'x_coordinate', 'y_coordinate'])  # 点击第一张图片
        time.sleep(2)
        # 等待图片加载完成
        time.sleep(5) 
        # 模拟器的Gallery路径
        gallery_path = "/storage/emulated/0/image{}.png".format(i)
        # 截屏并保存到Gallery路径
        subprocess.run([adb_path, 'shell', 'screencap', '-p', '/sdcard/screenshot.png'])  
        subprocess.run([adb_path, 'pull', '/sdcard/screenshot.png', gallery_path]) 
        time.sleep(2)

step 2: Prompt修改

修改 get_action_prompt()函数的后半部分,添加一个action

prompt += "### Response requirements ###\n"
(...)
prompt += "Home: Return to home page.\n"
#添加一个新action
prompt += "Search and Save Images of Brown Dogs: Search for and save 10 images of brown dogs by taking screenshots from the internet."
prompt += "\n"
#接着是最后一个action:Stop
prompt += "..."
(...)
prompt += "### Thought ###..."
prompt += "### Action ###\nYou can only choose one from the seven actions above. Make sure that the coordinates or text in the \"()\".\n"  #action选项从six改为seven
(...)

step 3: 主文件 run.py 修改

修改instruction

# Your instruction
instruction = "First, open Google Chrome. Then, search and take screenshot for 10 images of the brown puppy dog. Finally, save them to Gallery."

在程序入口while循环中添加一个elif判断语句

elif "Search" in action:
    search(adb_path)

❤️ 以上三个步骤就实现了一次初步修改,更多修改方法与扩展策略请见Task2学习文档


二、学习与相关问题

1. 重难点学习

 
原理

来源于https://www.51cto.com/aigc/1024.html
 

2. 问题与初步解答


问题1:为什么启动模拟器时出现弹窗显示如下报错:

Could not automatically detect an ADB binary. Some emulator functionality will not work until a custom path to ADB is added. This can be done in Extended Controls (...) > Settings > General tab > 'Used detected ADB location'

解答:这个warning是因为模拟器在启动时找不到ADB路径。首先,确认已经在电脑高级系统设置-环境变量-系统环境变量里添加了ANDROID_SDK_HOME变量,值应为.android文件夹的路径(首先需要把这个文件夹从"C:\users\用户名"中找到,然后整个复制到SDK文件夹里面,现在的路径才是对的,变量值应为\path\SDK.android)。然后,在系统变量的Path里新增一条,内容为SDK中platform-tools文件夹的路径。我们想要的adb.exe文件就在这个platform-tools文件夹里。接着,在启动模拟器超时前,在模拟器的右边栏里找到系统设置,里面就有上述提示中说的Extended Controls > Settings > General tab > ‘Used detected ADB location’。你会发现它是开着自动检测的。现在关掉按钮,然后(注意一定要完成接下来的步骤,否则模拟器依然找不到adb,博主就是犯了这个错误)点击按钮旁边的文件夹图形(就是常用的Browse作用),选择adb.exe文件或直接输入adb.exe这个文件的地址。再关闭模拟器重启就会发现这个warning消失了。


问题2:为什么启动模拟器时出现弹窗显示如下报错:

The ADB binary found at E:\Android_SDK\platform-tools\adb.exe is obsolete and has seriousperformance problems with the Android Emulator. Please update to a newer version to get significantly faster app/ file transfer

解答:这个warning博主遇到后尝试了很多办法,最终发现应该是下载过程中的网络问题导致的,卸载重装是很好的办法。不要害怕,Android Studio,SDK和相关文件是相对好卸载干净的,博主找到了】好文章,讲的很详细,博主自己就是按这个做的(注意,文中所述需要删除的C:\users\用户名\AppData目录下的文件直接找是找不到的,因为这个AppData文件本身是用户名下的隐藏文件,需要先在查看里打开隐藏文件的显示才能找到。博主自己当时就是没找到,以为不用管,结果重新安装Android Studio 时发现程序自动跳过了好几个关键的设置环节)。文章链接在下方:

卸载的参考文章链接:http://t.csdnimg.cn/XsFXB
安装的参考文章链接:http://t.csdnimg.cn/XsFXB + Datawhale官方文件


问题3:为什么即使解决了上述问题,仍然报错:

Timed out after 300 seconds waiting for emulator to come online
# 或者
Pixel 8 API 35 Emulator failed to connect within 5 minutes

回答:这个问题很重要,因为这只是表面问题,需要先找到连接失败的真正原因。打开Android Studio的Notification,才可以看到真正报错的原因。博主遇到的是下一个问题所记录的报错


问题4:Notification中提醒如下报错的二者其一(博主遇到的是第一个报错):

adb server version (22361) doesn't match this client (41); killing..
error: cannot connect to daemon
(...)
adb server version (31) doesn't match this client (41); killing..
error: cannot connect to daemon
(...)

回答:首先,这个warning的意思是server端(也就是模拟器)的ADB版本与client端(也就是电脑)的ADB版本不匹配。先在终端中输入adb kill-server,再输入adb start-server来重启adb服务(如果显示没有命令是adb,那么执行以下第一个可能性中提到的手动操作)。如果重启后再尝试就不报错了,那问题解决。如果还报错,则有两个可能原因,需要一一排除:

第一,有可能是真的因为版本不匹配,这时候需要查看版本。首先,在终端中输入adb,如果有反应,则输入adb version查看服务端与客户端的版本号;如果没有反应,则说明需要手动操作一下,把adb.exeAdbWinApi.dllAdbWinUsbApi.dll这三个文件复制到C:\Users\用户名文件夹里面,同时确认刚才问题1中提到的环境变量已经设置好,接着关闭并重启终端,再输入adb,就会出现回应了。接着,输入adb version后的回应中会有三串数字:第一串是client的version,主要看这串数字的最后一部分A(博主的是41);第二串是server的version,主要看这串数字的第一部分B(博主是35);第三串是电脑Windows系统的版本号,主要看这串数字的最后一部分C(博主是22361)。注意,这里的ABC和后面的xxx、yyy都是代指。接下来,比较A和B,如果没有差距,直接进入第二种可能。如果有差距,打开Android Studio的SDK Manager(点击上方导航栏中的Tools就能找到),查看platform-tools的版本(这里Android Studio的SDK及相关的版本其实就是模拟器,也即server端的版本)是否可以更新,如果可以更新,则更新到与client相符合的版本,再重试,如果成功了就问题解决,还是不成功就直接进入第二种可能;如果没有可以更新的,就说明server端已经最新,不太可能是因为它版本太低,那么,也直接进入第二种可能。

第二,就是端口占用,也就是电脑连接模拟器的端口被别的进程占用了。其实,从上述分析已经可以看出,博主遇到的就是这一种可能性,因为博主的报错中显示的是:adb server version (22361) doesn’t match…可以看到本来这个22361应该是模拟器、即server端的版本号(对博主来说就应该是35),结果报错里显示的却是电脑windows版本号,这明显就是因为连接到电脑client端ADB的不是模拟器的server端ADB,而是电脑自己的某种进程。那么,这种情况可以先卸载掉所有不常用的360相关的软件,尤其是360手机助手等。其次,先在终端输入netstat -ano|findstr "5037"来查找占用端口号5037的连接,看有没有最后一列中数字不为零的,记住这串数字xxx,这是一个进程的ID;然后,输入tasklist | findstr "xxx"来查找ID为xxx的进程,看它第一列的进程名字yyy;最后,打开任务管理器,将对应的进程kill掉(点击,然后可以看到上方导航栏有结束进程的选项,或者点击后右键也能看到),再按照之前描述的方法重启adb服务即可。


总结

只是本篇针对Task1的总结,系列总结会在第三篇

以上就是对Mobile Agent 开发创新应用任务的初级讲解,也进行了一定的学习与问题分享,后续会继续进阶学习,深入理解框架原理,设计更多应用,持续分享。

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值