Как получить минимально возможный размер библиотеки Chromium Embedded Framework - PullRequest
11 голосов
/ 22 ноября 2011

Chromium Embedded Framework (http://code.google.com/p/delphichromiumembedded/) хорошо. Я использую его для отображения статического HTML, JS и CSS, сгенерированного только из кода Delphi.

Но я считаю его слишком большим.

Iнужно:

  • Мне нужна поддержка HTML
  • Мне нужна поддержка JavaScript.
  • Мне нужна поддержка CSS.
  • Мне нужна поддержка Юникода.
  • Мне нужно событие OnNavigate.

Не нужно:

  • Мне не нужна поддержка D3D, GDI +, GLES.
  • Мне не нужна возможность загрузки веб-страницы. Мне достаточно LoadString.
  • Мне не нужны локали
  • Мне не нужно кэширование
  • Я не знаюне нужны средства разработчика

Как добиться того, чтобы обладать необходимыми функциями, имея минимально возможный пакет развертывания?

В настоящее время CEF имеет 40 МБ библиотек DLL.

Ответы [ 2 ]

10 голосов
/ 22 ноября 2011

Чтобы уменьшить сам размер библиотеки CEF, потребуется полная перестройка и некоторая фаза отладки.Потрачено много времени, возможно, не стоит - 40 МБ невелики, в зависимости от мощности компьютера и пропускной способности сети.Я предпочел бы полагаться на «официальный» выпуск CEF, чтобы следить за последними версиями браузера.

Если ваша проблема связана с размером пакета развертывания и одним исполняемым файлом / без возможности установки, вы можете рассмотреть возможность встраиванияdll s внутри exe.

Хитрость, которую я использовал, заключается в том, что .dll файлы сохраняются в виде zip внутри основного .exe, а затем распаковываются в личную временную папку на жестком диске.диск (возможно, вы захотите использовать ту же папку, но она не будет работать в C:\Program Files из-за UAC Vista / Seven, и ваш пользователь может задаться вопросом, откуда все эти файлы поступают из-за этого - вот почему я использую частныйпапка).

С точки зрения пользователя, нужно запустить только один исполняемый файл.Все .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, но у вас не будет никакого возможного сжатия.

3 голосов
/ 19 марта 2014

В зависимости от необходимых функций вы можете просто пропустить некоторые файлы / 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

Я думаю, что вы потеряете возможность воспроизведения видео и некоторый интерфейс, который не отображается, если вы просто используете его для отображения веб-сайта, встроенного в ваше приложение.

...