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

yanghongche 2014-07-08 03:27:37
加精
以下观点全屏我个人经验简单叙述,个别详细技术不一定很准确,但基本没问题。

原文:http://blog.csdn.net/yanghongche/article/details/37565583


以下所说手机助手,均指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多。对于这种游戏的文件结构,主要分为两块,一块儿是游戏执行文件,一块儿是数据包。这种游戏就是最近很火的大型游戏。所以现在很多手机助手都出了大型游戏的版块儿,这种游戏是把游戏执行文件和数据包压缩到一个文件中,当下载到用户电脑上后,再解压、安装、传数据包到手机端。如果做大型游戏版块儿,就需要编辑来配合

【完】
...全文
5383 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuankuan_qiao 2015-06-04
  • 打赏
  • 举报
回复
hubeixuxiaojun 2015-01-27
  • 打赏
  • 举报
回复
楼主可以分享下静默安装的原理和源码吗?
ccbaor 2014-08-01
  • 打赏
  • 举报
回复
很不错的文章,有时间也研究下adb源码去
nieqiming 2014-07-21
  • 打赏
  • 举报
回复
很详细
zyjj_99 2014-07-15
  • 打赏
  • 举报
回复
前来学习,支持分享
邓学彬 2014-07-15
  • 打赏
  • 举报
回复
感谢分享,学习一下
CodeC 2014-07-15
  • 打赏
  • 举报
回复
工作之余我也做一个手机助手玩玩
qjgdftxmu 2014-07-12
  • 打赏
  • 举报
回复
有点意思,虽然不做这方面,但也想学学这方面的东西
万物同源 2014-07-12
  • 打赏
  • 举报
回复
不错
aqiu52 2014-07-11
  • 打赏
  • 举报
回复
很给力,支持下
liu_jin52 2014-07-11
  • 打赏
  • 举报
回复
只是一直在盲目的用 很简单 快捷 头一回 看到这样 完整的文章
网络游侠2012 2014-07-11
  • 打赏
  • 举报
回复
玩机高手,谢谢指导。收藏。。
xzzy111 2014-07-10
  • 打赏
  • 举报
回复
感谢分享00
lewit 2014-07-10
  • 打赏
  • 举报
回复
学习了,谢谢楼主。
fishion 2014-07-10
  • 打赏
  • 举报
回复
写得不错,有价值,收藏了
贝克汉姆_-- 2014-07-09
  • 打赏
  • 举报
回复
受教!
前行者456 2014-07-09
  • 打赏
  • 举报
回复
thankyou
Rocloud 2014-07-09
  • 打赏
  • 举报
回复
一直没有用到所谓的手机助手
凨行者 2014-07-08
  • 打赏
  • 举报
回复
不错 有时候刷机救机的时候用过
q107770540 2014-07-08
  • 打赏
  • 举报
回复
写的不错,路过看看

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧