问题 如何使最小尺寸的Chromium Embedded Framework dlls


Chromium Embedded Framework(http://code.google.com/p/delphichromiumembedded/)很不错。我用它来显示从Delphi代码生成的静态HTML,JS和CSS。

但我发现它太大了。

我需要:

  • 我需要HTML支持
  • 我需要JavaScript支持。
  • 我需要CSS支持。
  • 我需要Unicode支持。
  • 我需要OnNavigate事件。

不需要:

  • 我不需要D3D,GDI +,GLES支持。
  • 我不需要加载网页的能力。 LoadString对我来说已经足够了。
  • 我不需要Locales
  • 我不需要缓存
  • 我不需要开发人员工具

如何通过尽可能少的部署包来实现所需的功能?

目前CEF有40 MB的dll。


10999
2017-11-22 05:52


起源

如果您想要一个小的部署负载,为什么不使用TWebBrowser - David Heffernan
@DavidHeffernan - TWebBrowser曾经是一个移动目标,他们经常在Windows更新期间改变一些东西。这是我支持问题的头号原因。你知道现在怎么样吗? - Leonardo Herrera
@LeonardoHerrera不是真正的专家。我认为只要你保持简单就没有probs和现代IE更稳定和标准兼容。 - David Heffernan
我已经使用了TWebBrowser,我对它的闪烁问题不满意(stackoverflow.com/questions/6529166/...) - Ivelin Nikolaev
我个人认为这是一个有效的问题,即使使用当前的技术,仍然存在大小是一个问题的情况,我们肯定需要一些东西来取代WebBrowser2(windows active x stuff)或类似的东西,基本上是一个替代品,立即保佑所有桌面ui具有现代浏览器功能。


答案:


根据所需的功能,您可以省略一些文件/ DLL。我试过了,可以省略这些:

  • avcodec中-53.dll
  • avcodec中-54.dll
  • avformat-53.dll
  • avformat-54.dll
  • avutil-51.dll
  • ffmpegsumo.dll
  • libEGL.dll
  • libGLESv2.dll
  • cef.pak
  • chrome.pak
  • devtools_resources.pak

我认为如果您简单地使用它来显示应用程序中嵌入的网站,您将失去视频播放功能和一些未显示的UI。


3
2018-03-19 10:48



没有这些库,你获得了多少空间? - Muis
@Muis这些文件是未压缩的大约11.9 MB,但ZIP压缩只有4 MB ...所以这是您在使用安装程序分发应用程序时获得的。 - Steffen Binas
最终我按照你的方法设法删除了avcodec-53.dll,avformat-53.dll,avutil-51.dll,chrome.pak,libEGL.dll,libGLESv2.dll - 保存了4.4 MB。这就像我的安装程序的14%。好东西。 - Ivelin Nikolaev
删除了d3dcompiler_43.dll,d3dx9_43.dll - 总共节省了8.32 MB。原来,支持Unicode的最小安装是libbcef.dll,icudt.dll和Localed文件夹 - 29.4 MB。 - Ivelin Nikolaev


关于减少CEF库本身,它需要一个完整的重建,以及一些调试阶段。根据今天的计算机功率和网络带宽,花费了大量时间,可能不值得 - 40 MB很小。我宁愿依靠CEF的“官方”版本来关注最新版本的浏览器。

如果您的问题是关于部署包大小和单个可执行/无安装功能,您可以考虑嵌入 dll在里面 exe

我使用的技巧是 .dll 文件在主文件中存储为zip .exe,然后在硬盘驱动器上的私有临时文件夹上解压缩(您可能希望使用相同的文件夹,但它不会在 C:\Program Files 由于Vista / Seven UAC,您的用户可能想知道所有这些文件来自哪里 - 这就是我使用私人文件夹的原因)。

从用户的角度来看,只有一个可执行文件可以运行。所有 .dll 文件在其中压缩,您还可以向文件添加一些非二进制资源(使用exe / dll压缩程序无法实现)。创建一个隐藏文件夹并用于加载库(必须加载它们) LoadLibrary(),而不是静态链接),并且解压缩只会进行一次(因此它比使用exe / dll压缩器更快)。

我用它来嵌入hunspell.dll库和英语词典到我们的 SynProject 工具。代码如下所示:

constructor THunSpell.Create(DictionaryName: string='');
var Temp, HunSpell, Aff, Dic: TFileName;
    i: integer;
begin
  if DictionaryName='' then
    DictionaryName := 'en_US';
  Temp := GetSynopseCommonAppDataPath;
  HunSpell := Temp+'hunspell.dll';
  with TZipRead.Create(HInstance,'Zip','ZIP') do
  try
    Aff := DictionaryName+'.aff';
    if not FileExists(Temp+Aff) then
      StringToFile(Temp+Aff,UnZip(NameToIndex(Aff)));
    Dic := DictionaryName+'.dic';
    if not FileExists(Temp+Dic) then
      StringToFile(Temp+Dic,UnZip(NameToIndex(Dic)));
    if not FileExists(HunSpell) then
      StringToFile(HunSpell,UnZip(NameToIndex('hunspell.dll')));
  finally
    Free;
  end;
  fHunLib := SafeLoadLibrary(HunSpell);
  if fHunLib=0 then
    exit;
  if not LoadEntryPoints then begin
    FreeLibrary(fHunLib);
    fHunLib := 0;
    exit;
  end;
  fDictionaryName := DictionaryName;
  fHunHandle := Hunspell_create(pointer(Temp+Aff),pointer(Temp+Dic));
  if fHunHandle=nil then
    exit;
   (....)
end;

看到 这个链接 关于细节和源代码。

您可以考虑使用一些低级别的黑客 BTMemoryModule,但你不会有任何可能的压缩。


10
2017-11-22 06:55



+1好看! BTMemoryModule是另一件我不想去的东西......但资源嵌入是一个不错的选择! - ComputerSaysNo
我使用InnoSetup和Lampel-Ziv-Markov压缩,因此几乎不需要压缩。我担心的主要是好奇心,如果可能的话,可以使用一些MACROS(条件编译符号,定义等)来自己构建它作为更精益的版本(就像我们可以为SQLite做的那样)。 - Ivelin Nikolaev
@GadDLord正如我在帖子的第一部分写的那样,我不会朝着那个方向前进:Chrome是一个很好但很复杂的软件,并试图让你自己的dll 是可能的 但很复杂,并且没有设置这样的#define来使它更轻,AFAIK来自项目源代码。你必须自己破解项目源代码,我很确定这将是浪费时间和许多错误的根源(除非你是CEF专家)。 - Arnaud Bouchez
再看看 magpcss.org/ceforum/viewtopic.php?f=6&t=146 - Ivelin Nikolaev
为什么两个自豪的匿名下选民? - Arnaud Bouchez