欢迎访问皮皮网官网
皮皮网

【php源码学习系列】【阿姨帮网站源码】【前端购物app源码】cef 源码

时间:2024-12-26 01:07:09 分类:综合 来源:stcisp源码

1.使用CEF(四)— 在QT中集成CEF(1)基本集成
2.cef是什么文件夹
3.探索chrome二进制大小的变迁和剪裁chromium的一些思路
4.如何利用CEF3创建一个简单的应用程序

cef 源码

使用CEF(四)— 在QT中集成CEF(1)基本集成

       在QT,一个强大的跨平台C++开发框架,上构建基于CEF(Chrome Embedded Framework)的应用程序,我们之前的文章已经展示了基础的样例,但这些示例主要依赖原生或功能有限的CEF视图。本文将重新开始,php源码学习系列通过VS,实现一个结合QT和原生窗体的集成项目。

       环境搭建

       本文不依赖QtCreator,而是使用VS和Qt VS Tools来构建环境,前提是你已安装并熟悉QT。

       安装Qt VS Tools插件

       在VS扩展中搜索并安装相应的QT插件,安装后别忘了重启VS。阿姨帮网站源码

       配置Qt环境

       在Extensions - Qt VS Tools - Options中,配置Qt-VS编译设置。

       创建Qt项目

       在配置完成后,通过VS创建项目,Qt模板将自动出现。我们创建名为QtCefDemo的项目,Qt创建向导随即启动。

       项目结构

       创建完成后,项目的文件结构如下,展示了一个基本的VS IDE下的QT项目。

       集成CEF环境

       为了集成CEF,我们首先需要编译并准备相应的前端购物app源码头文件、库文件和资源文件,包括libcef_dll_wrapper.lib(MDd和MD版本)。

       项目目录结构

       按照步骤,你会看到项目的文件夹结构,包括CefFiles文件夹及其内部的头文件、库文件和资源。

       配置manifest文件和VS设置

       为CEF项目配置manifest文件,以及头文件和库文件的路径,这里会根据Debug和Release环境自动调整。

       集成完成后的问题与解决方案

       在集成过程中,可能会遇到运行时的库文件问题。需要手动或通过脚本将相关文件复制到输出目录。dnf 遍历器源码初始运行可能存在问题,但后续文章将深入探讨解决方法。

       源码和资源

       项目源码可以在我的GitHub仓库找到,链接在此省略。此外,需要下载CefFiles文件夹,可以从网盘获取,链接同样省略。

cef是什么文件夹

       CEF是Chromium Embedded Framework的缩写,是基于Google Chrominum项目开发的一个web浏览器控件。

       CEF是开源的,可以下载源码,网页源码的前缀去掉自己不需要的模块,然后自己编译,也可以直接使用CEF提供的库,CEF提供的库是libcef.dll,很多程序都有libcef.dll这个动态库,比如qq和evernote,但是大小都不一样,估计是自己裁剪过然后编译的。

探索chrome二进制大小的变迁和剪裁chromium的一些思路

       研究chromium源码的价值不仅在于学习,还在于商业应用,但随着版本升级,cef的大小从MB增长至MB,对注重安装包大小的开发者来说,寻求减小chromium内核尺寸是一个挑战。本文通过对比历史版本,探究chrome二进制文件的变化,为裁剪chromium提供策略。

       首先,对比不同版本chrome的Windows 位安装包,发现从MB增长到MB,我们挑选了变化显著的包进行详细分析(红色箭头标出)。解压后,逐版本对比安装包内的文件大小变化,以及各文件占总大小的百分比变化。

       chrome.dll的体积持续增长,占总大小的比例也不断提升,但其他模块总体趋势向小型化发展。在chrome.dll模块分析中,发现至版本,chrome_child.dll的合并抑制了体积增长;至版本,notification_helper.exe等模块的合并导致显著增长。这说明模块合并对整体体积控制有积极作用,但同时也增加了去除特定功能的难度。

       特别指出,3D模块的增长显著,删除支持3D相关的文件可减小MB。snapshot技术优化带来体积减少,部分隐藏在chrome.dll中。资源相关的文件体积明显减小,如icudtl.dat,可通过裁剪减少到几十KB。

       关于裁剪思路,虽然chromium编译中间产物有3w多个obj文件,但我们通过分析Top 文件,发现v8和third_party模块的体积较大。通过一级目录聚合,可以看出v8和third_party\blink的体积不容忽视。进一步细分,blink的core和bindings模块对二进制贡献较大,而v8的优化则需更细致的处理。

       特别值得关注的是,perfetto的trace_processor模块和pdfium、libjxl、dawn、webrtc等第三方库对体积影响较大。考虑使用V8的V8Lite模式和裁剪jit、wasm模块,能有效减少V8体积。然而,这些基于编译中间产物的分析可能与最终dll大小存在偏差,一般能减小-%的体积。

       总的来说,理解chromium源码和运行方式有助于优化,对开发者来说,这是一次从不同角度深入了解chromium的机会。欢迎交流和学习。

如何利用CEF3创建一个简单的应用程序

       cefsimple项目中默认加载的URL是 google.com,当然,你也可以用自定义的 URL 去替代它,最方便的就是通过命令行搞定。

       # Load the local file “c:\example\example.html”

       cefsimple.exe --url=file://c:/example/example.html

       é™¤äº†å‘½ä»¤è¡Œçš„方法,也可以通过直接修改在 cefsimple/simple.cpp 文件中的代码,达到你的目的。

       # Load the local file “c:\example\example.html”

       â€¦

       if (url.empty())

       url = file://c:/example/example.html;

       åº”用程序组成

       æ‰€æœ‰çš„ CEF 应用程序都有一下主要组成部分:

       CEF 的动态链接库 。(在 Windows 平台下就是 libcef.dll)

       æ”¯æŒåº“。(ICU, FFMPEG等)

       èµ„源。(html/js/css, strings等)

       å®¢æˆ·ç«¯æ‰§è¡Œæ–‡ä»¶ã€‚(本教程中就是 cefsimple.exe.)

       è¦ç‚¹ï¼ˆå¿…看)

       CEF 使用的是多进程。应用程序主进程是浏览器进程,而其他子进程是由 renderer, plugins, GPU等创建。

       åœ¨ Windows 和 Linux 平台下的执行文件可以被主进程和子进程使用。

       CEF 中所有进程都可以是多线程的。CEF提供了许多功能和接口在不同的线程中传递任务。

       ä¸€äº›å›žè°ƒæ–¹æ³•å’Œå‡½æ•°åªèƒ½åœ¨ç‰¹å®šçš„进程或者线程中使用。在你第一次使用新的回调方法或者函数之前,请确保你已经阅读了 API 头文件中源码,看使用要求。

       æµç¨‹åˆ†æž

       cefsimple 应用程序首先初始化CEF,然后创建了一个简单的弹出浏览器窗口。当关闭了所有的浏览器窗口,应用程序就会结束。程序执行流程如下:

       ç³»ç»Ÿæ‰§è¡Œå…¥å£ç‚¹å‡½æ•°(main or wWinMain),并创建浏览器进程。

       å…¥å£ç‚¹å‡½æ•°ï¼š

       åˆ›å»ºèƒ½å¤Ÿå¤„理进程级别的回调方法的 SimpleApp 实例。

       åˆå§‹åŒ– CEF,进入 CEF 消息循环。

       åˆå§‹åŒ– CEF 之后,调用 SimpleApp::OnContextInitialized() 。这个方法中:

       åˆ›å»ºå•ä¾‹çš„ SimpleHandler 。

       ç”± CefBrowserHost::CreateBrowsersync() 方法创建一个浏览器窗口。

       æ‰€æœ‰çš„浏览器共享 SimpleHandler 实例, 此实例能定制浏览器行为、处理浏览器相关回调方法(life span, loading state, title display等)。

       å½“一个浏览器窗口关闭的时候,调用 SimpleHandler::OnBeforeClose() 。当所有的浏览器窗口全部关闭时,OnBeforeClose() 函数就会执行跳出 CEF 消息循环的行为,退出应用程序。

       å…¥å£ç‚¹å‡½æ•°

       ç¨‹åºçš„运行开始于浏览器进程中的入口点函数。这个函数会初始化 CEF 以及所有跟操作系统有关的对象。

       Windows

       #include <windows.h>

       #include "cefsimple/simple_app.h"

       #include "include/cef_sandbox_win.h"

       // Set to 0 to disable sandbox support.

       #define CEF_ENABLE_SANDBOX 1

       #if CEF_ENABLE_SANDBOX

       // The cef_sandbox.lib static library is currently built with VS. It may not

       // link successfully with other VS versions.

       #pragma comment(lib, "cef_sandbox.lib")

       #endif

       // Entry point function for all processes.

       int APIENTRY wWinMain(HINSTANCE hInstance,

       HINSTANCE hPrevInstance,

       LPTSTR lpCmdLine,

       int nCmdShow) {

       UNREFERENCED_PARAMETER(hPrevInstance);

       UNREFERENCED_PARAMETER(lpCmdLine);

       void* sandbox_info = NULL;

       #if CEF_ENABLE_SANDBOX

       // Manage the life span of the sandbox information object. This is necessary

       // for sandbox support on Windows. See cef_sandbox_win.h for complete details.

       CefScopedSandboxInfo scoped_sandbox;

       sandbox_info = scoped_sandbox.sandbox_info();

       #endif

       // Provide CEF with command-line arguments.

       CefMainArgs main_args(hInstance);

       // SimpleApp implements application-level callbacks. It will create the first

       // browser instance in OnContextInitialized() after CEF has initialized.

       CefRefPtr<SimpleApp> app(new SimpleApp);

       // CEF applications have multiple sub-processes (render, plugin, GPU, etc)

       // that share the same executable. This function checks the command-line and,

       // if this is a sub-process, executes the appropriate logic.

       int exit_code = CefExecuteProcess(main_args, app.get(), sandbox_info);

       if (exit_code >= 0) {

       // The sub-process has completed so return here.

       return exit_code;

       }

       // Specify CEF global settings here.

       CefSettings settings;

       #if !CEF_ENABLE_SANDBOX

       settings.no_sandbox = true;

       #endif

       // Initialize CEF.

       CefInitialize(main_args, settings, app.get(), sandbox_info);

       // Run the CEF message loop. This will block until CefQuitMessageLoop() is

       // called.

       CefRunMessageLoop();

       // Shut down CEF.

       CefShutdown();

       return 0;

       }

       SimpleApp

       SimpleApp 负责处理进程级别的回调方法。它会曝露出一些在多进程中共享或者被特定进程使用的接口和方法。CefBrowserProcessHandler 接口,在浏览器进程中调用。还有一个被分离出 CefBrowserProcessHandler 接口(例子项目没有展示)只会在渲染进程中被调用。由于 CefBrowserProcessHandler 不光实现了 CefApp, 同时还有 CefBrowserProcessHandler,所以它的返回值必须是[this]。

       // simple_app.h

       #include "include/cef_app.h"

       class SimpleApp : public CefApp,

       public CefBrowserProcessHandler {

       public:

       SimpleApp();

       // CefApp methods:

       virtual CefRefPtr<CefBrowserProcessHandler> GetBrowserProcessHandler()

       OVERRIDE { return this; }

       // CefBrowserProcessHandler methods:

       virtual void OnContextInitialized() OVERRIDE;

       private:

       // Include the default reference counting implementation.

       IMPLEMENT_REFCOUNTING(SimpleApp);

       };

       // simple_app.cpp

       #include "cefsimple/simple_app.h"

       #include <string>

       #include "cefsimple/simple_handler.h"

       #include "cefsimple/util.h"

       #include "include/cef_browser.h"

       #include "include/cef_command_line.h"

       SimpleApp::SimpleApp() {

       }

       void SimpleApp::OnContextInitialized() {

       REQUIRE_UI_THREAD();

       // Information used when creating the native window.

       CefWindowInfo window_info;

       #if defined(OS_WIN)

       // On Windows we need to specify certain flags that will be passed to

       // CreateWindowEx().

       window_info.SetAsPopup(NULL, "cefsimple");

       #endif

       // SimpleHandler implements browser-level callbacks.

       CefRefPtr<SimpleHandler> handler(new SimpleHandler());

       // Specify CEF browser settings here.

       CefBrowserSettings browser_settings;

       std::string url;

       // Check if a "--url=" value was provided via the command-line. If so, use

       // that instead of the default URL.

       CefRefPtr<CefCommandLine> command_line =

       CefCommandLine::GetGlobalCommandLine();

       url = command_line->GetSwitchValue("url");

       if (url.empty())

       url = "xxx";

       // Create the first browser window.

       CefBrowserHost::CreateBrowserSync(window_info, handler.get(), url,

       browser_settings, NULL);

       }

       SimpleHandler

       SimpleHandler 负责处理浏览器级别的回调方法。这些回调方法会在浏览器进程中执行。在这个项目中,针对所有的浏览器使用相同的 CefClient 实例,但是如果你愿意,可以在自己的应用程序中使用不同的 CefClient实例的。

       // simple_handler.h

       #include "include/cef_client.h"

       #include <list>

       class SimpleHandler : public CefClient,

       public CefDisplayHandler,

       public CefLifeSpanHandler,

       public CefLoadHandler {

       public:

       SimpleHandler();

       ~SimpleHandler();

       // Provide access to the single global instance of this object.

       static SimpleHandler* GetInstance();

       // CefClient methods:

       virtual CefRefPtr<CefDisplayHandler> GetDisplayHandler() OVERRIDE {

       return this;

       }

       virtual CefRefPtr<CefLifeSpanHandler> GetLifeSpanHandler() OVERRIDE {

       return this;

       }

       virtual CefRefPtr<CefLoadHandler> GetLoadHandler() OVERRIDE {

       return this;

       }

       // CefDisplayHandler methods:

       virtual void OnTitleChange(CefRefPtr<CefBrowser> browser,

       const CefString& title) OVERRIDE;

       // CefLifeSpanHandler methods:

       virtual void OnAfterCreated(CefRefPtr<CefBrowser> browser) OVERRIDE;

       virtual void OnBeforeClose(CefRefPtr<CefBrowser> browser) OVERRIDE;

       // CefLoadHandler methods:

       virtual void OnLoadError(CefRefPtr<CefBrowser> browser,

       CefRefPtr<CefFrame> frame,

       ErrorCode errorCode,

       const CefString& errorText,

       const CefString& failedUrl) OVERRIDE;

       // Request that all existing browser windows close.

       void CloseAllBrowsers(bool force_close);

       private:

       // List of existing browser windows. Only accessed on the CEF UI thread.

       typedef std::list<CefRefPtr<CefBrowser> > BrowserList;

       BrowserList browser_list_;

       // Include the default reference counting implementation.

       IMPLEMENT_REFCOUNTING(SimpleHandler);

       };

       // simple_handler.cpp

       #include "cefsimple/simple_handler.h"

       #include <sstream>

       #include <string>

       #include "cefsimple/util.h"

       #include "include/cef_app.h"

       #include "include/cef_runnable.h"

       namespace {

       SimpleHandler* g_instance = NULL;

       } // namespace

       SimpleHandler::SimpleHandler() {

       ASSERT(!g_instance);

       g_instance = this;

       }

       SimpleHandler::~SimpleHandler() {

       g_instance = NULL;

       }

       // static

       SimpleHandler* SimpleHandler::GetInstance() {

       return g_instance;

       }

       void SimpleHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {

       REQUIRE_UI_THREAD();

       // Add to the list of existing browsers.

       browser_list_.push_back(browser);

       }

       void SimpleHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {

       REQUIRE_UI_THREAD();

       // Remove from the list of existing browsers.

       BrowserList::iterator bit = browser_list_.begin();

       for (; bit != browser_list_.end(); ++bit) {

       if ((*bit)->IsSame(browser)) {

       browser_list_.erase(bit);

       break;

       }

       }

       if (browser_list_.empty()) {

       // All browser windows have closed. Quit the application message loop.

       CefQuitMessageLoop();

       }

       }

       void SimpleHandler::OnLoadError(CefRefPtr<CefBrowser> browser,

       CefRefPtr<CefFrame> frame,

       ErrorCode errorCode,

       const CefString& errorText,

       const CefString& failedUrl) {

       REQUIRE_UI_THREAD();

       // Don't display an error for downloaded files.

       if (errorCode == ERR_ABORTED)

       return;

       // Display a load error message.

       std::stringstream ss;

       ss << "<html><body bgcolor=\"white\">"

       "<h2>Failed to load URL " << std::string(failedUrl) <<

       " with error " << std::string(errorText) << " (" << errorCode <<

       ").</h2></body></html>";

       frame->LoadString(ss.str(), failedUrl);

       }

copyright © 2016 powered by 皮皮网   sitemap