实现一个构建手机应用页面与页面之间跳转关系的Agent
他应该可以通过调用mobile_tools_documentation.md中记录的方法来获取手机页面的UI元素，点击、滑动等操作移动到新的页面
其应该使用深度优先遍历的方式，来对一个APP在指定遍历深度的限制下，构建页面与页面之间的跳转关系图。
这张图在最后应该可以被可视化出来，很直观的看到各个页面之间的跳转关系。
核心流程为一开始接受外部参数，一个是自然语言描述，一个是遍历深度。
然后调用一个初始页面获取的agent，获取我要进行遍历的初始页面的UI元素信息。
后续的核心流程为深度优先算法，在接受到上面传入的UI信息后，通过点击的动作，迭代获取UI元素列表，遍历该列表中所有可点击的元素，执行点击跳转到新的页面。
在执行深度优先算法时，
要使用agentbay sdk的session.mobile.get_all_ui_elements去获取页面信息
非常重要：使用session.mobile.tap(x=x, y=y)去进行远程沙箱子页面的实际跳转，同时内存节点的操作也要对应到该子节点。
非常重要：使用self.session.mobile.send_key(4)的方法返回到上一个页面，同时内存节点的操作也要返回父节点。
跳转的参数则使用ui元素中的'bounds'去进行计算
具体的调用方法可以参考tools.py和toolkits.py中的实现。
在遍历的过程中，如果一个新获取的页面和已经遍历过的页面UI元素相似度比较高，比如高于95%，则认为是一个已经遇到过的页面停止对其遍历，只要保存到其的跳转关系，避免陷入死循环。
最终输出以页面作为节点，以跳转关系为边的图结构，并且保存到指定文件中。

在生成的可视化脚本中，如果一条边的来源点和目标点是一个点，则不展示该条边

注意：一定要保证调用agentbay的sdk让远程沙箱跳转的动作，与内存中的遍历节点的动作一定要保持一致。

在ui_builder_agent.py中实现核心代码
在example/ui_map_self_evolving/run_ui_builder.py中实现一个执行脚本，该脚本接受自然语言、遍历深度，输出文件路径三个参数

一个页面的UI元素信息参考如下：
{
	'bounds': '0,36,1080,1848',
	'className': 'View',
	'text': '主屏幕',
	'type': 'text',
	'resourceId': '',
	'index': 14,
	'isParent': False,
	'children': [{
		'bounds': '30,54,1050,652',
		'className': 'LauncherAppWidgetHostView',
		'text': '数字时钟',
		'type': 'focusable',
		'resourceId': '',
		'index': 3,
		'isParent': False,
		'children': [{
			'bounds': '48,72,1032,634',
			'className': 'LinearLayout',
			'text': 'digital_widget',
			'type': 'clickable',
			'resourceId': 'com.android.deskclock:id/digital_widget',
			'index': 4,
			'isParent': False,
			'children': [{
				'bounds': '329,72,751,336',
				'className': 'TextView',
				'text': '6:59 clock',
				'type': 'text',
				'resourceId': 'com.android.deskclock:id/clock',
				'index': 5,
				'isParent': False,
				'children': []
			}, {
				'bounds': '438,336,641,371',
				'className': 'TextView',
				'text': '11月4日周二 date',
				'type': 'text',
				'resourceId': 'com.android.deskclock:id/date',
				'index': 6,
				'isParent': False,
				'children': []
			}]
		}]
	}, {
		'bounds': '30,652,285,951',
		'className': 'TextView',
		'text': '日历',
		'type': 'clickable',
		'resourceId': '',
		'index': 7,
		'isParent': False,
		'children': []
	}, {
		'bounds': '285,652,540,951',
		'className': 'TextView',
		'text': '相机',
		'type': 'clickable',
		'resourceId': '',
		'index': 8,
		'isParent': False,
		'children': []
	}, {
		'bounds': '540,652,795,951',
		'className': 'TextView',
		'text': '通讯录',
		'type': 'clickable',
		'resourceId': '',
		'index': 9,
		'isParent': False,
		'children': []
	}, {
		'bounds': '795,652,1050,951',
		'className': 'TextView',
		'text': '时钟',
		'type': 'clickable',
		'resourceId': '',
		'index': 10,
		'isParent': False,
		'children': []
	}, {
		'bounds': '30,951,285,1250',
		'className': 'TextView',
		'text': '短信',
		'type': 'clickable',
		'resourceId': '',
		'index': 11,
		'isParent': False,
		'children': []
	}, {
		'bounds': '285,951,540,1250',
		'className': 'TextView',
		'text': '图库',
		'type': 'clickable',
		'resourceId': '',
		'index': 12,
		'isParent': False,
		'children': []
	}, {
		'bounds': '540,951,795,1250',
		'className': 'TextView',
		'text': '拨打电话',
		'type': 'clickable',
		'resourceId': '',
		'index': 13,
		'isParent': False,
		'children': []
	}, {
		'bounds': '30,1622,285,1784',
		'className': 'TextView',
		'text': '文件',
		'type': 'clickable',
		'resourceId': '',
		'index': 15,
		'isParent': False,
		'children': []
	}, {
		'bounds': '285,1622,540,1784',
		'className': 'TextView',
		'text': '设置',
		'type': 'clickable',
		'resourceId': '',
		'index': 16,
		'isParent': False,
		'children': []
	}, {
		'bounds': '540,1622,795,1784',
		'className': 'TextView',
		'text': '浏览器',
		'type': 'clickable',
		'resourceId': '',
		'index': 17,
		'isParent': False,
		'children': []
	}, {
		'bounds': '795,1622,1050,1784',
		'className': 'TextView',
		'text': '设备配置',
		'type': 'clickable',
		'resourceId': '',
		'index': 18,
		'isParent': False,
		'children': []
	}]
}
