移植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。

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>