1、移动端app数据
1.1为什么要抓取移动端数据
①随着时代的发展,pc—>移动端—>大数据—>AI(人工智能未来)对于做数据分析、用户画像、市场调研来说仅仅参考PC端的数据是远远不够的。那么于此同时移动的数据就显得尤为的重要
②android基本布局
线性布局 linearLayout 2 相对布局 RelativelLayout 3 帧布局 FrameLayout 4 表格布局 TableLayout 5 绝对布局 AbsoluteLayout
1.2移动端抓取数据注意事项
①可能需要反编译,分成出加密算法抓取信息
②可能加固,需要脱壳
③需要破解各式各样的签名,证书,设备绑定方法,找到隐藏的加密算法
2、UIAutomator
2.1UIAutomator的简介
UIAutomator是google提供的用来做安卓自动化测试的一个java库,测试脚本只能用Java语言开发,而且测试脚本要打包成jar包或者apk包上传到设备上才能实现
2.1.1jar包
①JAR(Java ARchive)是将一系列文件压缩到单个压缩文件里,就象Zip那样。JAR文件是跨平台的,不必关心涉及具体平台的问题。
jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。
2.1.2apk包
Android应用程序包(Android application package)一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), 原生资源文件(assets),证书(certificates),和清单文件(manifest file),通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
3、安卓的四大控件
3.1activity
①一个Activity通常就是一个单独的窗口
②Activity之间是通过Intent进行通信
③android应用中每一个activity都必须在androidManifest.xml配置文件中声明,否则系统不执行更无法识别该Activity
3.2service
3.2.1service用于在后台完成用户指定的操作
①start(启动):当应用程序组件(activity)调用startservice()方法启动服务时,服务处于start状态,一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。
②bound(绑定):当应用程序组件(activity)调用bindservice()方法绑定到服务时,服务处于绑定状态
3.2.2start和bound的区别
①start启动服务是由其它组件调出startService()方法启动的,这导致服务的onStartCommand()方法被调用,当服务是start状态时,生命周期与它的组件无关,并且可以在后台无限期的运行,即使启动服务的组件已经被销毁,因此,服务需要在完成任务后调用stopSelf()方法停止,或者由其它组件调用stopService()方法停止服务
②使用bound开启服务,bindService()会将调用者与服务绑定在一起,调用者一旦销毁,服务也就终止
3.2.3service的特点
Service通常位于后台运行,它一般不需要与用户交互,因此Service组件没有图形用户界面。Service组件需要继承Service基类。Service组件通常用于为其他组件提供后台服务或监控其他组件的运行状态。
3.3content provider
①android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。
②只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处是统一数据访问方式。
③ContentProvider实现数据共享。ContentProvider用于保存和获取数据,并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式,因为android没有提供所有应用共同访问的公共存储区。
④开发人员不会直接使用ContentProvider类的对象,大多数是通过ContentResolver对象实现对ContentProvider的操作。
⑤ContentProvider使用URI来唯一标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来管理。
3.4broadcast receiver
①你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力,例如闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
②广播接收者的注册有两种方法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
③动态注册广播接收器特点是当用来注册的Activity关掉后,广播也就失效了。静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用。
4、adb的使用
4.1adb的简介
adb ( Android Debug Bridge)安卓调试桥,它是一个通用命令行工具,允许与模拟器实例或真机Android设备进行通信。它可为各种设备操作提供便利,如安装和调试应用。
①Adb client 命令行程序用于从shell或脚本中运行adb命令
②Adb server是运行在PC的的一个后台程序
③Adbd 程序是一个在Android设备或模拟器系统中运行的后台进程,通过②完成与移动端的额交互完成相关操作
4.2adb的使用
4.2.1adb的安装
随便下载一个模拟器就会带有adb应用程序,将bin目录添加至环境变量,方便任意位置操作这里面的可执行文件
4.2.2adb的使用
在dos中输入adb就会开启pc后台中运行的adb server
查看连接设备,第一次输入时守护进程没有开启,他开启后再次输入,可以看到连接的设备为空,还没有连接任何移动设备
开启模拟机后就会连接(必须开启adb server才能连接设备)
4.2.3adb的常用命令
①adb dvices :查看adb连接了哪些设备
②adb kill-server :关闭服务
③adb install apk文件绝对路径 :安装app应用
下载apk文件
④adb shell pm list packages :查看包名
⑤adb uninstall 应用包名 :卸载应用
5、UIAutomator2
由于UIAutomator的测试语言只能用java语言开发,测试脚本也要打包成jar包或者apk包上传到设备上才能实现,不符合python的轻便,也不能用python写脚本测试,所以为python开发了一个UIAutomator库,让python可以做android的测试
u2的安装如下
5.1uiautomator2的优势
UI自动化编写采用Python,学习成本低
UI控件识别有专门的工具 weditor
环境搭建简单
UI自动化脚本运行稳定
5.2uiautomator2的执行流程
①在移动设备上安装atx-agent(守护进程),随后atx-agent启动u2服务(默认7912端口)进行监听
②在PC端来编写脚本(相当于发送HTTP请求到移动设备的server端)
③ 移动设备通过wifi或usb接收到了PC上发来的HTTP请求,执行定制的操作
运行环境:android4.4+、python3.6+
1、Uiautomator-server: 就是谷歌原声的 uiautomator
2、Atx-agent: uiautomator的守护进程
3、minicap和minitouch 中2个包是atx-agent增加远程控制功能的依赖
5.3uiautomator2的使用
①打开adb服务
②连接移动端
③初始化移动端python -m uiautomator2 init
5.3.1pycharm操控移动端的软件
在DOS中找到apk包名
方法一adb shell pm list packages
方法二 aapt dump badging apk文件的绝对路径
打开appd.app_start('包名')
关闭appd.app_stop('包名')
d.service('uiautomator').running() uiautomator运行状态
d.service('uiautomator').start() 启动uiautomator
d.service('uiautomator').stop() 停止uiautomator
d.app_install(data='apk地址') 安装app
d.app_current() 获取当前前台app的信息
d.app_stop('包名') 停止当前app
d.app_clear('包名') 清除缓存
d.app_uninstall('包名') 卸载app
d.app_list() 获取所有app的信息
d.app_stop_all() 停止所有app
d.app_uninstall_all() 卸载所有app
5.3.2pycharm中u2的基本操作
import uiautomator2 as u2
'''
1、通过wifi 172.17.100.15要在局域网中测试
2、通过usb
3、通过adb wifi ip+port
'''
# d = u2.connect_wifi('172.17.100.15')
d = u2.connect_usb('127.0.0.1:62001') #可以直接启动ATX守护进程
# print(d.info)
# print(d.device_info) # 查看守护进程的状态
# print(d.service('a').running()) # 开启了就为true没开启就为false
# d.service('name').start() # 开启守护进程,或者手动开启也可以
# print(d.service('name').running()) # 查看守护进程的状态
# d = u2.connect_wifi('172.17.99.15') # 无效的ip不能通过这个ip连接
# print(d.wlan_ip) # 这是通过ATX转化后的ip:172.17.99.15,模拟器是不对的真机是可以的
# 安装百度
# d.app_install(data='https://ip4095973748.mobgslb.tbcache.com/fs08/2020/09/24/11/120_b9a3e3f87a32db6a1e0366741deefa3b.apk?fname=QQ%E6%B5%8F%E8%A7%88%E5%99%A8&productid=2011&packageid=600982633&pkg=com.tencent.mtt&vcode=10778135&yingid=wdj_web&pos=wdj_web%2Fdetail_normal_dl%2F0&appid=44621&apprd=44621&iconUrl=http%3A%2F%2Fandroid-artworks.25pp.com%2Ffs08%2F2020%2F09%2F02%2F11%2F110_dfcdbbf1a14ea1c552ea8faf19317cb1_con.png&did=faaaa28ba09ab482dc9c400d838cfa78&md5=8136b6144bd4dce94ec756d9e51a55ba&ali_redirect_domain=alissl.ucdl.pp.uc.cn&ali_redirect_ex_ftag=5e6bf67d7726627063444f1515b3638a7b1160f8514c4c88&ali_redirect_ex_tmining_ts=1601006536&ali_redirect_ex_tmining_expire=3600&ali_redirect_ex_hot=100')
# d.app_start(package_name='com.baidu.searchbox') # 启动百度
# print(d.app_current()) # 获取前台运行app的信息返回的是package, activity, pid(正在开发)# print(d.current_app())跟前者一样
# d.app_stop('com.baidu.searchbox') # 关闭app
# d.app_uninstall(package_name='com.baidu.searchbox') # 卸载指定包名app
# print(d.app_list()) # 查看所有app的信息
# print(d.app_info(package_name='com.baidu.searchbox')) # 获取包名的详细信息
# d.app_clear(package_name='com.baidu.searchbox') # 清楚app缓存内存提高设备运行的效率
# d.app_stop_all() # 停止所有的app,有默认排除参数所以不会停ATX(u2)
# d.app_uninstall_all() # 卸载所有的app,有默认排除参数所以不会卸载ATX(u2)