日期:2014-05-16  浏览次数:20523 次

Android ADB 完美支持中文 详细讲解(一)

要完美支持中文需要修改的地方还不止一点点,首先要知道为什么不支持,然后才知道怎么去修改,接下来一系列的文章会详细讲解ADB 和中文的各种关系,我会把adb 源码截图,以及我如何修改的都贴上,并且会把一些关键代码截图贴出来,大家自己去修改。不劳而获是不可能的,所以还是需要大家自己去修改。建了一个QQ群,群共享里面有我自己编译好的ADB,分别有MD和MT 编译的。群号:  115495155

一: ADB 为什么不支持中文。这里我感觉不止是中文的问题,非英文应该都有问题。

在继续之前如果还不知道字符串编码的,先百度一下Unicode,GBK,UTF8 ,了解一下再往下看。然后就是windows 的API,windows 的API一般都有W和A 两种,比如CreateFileW和CreateFileA,前者打开Unicode 编码的字符串路径,后者打开以GBK编码的字符串路径,详细区别大家也去百度一下。了解上面两个基本知识之后用一个adb 的push 命令来详细讲解。


我们在控制台输入Adb 命令的时候,对于没有修改过的ADB,在程序中接收到字符串编码都是GBK编码的,



这是调试代码从内存中查看的。之后会进入do_sync_push 这个函数,这个函数的两个参数lpath,rpath 也是GBK编码的字符串。这个函数会先建立一个连接,然后判断本地文件是否存在,条件满足之后开始真正的发送文件了。


下面这个函数是真正发送文件的函数



发送一个文件到手机需要发送两种的数据,一种是文件的名称,还有一种是文件的内容,所以这函数首先调用

发送文件的路径。这个地方有个问题,函数只是判断有没有发送成功,并没有判断能否成功在手机上创建文件。这个地方就存在第一个问题,手机上显示的文件名是乱码。接下来是发送文件的内容,下面函数的path 参数是一个GBK 编码的字符串,adb_open函数调用 CreateFileA 打开文件,由于传入的本来就是GBK 编码所以能正常打开文件并且读取文件。


然后就拼命的往adb 服务进程发送文件内容了,所有的内容发送完成之后再给服务进程发送命令询问是否成功了。

服务进程最后返回失败了,只能说无语了,文件内容全部发送过去为啥还是失败了。


详细解析:

    1) 刚才说到adb push 命令传入的字符串是GBK 编码的,所以无论是电脑的路径还是手机端的路径都是以GBK 编码的方式保存的字符串,而adb 进程和adb 服务进程通信的时候用的UTF8编码的,非英文的字符这两种编码的字符串在内存里面是不一样的。adb 服务进程接收到文件路径之后以为是UTF8编码的字符串。

   2) 最后为啥还是返回失败了? adb 服务进程接收到一个GBK 编码的字符串,误以为是UTF8编码,所以想往手机上创建一个文件,没曾想创建不了文件,然后adb 就拼命的发送数据。手机上都不能创建文件,你再发送内容又有什么用呢。对于小文件来说还好,如果是一个大文件的话就太浪费时间了,应该一开始就返回失败才对。 所以这个地方应该是有优化空间的。具体如何优化大家自己考虑吧。



下面简单说一下ADB install 命令不支持中文的原因

安装一个APK到手机是有两个步骤

1)  把APK 拷贝到手机上。 如果是安装在手机内存,则拷贝的目标目录是/data/local/tmp/,如果是SD卡,拷贝的目录 /sdcard/tmp/

2)  执行安装命令。

所以一个中文路径的APK 在第一步就已经失败了。


下一讲 将会用我自己实际修改的代码做为列子来讲解如何修改。