chromiumwebview裁剪总结
来源:互联网 发布:xampp怎么切换php版本 编辑:程序博客网 时间:2024/05/18 22:42
前言
近期一直忙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上的文件有些差别):
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裁剪总结
- Android裁剪图片总结
- tff字体裁剪方案总结
- 裁剪图片之个人总结
- [Android] 图片裁剪总结——调用系统裁剪
- 裁剪
- 裁剪
- 裁剪
- 裁剪
- Jcrop裁剪图片[一] :前端js总结
- uCrop图片裁剪开源库使用总结
- 关于Android实现裁剪功能总结
- Cocos Studio可滚动层裁剪失败总结
- 【Cocos2d-x 3.2】裁剪节点(ClippingNode)总结
- Cocos Studio可滚动层裁剪失败总结
- Cocos Studio可滚动层裁剪失败总结
- 【Cocos2d-x 3.2】裁剪节点(ClippingNode)总结
- 【Cocos2d-x 3.2】裁剪节点(ClippingNode)总结
- Django基础
- Binary String Matching
- asp.net网站记录全局错误
- jni小结(Android studio版)
- BFS例题详解
- chromiumwebview裁剪总结
- 白话经典算法系列之十 一道有趣的GOOGLE面试题
- linux系统的搭建
- Java学习笔记整理06
- ThinkPHP5 模板渲染
- java面向对象总结
- 移动前端开发和 Web 前端开发的区别是什么?
- 字符串
- C# 短信通知(中国网建sms短信平台API)