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

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

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

Я нуждаюсь:

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

Не нужно:

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

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

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


person Gad D Lord    schedule 22.11.2011    source источник
comment
Почему бы не использовать TWebBrowser, если вам нужна небольшая полезная нагрузка для развертывания   -  person David Heffernan    schedule 22.11.2011
comment
@DavidHeffernan - Раньше TWebBrowser был движущейся мишенью, и часто они менялись во время обновлений Windows. Это была моя причина номер один для проблем с поддержкой. Знаете, как сейчас?   -  person Leonardo Herrera    schedule 22.11.2011
comment
@LeonardoHerrera Не совсем эксперт. Я думаю, что пока вы держите его очень простым, проблем нет, а современный IE более стабилен и соответствует стандартам.   -  person David Heffernan    schedule 22.11.2011
comment
Я уже использую TWebBrowser и недоволен его мерцанием (stackoverflow.com/questions/6529166/)   -  person Gad D Lord    schedule 23.11.2011
comment
Я лично считаю, что это обоснованная проблема. Даже с современными технологиями все еще есть случаи, когда размер вызывает беспокойство, и нам определенно нужно что-то, чтобы заменить WebBrowser2 (штуки Windows Active X) или аналогичные вещи, которые в основном являются заменой, чтобы мгновенно благословить все настольные интерфейсы с современными функциями браузера.   -  person    schedule 07.02.2012


Ответы (2)


В зависимости от необходимых функций вы можете просто исключить некоторые файлы/DLL. Я пробовал и мог пропустить это:

  • avcodec-53.dll
  • avcodec-54.dll
  • avformat-53.dll
  • avformat-54.dll
  • avutil-51.dll
  • ffmpegsumo.dll
  • libEGL.dll
  • libGLESv2.dll
  • цеф.пак
  • хром.пак
  • devtools_resources.pak

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

person Steffen Binas    schedule 19.03.2014
comment
Сколько места вы получили без этих библиотек? - person Muis; 08.04.2014
comment
@Muis Эти файлы без сжатия составляют около 11,9 МБ, но ZIP сжимает только 4 МБ ... так что это то, что вы получаете при распространении своего приложения с помощью установщика. - person Steffen Binas; 09.04.2014
comment
В конце концов я последовал вашему подходу и мне удалось удалить avcodec-53.dll, avformat-53.dll, avutil-51.dll, chrome.pak, libEGL.dll, libGLESv2.dll - сэкономлено 4,4 МБ. Это как 14% моего установщика. Отличный материал. - person Gad D Lord; 29.03.2015
comment
Удалены также d3dcompiler_43.dll, d3dx9_43.dll — всего сэкономлено 8,32 МБ. Выяснилось, что минимальная установка с поддержкой юникода — это libbcef.dll, icudt.dll и папка Localed — 29,4 МБ. - person Gad D Lord; 29.03.2015

Что касается уменьшения размера самой библиотеки 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, но у вас не будет никакого возможного сжатия.

person Arnaud Bouchez    schedule 22.11.2011
comment
+1 хорошо! BTMemoryModule - еще одна штука, с которой я бы не стал... но встраивание ресурсов - хороший вариант! - person ; 22.11.2011
comment
Я использую InnoSetup со сжатием Lampel-Ziv-Markov, поэтому сжатие dll в основном не требуется. Мои опасения в основном связаны с любопытством, возможно ли использовать некоторые МАКРОСЫ (символы условной компиляции, определения и т. д.), чтобы самому построить его как более компактную версию (например, мы можем сделать для SQLite). - person Gad D Lord; 23.11.2011
comment
@GadDLord Как я уже писал в первой части своего поста, я бы не стал идти в этом направлении: Chrome — прекрасное, но сложное программное обеспечение, и вы пытаетесь создать собственную dll возможно, но сложно, и нет такого #define, который можно было бы установить, чтобы сделать его легче, насколько я знаю, из исходного кода проекта. Вам придется взломать исходный код проекта самостоятельно, и я почти уверен, что это будет пустой тратой времени и корнем многочисленных ошибок (если вы не эксперт CEF). - person Arnaud Bouchez; 23.11.2011