chrome for android历史发布版本大集合

chrome for android的发布也进入了快通道,基本上windows/linux/android几个平台会同时发布新版本。不过google play上的app没法找到历史版本,有时为了测试对比,到处找一个历史版本。为此,本文整理了所有chrome for android的正式release版本的发布说明,历史版本可以从这里下载。

v28.0.1500.94

FRIDAY, JULY 19, 2013

Chrome for Android has been updated to 28.0.1500.94. This version contains minor bug fixes. A partial list of changes in this build is available in the SVN log. Interested in switching release channels?Find out how. If you find a new issue, please let us know by filing a bug.

(阅读全文...) >>

SublimeText配置

在我的一台开发机上在ubuntu系统下使用eclipse,经常会出现死机,不得不寻求其它的代码编辑器。windows下大名鼎鼎的source insight放到linux下就状况不断。后看到chromium项目推荐了sublime text这款编辑器,用起来感觉还不错。下面记录一下使用过程中的一些设置,网上各种资料比较凌乱,所以就稍微整理一下,供自己今后翻阅。

1. 过滤不相关的文件

可以针对某个特定的工程,进入菜单project | Edit Project,编辑当前工程的sublime-project文件,加入两个过滤器,folder_exclude_patternsfile_exclude_patterns,如下所示:

"folders":
[
    {
        "path":"/home/alex/android/source/android4.2",
        "file_exclude_patterns":
        [
            "*.o"
        ],
        "folder_exclude_patterns":
        [
            ".repo"
        ]
    }
]

2. 模拟eclipse的快捷键

在eclipse中,有几个快捷键用的非常多,分别为:

CTRL+TAB 头文件和c/c++文件之间切换
CTRL+SHIFT+R 对话框中输入文件名(有联想功能),快速打开文件
CTRL+o 输入方法(函数)名,可快速定位到方法(函数)
CTRL+l 输入行号,快速定位到指定行
CTRL+h 打开文件搜索对话框


可以修改sublime text的Key Bindings达到模拟eclipse快捷键的效果,有两个配置项可以修改,一个是Key Bindings-Default,一个是Key Bindings-User,最好修改后一个配置文件。进入菜单Preferences | Key Bindings - User,加入如下行:

[
{ "keys": ["ctrl+shift+r"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} },
{ "keys": ["ctrl+o"], "command": "show_overlay", "args": {"overlay": "goto", "text": "@"} },
{ "keys": ["ctrl+l"], "command": "show_overlay", "args": {"overlay": "goto", "text": ":"} },
{ "keys": ["ctrl+t"], "command": "show_overlay", "args": {"overlay": "goto", "text": "#"} },
{ "keys": ["ctrl+tab"], "command": "switch_file", "args": {"extensions": ["cpp", "cxx", "cc", "c", "hpp", "hxx", "h", "ipp", "inl", "m", "mm"]} }
]

3. 针对项目的代码风格设置

chromium的项目的代码缩进为两个空格,而其它项目的代码缩进一般为4个空格,所以我就希望针对特定的项目进行代码风格设置,方法是编辑当前工程的sublime-project文件,加入如下行(和folders项平级):

"settings":
{
"tab_size": 2,
"translate_tabs_to_spaces": true,
"trim_trailing_white_space_on_save": true,
"draw_white_space": "all"
}

4. 插件集合

sublime_text的插件扩展机制非常强大,已经有很多人出于不同的需求,开发出各种插件。首先说一下插件的安装。

按ctrl+shit+p显示命令列表,在其中输入install,选择Package Control: Install package,接着就会出现插件列表,选择你所需要的插件即可。

读《帝国的最后荣耀》

在多看上看到这本《帝国的最后荣耀》,正好碰到限免,就下载下来了。结果一看,就停不下来,熬了好几个晚上,终于把它读完。拜中国的教育所赐,对历史类科目一直不感兴趣。记得在学校上历史课就是不停的背时间、记事件,考试内容也是xx年发生了xx事之类的问题。读了《明朝那些事儿》后,才知道历史还可以这样读,精彩程度不亚于读小说。(在这里,不得不吐槽一下,多看的版本上面仍然存在不少错别字,极其影响阅读的心情。又犹豫要不要买KPW了。)

《帝国的最后荣耀》的写作风格类似于《明朝那些事儿》,语言诙谐有趣,但这并不意味着文章会象小说那样天马行空。可以看得出来,作者有着深厚的历史功底。这本书是讲的是明代抗倭援朝这段历史,作者阅读了中日朝三国的历史文献,加上自己的推理知识,力图真实还原那一段不太为国人所知的历史。历史既是真实的,也是不真实的。真实的一面在于历史是无法篡改的。就算中国人再不情愿,也否认不了近代中国被日本蹂躏的事实。不真实的一面在于,历史过去了,留给后人的就是一些史料。但这些史料存在很多主观因素,真伪难辩。首先,历史学家有着自己的好恶,编写史书的时候可能会有意无意的删掉一些资料,甚至可能会篡改资料。其次,历史学家一般都是为统治阶级服务,所以成者为王败者寇,史书也会朝着当政者希望的方向编写。该书作者参阅了多方的资料,从各方对同一事件的记录,推断出当时的实际情况,从这一点上看就很难得。毕竟,看完这些资料也是不容易的事情。而且,本书作者站在比较中立的立场分析一些事件,基本上做到了有理有据。

作者马伯庸的文字功底也很不错,整本书的结构清晰,叙事有条理。对于一些历史事件,背景都交代的非常清楚。文章以时间为线,以历史事件为纲,加上一些现代的口语化的叙事,极大的提高了文章的可读性。所以在此极力推荐大家也读一读这本书。
不过说句实话,看完这本书,感觉窝心的很。虽然书名为帝国的最后荣耀,其实这场战争打得相当窝囊,一点没看出荣耀在何处。当时中日两国的国力对比,中国是占据着绝对的优势的。这场战争充分暴露了中国人的劣根性,一盘散沙,内斗不断。反观日本人,虽然也有内部矛盾,但对外出奇的团结。

看完本书后,不尽感叹,和《明朝那些事儿》所写的一样,这段历史也是充满了内斗。中国内斗的优良传统也曾经深深的影响了朝鲜(韩国)。不过直到现在,中国仍然内斗不休,而韩国给我们的感觉就是非常的团结,特别是对待日本人时。真希望有人能够分析一下韩国是如何转变过来的,只有把这一点学习好了,中国才有可能强大起来。

拥抱chromium核心的Android WebView

概述

在移动平台上,Web APP和Native APP之争由来已久。在Apple AppStore取得巨大成功的今天,许多人开始看衰Web APP。但Web APP确实有着自己的优点,看看现在PC上页游的流行就可以知道,Web APP还是有存在的理由的。在Web APP和Native APP之争的同时,出现了第三种形态的APP,通常称之为混合应用程序(Hybrid App),即结合了HTML5和传统应用程序特征的一类应用程序。

开发混合应用程序(Hybrid App)的人员一定对Android SDK中的android.webkit.WebView这个类不陌生。它是一个View类,主要用途是用来渲染网页。得益于良好的封装,WebView屏蔽了底层webkit复杂的细节,应用程序只需要寥寥几行代码,就可以为应用程序增加HTML支持,为Hybrid App开发提供了强力支持。但Android WebView对HTML5的支持很差,性能也不行,直到Android 4.1,才有所改善。

(阅读全文...) >>

chromium android webview即将来袭?

在android 4.0发布之前,就有传闻chrome即将成为android的内置浏览器。Android 4.0发布后,证实只是采用了chromium的部分代码,主体还是WebKit for Android。以google的实力,将chrome搬到android是轻而易举的,随后发布的chrome for android就证明了这一点。但google没有这么快替换系统内置浏览器,主要原因还在于API兼容。在WebView API没有完全替代方案之前,Android默认web引擎是不会替换掉的。几个月前开始,chromium代码库开始出现了android_webview,这个项目就是要在chromium的基础上封装出和原来的WebView API完全兼容的API。

随着chromium的快速更新,android_webview下面的代码越来越完善了。五一在家研究了一番,发现已经可以build出AndroidWebView.apk,经过简单的修改后,已经可以加载网页,渲染网页了,但缺少事件处理。您可以从这里下载测试APK。程序界面如下图所示:

chromium_android_webview

从代码中可以得出如下信息:

1、运行在单进程模式下

2、同时支持软件渲染和硬件加速渲染(目前AndroidWebView走的是软件渲染路径)

Android WebView做这样的选择是有道理的,毕竟android硬件环境参差不齐。多进程支持/GPU渲染可以留给各厂商自行优化。本次的Google I/O即将开幕了,Android 5.0是否会闪亮登场呢?chrome是否成为android内置浏览器呢?让我们拭目以待吧。

如果您对chromium android WebView有兴趣,敬请关注开源项目:https://github.com/mogoweb/chromium_webview

使用jdb调试chromium中的Java代码

对于Android开发者而言,Eclipse + ADT是绝佳组合。不过Eclipse太重量了,超级耗内存,速度也比较慢。所以如果只是偶尔调试一下Java代码,可以尝试一下使用一下命令行调试工具jdb。在chromium升级到v26后,其中的jar文件包含了资源,为了调试Java代码,需要建多个android library project,比较麻烦。对于我而言,主要是调试chromium中的C++代码,偶尔调试一下java代码,所以就仿照adb_gdb脚本,自己写了一个java调试脚本,用于调试Content Shell,您可以从这里下载。

BTW,不要忘记了在AndroidManifest.xml中添加android:debuggable=”true”,因为这个原因,折腾了大半天才成功调试。

jdb命令和gdb命令不太一样,而且不支持缩写,使用起来不是很顺手,好在可以时刻输入help,看看应该使用什么命令。下面列出一些常用的jdb命令:

stop in <class id>.<method>[(argument_type,…)] — set a breakpoint in a method
stop at <class id>:<line> — set a breakpoint at a line

step — execute current line
step up — execute until the current method returns to its caller
stepi — execute current instruction
next — step one line (step OVER calls)
cont — continue execution from breakpoint

list [line number|method] — print source code

移植ContentShell到HTC flyer平板

去年年会上,终于被幸运女神眷顾了一回,中了一台HTC flyer。拿到这台平板后,就琢磨着要把Mogo Browser移植上去。HTC flyer运行的是Android 3.2系统,估计HTC也不打算提供Android 4.0更新了,而chromium for android不支持Android 4.0以下的系统,所以决定自己动手,丰衣足食。首先从ContentShell入手,把一些核心问题解决后,UI上的问题可以慢慢调整。

chromium for android的代码主体上是C++代码,使用NDK工具链编译,一些第三方库,比如skia/webkit等等,并没有直接用Android系统的,基本上可以兼容不同版本的android。不过在移植中还是发现了两个问题:

  • JNI代码。

有些C++代码回调Java代码,而回调的Java类或者成员方法不存在。比如MediaPlayerBridge::SetVideoSurface(jobject surface)会回调Java的Mediplayer类的setSurface方法,而这个方法是在Android 4.0之后才引入的。

  • skia

skia初始化字体的代码,会读取system_fonts.xml等几个xml配置文件,而这几个xml文件在android 3.2系统中没有。

这些不同系统的差异,可以补写相应的代码,根据不同的系统,走不同的代码路径。base模块提供了一个BuildInfo类,其中有一个sdk_int方法,可以判断当前系统所运行的API Level。

Chromium for android Java代码同样存在平台支持问题,在Android中被定义成不同的API Level,而且java属于解释性语言,不存在二进制兼容问题。我们所要做的是,在代码加上API level的判断,然后走上不同的代码分支。这可以通过Android SDK中的Build.VERSION.SDK_INT进行判断。

最后要说的是,如何找出API Level不同的代码呢?我的方法就是修改chromium build系统中的android_sdk_version,修改为一个比较低的版本,进行系统编译,这样如果有不支持的API调用,立刻就能发现,等所有修改过来后,再换成现在使用的值17。这样就可以兼顾到不同的Android系统了。AndroidManifest.xml中的android:minSdkVersion值也要根据自己所支持的最低android版本进行调整。

在这里可以下载支持Android 3.2的ContentShell。

chromium中的Browser Components

在Content API代码从chrome分离之后,chromium项目组继续对chrome进行模块化,这个项目称为Browser Components。其实将Content API从/src/chrome下分离开后,整个chromium的代码层次已经很清晰了。不过追求是无止境的,如果能够将chrome代码更加组件化,基于chromium开发浏览器就会更简单了。可以根据需要任意组合组件。这项工作开展于2012年第3季度中期,计划花上1~2人.年进行开发。详细信息可以看这篇文档。

chromium中的JNI

近期在学习《深入理解Android 卷I》,刚刚读了第2章:深入理解JNI,感觉对JNI理解更深了。出于学以致用的原则,下面将分析一下chromium中的JNI。

《深入理解Android》中讲到,JNI注册有两种方法:静态方法和动态方法。在通常的软件开发中,会采用动态注册。但在chromium中,却找不到JNI注册代码,C++回调Java代码也没有找到FindClass/GeMethodID之类的代码。原来,绝顶聪明的google工程师将这一过程自动化了,也就是在编译过程中根据Java中的特殊标记,自动生成JNI代码。

(阅读全文...) >>

打造自己的chrome for android

chromium移植已经接近尾声,正在冲刺beta版本。不过越往后面,越是一些难啃的骨头。虽然背靠chromium这座大山,但是网页的复杂性超乎想象。更郁闷的是,有些BUG在chrome for android上没有,但在我们的浏览器上存在。因此经常会有这样的质疑:人家的chrome浏览器好好的,你做的浏览器为什么会有这样的问题。面对这样的质疑,真是有苦说不出。在有些人看来,别人都把源代码开放出来了,超过他们是理所当然的。没有办法,碰到难啃的骨头只能迎难而上了。好在chrome for android(V25之后的版本)开始支持自行定制了,虽然没法调试全部的代码,但是部分代码还是可以调试的。这样在分析我们和chrome浏览器在代码执行路径上的差异,也许能够提供一种思路。下面就谈谈如何构建自己的chrome for android。

(阅读全文...) >>