webview问题调查

这算是我最郁闷的一次调查了。刚开始是为了html5游戏能快速的兼容android,于是,便调 查在webview的表现等等,结果发现点击之类的在webview似乎非常的不灵敏,虽然我是通过 页面元素模拟按键事件的,但还是觉得无法忍受。

我起始以为是程序运行的速度太快,而模拟的按键消息发送的太慢,于是,调查各种方式, 以便解决按键的延迟问题。

等等一系列调查下来,我注意到了webview中的速度比浏览器中的速度慢很多很多,于是, 便推翻了之前的结论,转移到webview的执行效率上来了。

硬件加速,开启,还是相同的慢(我用的是nexus 5),看到网上说的关于webview的js执行 速度慢,考虑jit?,浏览android源代码中关于Browser中的代码,相关内容几乎采用相同的 机制,但还是没有任何效果。浏览android的webview的相关源代码,还是没有找到问题的原 因。

首先,我知道的事情是,硬件加速开启了,但在webview中的速度就是比自带的浏览器速度 慢,如果没有开启的话,webgl相关几乎就会罢工的。

其次,浏览器中自带的支持很多声音的,而webview却不支持,这比较怪,浏览android源代 码中相关的chrome代码,也没有发现有这方面的限制。

最后,在在线调试javascript代码的时候,我注意到浏览器用的并不是Browser.apk,而是 Chrome.apk,也就是说我从一开始便走错了路。没想到都已经是4.4.2了,竟然这两个还是 分开的,在我第一次关注这个的时候,这两个就是分开的,没想到还是分开的。

知道了问题的所在,剩余的事情就理所当然了。

这个坑爹的货啊,白白浪费了我将近一周的时间。

x86程序内存动态补丁拦截

这个算是之前关于外挂框架的一个继续,但主要是说程序的内存补丁的,适用于无法获取到 源代码而又想拦截或者调用目标程序中的相关指令或函数的方法。

一般情况下,我们使用长跳转指令0xe9(JMP XXXXXX)的方式跳转到我们自己的dll函数中去 执行代码,不同于很早很早之前的外挂教程使用的是消息通知的方法,这里其实也算是使用 跳转,但区别在于我们不用计算跳转的偏移。

继续阅读

mochiweb与cowboy使用json

服务器原来的socket实现机制更改为ranch了,这样可以专注维护自己的事情了。其实,之 所以采用ranch是因为我使用bigwig来在网页中对状态进行监控,而bigwig使用的是cowboy 和ranch,cowboy也使用的是ranch,这样,代码中就存在了两个http的框架,mochiweb和 cowboy,而看了ranch的结构,感觉很不错,就将socket服务器也转换为基于ranch架构了。 mochiweb单独一个模块来进行http服务感觉重复,因此就决定将mochiweb从模块中去除,转 为cowboy。

一切基本都很顺利,但服务器和网页的数据交互总是有问题,数据交互使用的是json格式, mochiweb带有自己的将erlang数据转换为json的方法,cowboy使用的jsx,代码分别为

mochijson2:encode([{success, true}, {root, []}]),
jsx:term_to_json([{success, true},{root, []}]),

看上去很一致吧,我也以为不会有什么大问题,然后碰到了下面的格式

Data=[{"ID", 1},
      {<<"name">>, <<"zhangsan">>
}].

mochiweb侧输出的是:

“{\”ID\”:1,\”name\”:\”zhangsan\”}”

而jsx侧输出的是:

“[{\"_type\":\"tuple\",\"data\":[\"ID\",1]},{\”_type\”:\”tuple\”,\”data\”:[\"name\",\"zhangsan\"]}]”

如果想要和mochiweb输出表现一致的话,Data需要使用下面的方式:

% 方法1(推荐)
Data=[{<<"ID">>, 1},
      {<<"name">>, <<"zhangsan">>
}].
%方法2
Data2=[{'ID', 1},
      {'name', <<"zhangsan">>
}].

很明显不是我想要的数据,通过调查,发现jsx有以下的限制:

作为json索引的字段名称,不能是字符串list,如果为atom或者binary,则和mochiweb的输出 一致,也基本上和理解上一致,如果为字符串list,则jsx认为这个是一个数组,这可能是 因为erlang并没有真正意义上的字符串,字符串在erlang中是用list表示的吧。

闲暇之余的一点笔记