chromiumwebview裁剪总结

前言

近期一直忙Android ChromiumWebview的裁剪,简单说就是减少Webview相关文件的大小。有同学可能会疑惑,现在智能终端空间越来越大、内存也越来越大,比如现在手机没有64G ROM/4G RAM,都不好意思和别人打招呼,做裁剪的意义何在?说起来都是泪,总有些行业会为了省下几元钱而死磕,省下来才能生存啊。比如我们接到的任务是将Android 5.1系统裁剪到100M,因为设备只有256M ROM。是的,没看错,要将Android系统裁剪到100M,要知道光一个libwebviewchromium.so就去了30M,我接到的任务就是裁剪ChromiumWebview。

方案选择

Android浏览器从Android 4.4开始才采用chromium/blink引擎,在这之前的版本,采用的是WebKit引擎。相较于chromium,WebKit引擎要小得多,比如在Android 4.3中,WebView相关的组件:libwebcore.so的大小为7.2M,libchromium_net.so的大小为1.7M,总大小大约9M。而Android 5.1中,libwebviewchromium.so大小有30M。一种可能的选择就是使用WebKit引擎,虽然WebKit引擎能力有些弱,但应付普通的网页、实现定制业务还是绰绰有余(毕竟还有那么多Android低版本存在,网站不可能采取激进策略,不兼顾这些老的终端)。但在调研过程中发现,要把WebKit移植过来,还是很费力的一件事情。采用最新的WebKit肯定不现实,因为WebKit代码树上并没有Android的移植代码,从头进行移植工作量太大,对于我们这样的小公司而言成本太高。使用Android 4.3中的WebKit代码,接入到Android5.1系统,是一种更好的选择,但最后难在skia上。SKIA的开发独立于Android/WebKit,各个版本差异非常大,对比android 4.3和Android 5.1中的SKIA代码,差别不是一点点,这导致Android 4.3中WebKit的移植代码在Android 5.1中无法编译,费力解决了编译问题,还有运行上的问题,特别是硬件加速这块,Android 5.1和Android 4.3的差别也很大。所以Android 4.3上的WebKit移植代码需要做很多修改,才能适配到Android 5.1系统上。考虑到人力紧张,加上以后的维护成本,最终还是选择裁剪ChromiumWebView。

裁剪准备

系统的WebView组件主要包含以下几个文件:
- webview.apk: chromium java代码及图片、语言资源打包
- libwebviewchromium.so: chromium C++代码库
- libwebviewchromium_loader.so: chromium动态库加载及webview升级
- libwebviewchromium_plat_support.so:chromium在android系统上的平台支持代码

此外在frameworks/base/core/java/android/webkit还有少量代码,这些是系统不可少的SDK API,会build到frameworks.jar中,不在此次裁剪考虑范围。

裁剪总结

在进行裁剪之前和之后,各个文件的大小如下(chromium进行过升级,在加上有一些业务定制,所以和标准的Android 5.1上的文件有些差别):

文件 裁剪前大小(K) 裁剪后大小(K)
libwebviewchromium.so 30848 17896
webview.apk 2151 1334
libwebviewchromium_plat_support.so 10 10
libwebviewchromium_loader.so 5380 0

libwebviewchromium.so的裁剪

该so在webview组件中体积最大,是本次裁剪的重点,从以下几方面进行裁剪:

  • 共用系统库: chromium为了编译上的独立,不依赖于Android系统,包含了很多库比如libpng, libjpeg等,静态链接到libwebviewchromium.so,可以修改为动态链接系统库,减少空间。经过研究,可以共用系统的库有:harfbuzz-ng、libpng、freetype、sqlite、libjpeg、libexpat、zlib。
  • 移除部分html5支持:chromium对HTML5标准支持最积极,但很多HTML5特性很少用到,成为本次裁剪的对象,裁剪的HTML5特性有:webrtc、webp、xslt、IndexedDB、webdatabase、webaudio、webmidi、accessibility、webspeech、mediastream、webbluetooth、websocket、battery、beacon、device_light、gamepad、webcrypto、encryptedmedia、filesystem、networkinformation、devicesensors、credentialmanager、vibration、geolocation、screen_orientation、navigatorcontentutils、presentation、webm、webgl、appcache、serviceworker、workers
  • 移除部分不太常用的功能:比如调试支持、打印、插件等等,累计裁剪的浏览器功能有:
    autofill、opus、quic、spdy、devtools、inspector、、plugins、printing、sdch、phonenumber detector、data_reduction_proxy、cdm、ftp、svg、webui、mhtml, mojo bindings
  • 去掉多语言支持,只保留英文和简体中文。

webview.apk的裁剪

webview.apk中主要包含java字节码和图片、语言包等资源,主要裁剪一下内容:

  • 只保留英文和简体中文语言包
  • 移除代码中未使用到的图片、音频资源
  • 删除没有使用的代码文件

libwebviewchromium_loader.so裁剪

修改加载流程,因为升级是通过谷歌官方网站进行webview升级,对于我们的项目来说并没有用,所以去掉了在线升级功能,这样就不需要libwebviewchromium_loader.so文件。

libwebviewchromium_plat_support.so文件比较小,而且都是不可缺少的系统支持代码,没有进行裁剪。

更进一步

其实系统还存在几个比较大的裁剪点,比如使用系统skia替代chromium中的skia,使用系统的openssl替代chromium中的boringssl,这两者至少可以减掉2M的大小,不过难度也相当大,特别是skia,接口变化众多,需要对SKIA和chromium非常熟悉才能动手,由于时间关系,只做了尝试,解决编译问题,但运行起来存在诸多问题,没有继续下去。

chromiumwebview裁剪总结_第1张图片

你可能感兴趣的:(3.Android浏览器)