月度归档:2013年10月

调试ContentShell启动过程的方法

本文探讨的如何调试ContentShell for Android的启动过程,主要是C++部分代码的流程,这对于理解ContentShell的启动流程、render进程是如何创建并启动的有很大的帮助。

理解Contenthell启动流程的最好方法是使用调试器逐步跟踪,不过chromium在很多地方采用了异步方式,单步跟踪相当困难,比较好的方法是在关键代码处打上断点,查看调用栈。由于ContentShell程序一启动,就会执行启动流程,启动主进程和render进程,并加载网页,这时再用gdb attach到进程,往往我们希望跟踪的代码已经执行过去了。一种比较土的方法就是在程序入口处加上sleep语句,在程序暂停时,执行gdb attach到进程,然后在关键代码处设上断点。这种方法有点不好的地方就是sleep的时间不好定,定短了,gdb还没有attach上去,程序已经执行过了。设长了,每次等的时间就长了。

其实chromium开发者已经考虑到这种需求,所以加入了一个命令行参数:wait-for-java-debugger。查看代码,可以发现在ContentShellActivity.java中就有一个方法waitForDebuggerIfNeeded(),其作用就是等待java调试器attach之后才继续往下执行。所以本文介绍的方法就是jdb/gdb组合来调试ContentShell启动过程。

  1. 修改content/shell/android/shell_apk/AndroidManifest.xml,在application节点加入android:debuggable=”true”,然后编译ContentShell,安装到连接的android设备。
  2. 从这里下载jdb_content_shell脚本,放到build/android目录下。
  3. 执行如下命令增加命令行参数:
    adb_content_shell_command_line --wait-for-java-debugger
  4. 启动android设备上的ContentShell。应该可以看到界面只是一个空白界面,程序没有接着往下执行。
  5. 执行adb_gdb_content_shell命令启动gdb调试,设置断点。
  6. 执行jdb_content_shell命令,可以观察到程序在继续往后执行。

[译]Android WebView

原文地址:https://crosswalk-project.org/#wiki/android-webview

1. 架构&组件

  • AOSP中的Android WebView将基于AwContents,其位于Content API和Content View之上。
  • 与Content API不同,它还依赖于从最初的chrome browser分离出来的组件,组件位于components/下,包含auto_login_parser,navigation_interception,visitedlink_browser,visitedlink_renderer和web_contents_delegate_android,这些都是用于页面。
  • 无渲染进程(进程内渲染),无沙盒机制(sandbox机制)
  • 图形架构和Content Shell有很大的不同,且正在开发中,将支持软件和硬件输出。

2. API

  • API类似于EFL WebView,不会暴露内部的browser/renderer/gpu进程。
  • 能够加载URL,接收加载过程中的事件和回调。
  • 可通过addJavaScriptInterface扩展JavaScript API,允许JavaScript调用Java代码,反之这不支持。
  • 提供了若干API接收页面状态改变通知和页面回调。

3. 消息循环和事件处理

  • 整合利用Android消息处理
  • native代码设置定时器到Java侧的消息循环

4. 图形

  • 渲染使用chromium合成器,开启了硬件加速
  • 合成器输出支持软件和硬件Surface
  • 硬件加速的架构和content shell不同,和ChromeOS类似。现在还处在早期开发阶段,使用了UberCompositor,支持软件输出

5. WebAPI扩展

  • API addJavaScriptInterface可用于JavaScript API扩展,但支持JavaScript调用Java代码。
  • 相反方向的调用(Java -> JavaScript)不支持
  • addJavaScriptInterface通过NPObject机制(之前用于NPAPI插件)支持进程外访问,虽然在WebView中不再需要。
  • 来自Java侧的事件通知貌似还不支持

6. API细节和涵盖范围

  • WebViewClient用于页面状态改变通知
  • WebChromeClient包含参与渲染逻辑的回调
  • 原生代码/JS交互
  • 页面加载
  • 导航&历史记录
  • 文字搜索
  • 事件处理
  • 轨迹球、触摸、键盘
  • 不支持鼠标事件
  • 设置:编码
  • 页面信息:标题、favicon
  • HTTPS/SSL
  • 页面加载状态、缩放、重定向、URL重载,等等

7. 源码

  • src/android_webview
    • android_webview_java.jar, libwebviewchromium.so和webviewchromium.pak是本模块的编译目标.
  • Google的工程师正在Android开源项目里开发基于Chrome核心的新WebView.
    • 官方 站点:
    • https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/webkit/

    • 镜像:
    • https://github.com/android/platform_frameworks_base/tree/master/core/java/android/webkit

  • 第三方开发者也在基于android_webview模块开发ChromeView
  • Third party developers work in progress to implement ChromeView based on android_webview module.
    • ChromeView有着和Android Webview一样的API.
    • https://github.com/pwnall/chromeview-src