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