月度归档:2013年04月

使用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。