手机助手的那点事儿--经验之谈

以下观点全屏我个人经验简单叙述,个别详细技术不一定很准确,但基本没问题。

 

以下所说手机助手,均指Android手机助手

 

一 关于手机助手

 

手机助手一开始就是指在PC端运行的一个客户端,可以通过USB或者WIFI方式来与手机进行通信,给手机安装游戏,卸载游戏,进行游戏、应用的管理,当然还要有手游的展示与下载功能。

先插入个概念:Google提供的一个开源工具,adb.exe,充当了android编译器Eclipse通过DDMS来调试android程序的debug工具,通过合理使用adb.exe并遵照其规定命令格式,我们可以通过给adb.exe发送adb命令,来实现与android模拟器或手机进行通信,以此来实现我们想要的功能。

随着手机助手的功能越做越多、越复杂(涉及到手游联运),为了提高用户体验度,有的功能对通信效率要求变得很高,比如在PC端给手机动态截屏;有的功能adb没有自带,比如PC端需要知道安装进度;有的需要adb把某些信息处理的更细化,比如设备连接失败原因、游戏安装失败原因(这些adb也会自带,只是没有很细化);有的因为adb版本问题造成及时驱动已正确安装,也不能与adb正常通信……因此很多大公司直接把adb进行了改写,以此来扩展adb的功能。当然即使不改写adb,也完全可以实现一个手机助手的大部分功能。

现在对于很多专业做手机助手的公司来说,简单的adb已经不能满足他们的更多功能需求,比如PC端想知道abdroid端的一切信息(通讯录、实时短信、游戏保存进度的获取…),为了实现更多的功能,很多公司在android端写了一个android小工具,名字也叫做手机助手,其主要功能就是相当于PC断手机助手安插在android端的一个代理,PC端来通过adb把命令发送给这个代理,它来根据不同命令做一些事情,再把命令执行结果通过adb返回给PC端,这一切都离不开adb,可见adb在PC手机助手中扮演者多么重要的角色。

 

 

二 关于adb

 

       长话短说,adb就是一个进程,名字叫做adb.exe,当我们用命令行启动了一个adb.exe后,adb.exe会检测一下是否有adb server正在运行。如果没有,其会在内部启动一个adb server,名字也叫做adb,然后将命令行组织一下格式,发送给adb server(通过socket,端口是5037,IP是本地127.0.0.1)。接下来adb.exe(它相当于一个客户端client)便会自动退出。Adbserver在拿到命令后,会通过底层的USB协议将命令发送给android端的服务器。如果我们后续再通过命令行给adb.exe发送命令时,adb便会重复以上动作。

而最有意思的事情是,android端的服务器,名字是adbd.exe,但是实现源码是与PC端的这个adb.exe是一模一样的。为什么同样源码会实现不同功能呢?其关键点就在于,在adb.exe开头部分,用了一个LOCAL_HOST(好像是这个名字)宏定义,来区别是adb.exe还是adbd.exe,并进行不同的编译。

      

 

三 关于PC端与手机端通信

 

1.      WIFI通信

这个不是很常用,网络上已有的个别大公司的手机助手具有该功能,需要手机端有个android手机助手来配合。

 

2.      USB通信

USB通信即通过adb通信。我们在用adb.exe时,需要两个动态链接库的支持,AdbWinUsbApi.dll和AdbWinApi.dll。我们给adb发送命令,adb把命令整理一下,最后通过USB端口来发送给android端。既然是USB通信,而且在用户的电脑是什么情况、手机是什么情况,都不知道的情况下,就会出现一系列让人很头疼的问题。至此便引出了最难搞,也是最危险的问题,设备连接。之所以危险,是因为,用户把手机助手下载下来,安装打开后,连接不上手机,手机都连不上,还能用来干什么,只能卸载了,而且估计以后也不会再考虑该手机助手了。

 

以下为通过adb来与手机进行通信时用到的常用命令

Adb常用命令:

1.      查看设备

Adb devices 

这个命令式查看当前连接的设备,连接到计算机的android设备或者模拟器将会列出显示

2.      安装软件

Adb install

Adb install<apk在PC磁盘上的路径> 这个命令会将制定的apk文件安装到设备上

3.      卸载软件

Adb uninstall<软件名>

Adb uninstall –k<软件名>

如果加-k参数,为卸载软件但是保留配置和缓存文件

4.      adb shell

进入设备或模拟器的shell环境中,在这个linuxshell中,可以执行各种linux命令,另外如果只想执行一条shell命令,可以采用以下方式:

Adb shell[command]

5.      从电脑上发送文件到设备

Adb push <本地路径> <远程路径>

该命令可以把本级电脑上的文件或者文件夹复制到设备(手机)指定路径下

6.      从设备上下载文件到电脑

Adb pull <远程路径> <本地路径>

该命令可以把设备(手机)上的文件或者文件夹复制到本机电脑

 

 

四 关于设备连接

 

       这里我就说一下我的连接流程吧,也许别人来设计连接流程还会有更好的方法。

 

1.      手机助手安装后,会开机自启动一个后台运行的监控进程,该监控程序注册了windows的USB事件通知。

 

2.     当有设备插入电脑时,该监控进程会收到通知,收到很多VID、PID的设备字符串,解析出VID(厂商),检索配置文件,判断该VID是否为我已收录的手机厂商,若是,则检索出厂商名,并将VID、PID和其他ID信息保存起来。在窗口右下角弹窗提示用户,检测到三星手机,问用户是否连接该手机。

 

 

3.      用户点击连接按钮,将已经保存的设备信息一并发送给手机助手主进程。主进程用adb devices检测一下设备状态,包括如下状态:

A 未打开调试模式(这个可能会有一些误差)

B Offline状态,通常为USB供电不足

C 未安装驱动,通常返回空字符串或者其他字符

D adb启动失败类的问题(会有一系列返回码)

E 打开了存储模式,请关闭(个别手机有这种情况)

……

4.      如果判断出是未安装驱动,则会提示用户正在安装驱动,然后根据VID和PID去后台下载对应的驱动,采用静默安装的方式把驱动安装上。在这里有一点需要注意,驱动分为两种:通用驱动和专用驱动,对于腾讯手机助手和豌豆荚,它们是先安装通用驱动,如果通用驱动不好用,才会下载专用驱动继续安装。对于360来说,直接安装专用驱动,专用驱动不好用,再下载通用驱动来安装。

 

5.      驱动安装完后,如果用adb devices还是检测到驱动不好用,则提示用户连接失败,是否重新连接,用户点击重新连接后,重复上面的步骤。当然设备连接这块儿需要很详细的处理才能做好。给用户看的引导页面和流程用起来是否舒服很重要。

 

6.      如果连接成功,则通过adb获取手机内存、SDcard内存、手机详细型号、android版本等信息,显示给用户

 

其实手机助手要是做细了,还是有非常多的东西可以做的。

 

 

五 关于apk游戏文件的解析

 

       Apk文件的解析还是比较简单的,google给提供了一个工具,名字叫做aapt.exe,目前基本所有手机助手的apk文件解析用的都是这个工具。我们通过命令行的方式给aapt发送命令,便会从管道得到所有信息。

 

六 关于游戏安装与卸载

 

安装:

1.      Apk游戏比较大时,安装时间较长

2.      如果不改写adb,安装没有真实的进度

3.      如果不该写adb,需要想办法避免与其他手机厂商的adb冲突

4.      需要避免跟自己adb的冲突,如果有一个自己的adb正在执行任务,此时再启动一个adb,后启动这个会处于等待状态,这个应该有好的解决方法,我还没详细研究

卸载:

Adb uninstall<name> 这里的name是apk内部存放的游戏名字,而不是apk的名字,应该有方法可以通过adb获取到手机端已安装游戏列表。

 

 

七 关于游戏的管理

 

       在不改写adb的情况下,这个应该也可以实现,我之前见到过有人直接用adb已有接口做过。

 

PS:因为目前网络上出现了很多占用磁盘空间非常大的游戏,700、800MB已经很常见了,有的甚至1G多。对于这种游戏的文件结构,主要分为两块,一块儿是游戏执行文件,一块儿是数据包。这种游戏就是最近很火的大型游戏。所以现在很多手机助手都出了大型游戏的版块儿,这种游戏是把游戏执行文件和数据包压缩到一个文件中,当下载到用户电脑上后,再解压、安装、传数据包到手机端。如果做大型游戏版块儿,就需要编辑来配合


【完】

你可能感兴趣的:(vc++,手机助手)