标签 android 下的文章

最近需要使用opengrok作为webservice来提供代码交叉索引功能。

但是opengrok的release版本中还没有提供这个功能,原因在于这个提交没有被release。

所以只能自己编译最新的master分支代码并deploy。注意一点编译时需要1.8的jdk,tomcat server也需要1.8jdk来运行方能不出错。

在服务的url后边加上json?freetext=ThreadPoolExecutor之类的参数(其他参数请见我在Opengrok项目上的回复)便可查询到结果了。

针对这个问题本人贡献了一遍详细点的[文档](https://github.com/OpenGrok/OpenGrok/wiki/OpenGrok-web-services),请参阅。

最近遇到一个应用打开WebApp后,将应用压入后台,出现比较耗电的问题。集合众多同学的智慧之后定位到原因:

在WebKit的内核中会引用从各个平台(android, linux pc, mac)注入的自己的服务比如:

* DeviceOrientationService
* DeviceMotionService

而这两个Service在android平台上的实现皆通过注册侦听器到SensorManager来获知来自于加速度器,磁力计的方位、手机姿势数据。

Sensor的使用是极其浪费电力的一件事情,所以就出现了上文所述问题。

解决方法:

1) 在Activity的onPause(), onResume()时调用WebView.onPause(), WebView.onResume()以尽量将JS执行线程以及其他WebCore中的线程给停住

2) 在onStop()时将WebView中当前load的url记住,然后让WebView.loadUrl("about:blank"),在onStart()时WebView.loadUrl({your_previous_url})

更新:
[2015/11]在最近的工作中还发现一种前端页面带来的耗电问题:当页面加载一些gif或者通过其他方式创建的动画效果,当webview变得不可见后这些动画如果没有被显式关掉,就会导致很严重的耗电问题。同时在桌面浏览器里边我也注意到页面里边持续运行的动画也会导致内存占用增大。

以如下裴波那契数列为测试代码:

```javascript
function fibonacci(n)
{
if (n < 2) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
print('fibonacci(20):' + fibonacci(20));
```
当输入为10时的结果(单位:ms):

27 12-09 14:13:04.371 4816 4816 E BirdNest: fibonacci(10):55

29 12-09 14:13:04.371 4816 4816 I faywong : benchmark(v8): 537

31 12-09 14:13:04.391 4816 4816 I BirdNest: fibonacci(10):55

32 12-09 14:13:04.391 4816 4816 I faywong : benchmark(duktape): 2336

当输入为20时的结果:

59 12-09 14:15:38.621 9196 9196 E BirdNest: fibonacci(20):6765

61 12-09 14:15:38.621 9196 9196 I faywong : benchmark(v8): 1583

63 12-09 14:15:38.841 9196 9196 I BirdNest: fibonacci(20):6765

64 12-09 14:15:38.841 9196 9196 I faywong : benchmark(duktape): 189211

大致汇总下:在输入为10时,v8性能是duktape的4倍;

在输入为20时,v8性能是duktape的119倍,jsc是duktape的接近100倍

今天在尝试优化json的序列化和反序列化。发现一个陷阱:
android自带的json比fastjson(fastjson-1.1.43)解析在9k(及以下)大小字符串输入下性能要高10倍,在解析19k大小字符串时性能高3倍。如下图所示:

三星Note 3:
![note 3](/uploads/2015_09_22_01.png)

一加1代:
![note 3](/uploads/2015_09_22_02.png)

详细数据如下:
json字符串体积: 6k,android终端:三星note3
```bash
09-22 11:42:55.234: D/faywong(7810): org.json.JSONObject consumes: 1ms to parse json
09-22 11:42:55.254: D/faywong(7810): com.alibaba.fastjson.JSONObject consumes: 15ms to parse json

json字符串体积: 9k,android终端:三星note3
09-22 11:11:45.944: D/faywong(26631): org.json.JSONObject consumes: 1ms to parse json
09-22 11:11:45.954: D/faywong(26631): com.alibaba.fastjson.JSONObject consumes: 15ms to parse json

json字符串体积: 19k,android终端:三星note3
09-22 11:48:15.844: D/faywong(11569): org.json.JSONObject consumes: 6ms to parse json
09-22 11:48:15.864: D/faywong(11569): com.alibaba.fastjson.JSONObject consumes: 19ms to parse json

json字符串体积: 6k,android终端:一加1代
09-22 11:39:55.304: D/faywong(12964): org.json.JSONObject consumes: 1ms to parse json
09-22 11:39:55.315: D/faywong(12964): com.alibaba.fastjson.JSONObject consumes: 11ms to parse json
json字符串体积: 9k,android终端:一加1代
09-22 11:30:06.378: D/faywong(11412): org.json.JSONObject consumes: 1ms to parse json
09-22 11:30:06.395: D/faywong(11412): com.alibaba.fastjson.JSONObject consumes: 17ms to parse json

json字符串体积: 19k,android终端:一加1代
09-22 11:53:30.551: D/faywong(14248): org.json.JSONObject consumes: 3ms to parse json
09-22 11:53:30.564: D/faywong(14248): com.alibaba.fastjson.JSONObject consumes: 13ms to parse json
```

总结下json序列化和反序列化的使用经验:
在能控制json序列化和反序列化的整个闭环中(比如服务端+客户端)使用fastjson之类的方案是有优势的;如果你只是在其中的一环,并不知道前边的json是谁以怎样的方式序列化/反序列化得来,建议你使用org.json版本,这样性能不至于很差。

今天由测试同学反映两款手机(红米,三星GS4,均搭载Android 4.2.2)存在WebApp中收到回调后软键盘自动收起。

经过一段时间的研究,发现在Android 4.2.2上WebView.loadUrl()被调用后WebView会认为新的一个页面即将打开,而将软键盘收起。

android填坑之旅还要继续……