Как получить минимальный размер dlls Chromium Embedded Framework

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

Но я нахожу его слишком большим.

Мне нужно:

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

Не нужно:

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

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

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

Ответ 1

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

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

Ответ 2

О сокращении самого размера библиотеки CEF потребуется полная перестройка и фаза отладки. Много времени потрачено, возможно, не стоит того - 40 МБ мало, в соответствии с сегодняшней мощностью компьютера и пропускной способностью сети. Я предпочел бы полагаться на "официальный" выпуск 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, но у вас не будет никакого возможного сжатия.