月度归档:2012年10月

关于chromium的android移植

在写下<<Chromium for Android第一手尝鲜>>这篇博客后,陆陆续续收到一些回馈,看来大家都还挺关注这个开源项目的。可能是这个标题取的有些哗众取宠,另有些读者产生了误解,为此,我在本文将说明一下我对于chromium的android移植的一些理解。

首先声明一下,我并没有在android平台上移植chromium,而是在一个专有的操作系统上移植。在移植的过程中,发现chromium中的android移植代码非常有参考价值,所以就一边研究android移植代码,一边做chromium的移植。所以说,总体来说,对于android开发,我只处在入门级的水平。好在有internet,英语阅读能力还行,遇到不懂的都可以上网找到答案。所以关于一些android的问题,我实在是没有能力解答。

其次,我现在是基于Content API做浏览器,而不是移植整个的chromium浏览器。chromium源码中包含了一个ContentShell例程,这是一个简单的浏览器外壳,严格来说,它算不上一个浏览器,不过具有成长为一个现代浏览器的潜质。

下面就一些读者关心的问题做一个说明:

1)Chrome for android开源了?

chrome for android并没有开源,不过google也放出了一部分移植代码,你可以从这里下载部分代码。不过其中只包含了android平台的移植代码,并没有包含完整的chrome代码,如果您想根据这份代码编译出Chrome.apk,恐怕要失望了。如果您希望修复Chrome for android内核的BUG,那这份代码就是你想要的了。里面包含了一个README.Chrome_for_Android_SourceDistribution,说明了如何编译libchromeview.so,以及如何替换官方版本的Chrome.apk中的libchromeview.so。

2)Chrome浏览器开源吗?

严格来说,Chrome浏览器并没有开源,开源的是chromium,但Chrome浏览器是基于chromium开源项目的,在windows/linux下,chromium浏览器和Chrome浏览器的差别非常小。android平台下,还无法build出chromium浏览器。Chrome for android是在一个私有分支上进行开发的,看不到源码。

3)目前chromium的android移植状况

chromium在两个层次上提供了API: 一个是Webkit API,test_shell就是在这个层次的示例程序。另一个是Content API,content shell是基于这个层次的API开发的例程。

chromium代码树上出现了越来越多的chromium移植代码,但只能编译出content shell,而且这个content shell非常不完善,如果需要基于这个开发浏览器,需要付出很多的努力。

4)ContentShell可以在android模拟器上运行吗?

可以,但需要android 4.0以上的版本,模拟器需要开启硬件加速。模拟器开启硬件加速的方法:

注意,需要添加GPU emulation属性,并且属性值设置为yes。

5)build content shell需要android源码么?

不需要。最新的trunk分支甚至已经包含了android sdk和android NDK的下载,您甚至不需要事先下载android SDK和android NDK。

6)代码可以调试吗?

可以,c++部分的代码可以使用gdb_content_shell调试。如果希望调试java部分的代码,可以尝试如下脚本创建android工程:

#!/bin/bash
CURRENT_DIR="$(readlink -f "$(dirname $BASH_SOURCE)/../")"
if [[ -z "${CHROME_SRC}" ]]; then
  # If $CHROME_SRC was not set, assume current directory is CHROME_SRC.
  export CHROME_SRC="${CURRENT_DIR}"
fi
if [[ "${CURRENT_DIR/"${CHROME_SRC}"/}" == "${CURRENT_DIR}" ]]; then
  # If current directory is not in $CHROME_SRC, it might be set for other
  # source tree. If $CHROME_SRC was set correctly and we are in the correct
  # directory, "${CURRENT_DIR/"${CHROME_SRC}"/}" will be "".
  # Otherwise, it will equal to "${CURRENT_DIR}"
  echo "Warning: Current directory is out of CHROME_SRC, it may not be 
the one you want."
  echo "${CHROME_SRC}"
fi
cp ${CHROME_SRC}/content/shell/android/java/src -r ${CHROME_SRC}/c4a/java/
find ${CHROME_SRC}/c4a/java -name ".svn" |xargs rm -r
cp ${CHROME_SRC}/base/android/java/src -r ${CHROME_SRC}/c4a/java/
find ${CHROME_SRC}/c4a/java -name ".svn" |xargs rm -r
cp ${CHROME_SRC}/content/public/android/java/src -r ${CHROME_SRC}/c4a/java/
rm ${CHROME_SRC}/c4a/java/src/org/chromium/content/common/common.aidl
find ${CHROME_SRC}/c4a/java -name ".svn" |xargs rm -r
cp ${CHROME_SRC}/media/base/android/java/src -r ${CHROME_SRC}/c4a/java/
find ${CHROME_SRC}/c4a/java -name ".svn" |xargs rm -r
cp ${CHROME_SRC}/net/android/java/src -r ${CHROME_SRC}/c4a/java/
find ${CHROME_SRC}/c4a/java -name ".svn" |xargs rm -r
cp ${CHROME_SRC}/content/shell/android/res -r ${CHROME_SRC}/c4a/java/
cp ${CHROME_SRC}/out/Debug/content_shell/libs -r ${CHROME_SRC}/c4a/java/
cp ${CHROME_SRC}/out/Debug/content_shell/assets -r ${CHROME_SRC}/c4a/java/

7)如何跟上最新chromium代码

这也是我一直希望有人能够回答的问题,chromium代码的更新太疯狂了,每天都有大量的提交,代码结构调整是常有的事情。我现在只能是选择某个版本的chromium源码作为基础版本,以后如何跟进chromium最新代码,我也没有想好。