Chromium for macOS 内置插件、自定义及自动化脚本(二)

参考链接:

以下大部分操作参考链接中已有,里面有说到这里不再赘述。

具体讲插件潜入和里面没有说到的点.

本文所有操作以 Cam(公司插件) 插件为例

一、嵌入插件

  1. 添加插件

    将 Cam 插件源码文件夹,复制到 src\chrome\browser\resources\ 文件夹目录下

  2. 修改组件加载源码

    打开 src\chrome\browser\extensions\component_loader.cc 文件,
    AddDefaultComponentExtensions() 函数中添加:

1
2
Add(IDR_LOVENSE_MANIFEST,
base::FilePath(FILE_PATH_LITERAL("lovense_cam")));

IDR_LOVENSE_MANIFEST 为插件资源目录的Key, 所有关联插件资源的Key都使用这个

lovense_cam 对应插件源码的文件夹名

  1. 关联插件的 mainfest.json 文件

    打开 src\chrome\browser\browser_resources.grd 文件并添加以下代码:

1
<include name="IDR_LOVENSE_MANIFEST" file="resources\lovense_cam\manifest.json" type="BINDATA" />

  1. 添加白名单

    打开 src\chrome\browser\extensions\component_extensions_whitelist\whitelist.cc 文件,在 bool IsComponentExtensionWhitelisted(int manifest_resource_id) 函数中的 switch 语句中添加以下代码:

    1
    case IDR_LOVENSE_MANIFEST:
![](http://ojpb4w81b.bkt.clouddn.com/17-9-29/13887680.jpg)
  1. 添加插件文件路径映射关系

打开 src\chrome\browser\resources\component_extension_resources.grd ,把除了mainfest.json文件之外的其他独立文件都加进来。

格式如下:

1
<include name="IDR_LOVENSE_128_PNG"  file="lovense_cam\128.png" type ="BINDATA" />

附 Swift 脚本代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/// 转换XML之后的结果字符串
var xmlString = ""

/// 将插件文件夹内所有内容转换为XML 路径->文件名 键值对
///
/// - Parameter rootDir: 文件夹路径
func convert2XML(rootDir: String) {
do {
let folder = try FileManager.default.contentsOfDirectory(atPath: rootDir)
for itemPath in folder {
let fullpath = rootDir.appending("/" + itemPath)
let relPath = fullpath.replacingOccurrences(of: rootPath, with: parentDir)

var isDir: ObjCBool = ObjCBool(false)
guard FileManager.default.fileExists(atPath: fullpath, isDirectory: &isDir) else { return }

if isDir.boolValue {
convert2XML(rootDir: fullpath)
} else {
if [".DS_Store", "manifest.json"].contains(itemPath) { continue }

let keyName = relPath
.replacingOccurrences(of: "/", with: "_")
.replacingOccurrences(of: ".", with: "_")
.replacingOccurrences(of: "-", with: "_")
.uppercased()
let xmlItem = "<include name=\"IDR_" + keyName + "\" file=\"\(relPath)\" type=\"BINDATA\" />"
xmlString.append(xmlItem + "\n")
}
}
} catch {
print(error)
exit(1)
}
}

Tip:必须保证 key 不能有重复的
Lovense Browser 每次打包时, 如果插件资源文件有添加或删除需要重新生成。

二、其他修改

  1. 修改 Chromium 关于页面的名字
    修改 src/chrome/app/settings_chromium_strings.grdp 文件中的 IDS_SETTINGS_ABOUT_PROGRAM 对应的值

  2. 修改 Chromium 关于页面的版本号
    修改 src/out/Lovense/gen/components/version_info/version_info_values.h 文件中的 PRODUCT_VERSION 对应的值

  3. 注释掉从 DMG磁盘镜像中打开 Chromium 提示已到应用程序文件夹中的提示(引发此操作是 Chromium 内核,如果移到应用程序中, 只有 Chromium 内核会移过去,而启动器不会, 所以直接注释掉)

    打开 src/chrome/browser/chrome_browser_main_mac.mm 文件,注释掉 void ChromeBrowserMainPartsMac::PreMainMessageLoopStart() 函数中 IsFirstRunSuppressed 判断

三、编译

参考 编译教程

添加资源文件后,编译可能会提示Key越界, 需将 src/tools/gritsettings/resource_ids 文件中中includes的值调大

四、打包

  1. 打开 LovenseBrowser.xcodeproj 项目,导出 iPa 安装包
  2. src/out/Release/Lovense Browser 拷贝到 LovenseBrowser.app/ 目录中
  3. 修改启动器名字 Lovense Browser
  4. 使用 DropDMG 打包
  5. 将Lovense Browser.dmg和Lovense_Browser_Mac_Update.zip上传到服务器并更新后台版本号即可

五、脚本

以上所有操作均已使用脚本自动化

脚本地址:Github

chromiumBuild.sh : 主要用于 depot_tools 下载、 Chromium 源码自动下载编译,源码安装好后不需要再使用

buildStarter.swift : 主要用于每次打包时自动将插件文件夹复制到指定位置,自动生成文件映射关系并替换,并修改软件版本号

build.sh : 主要用于编译 Chromium,打包 ipa 包,制作 DMG、Zip 文件

六、自动化脚本使用

  1. 下载脚本源码

  2. 打开终端

  1. 运行 buildStarter.swift 脚本,根据提示输入插件路径和版本号
1
$ ./buildStarter.swift
  1. 运行 build.sh 脚本, 编译 Chromium、打包、制作 DMG、Zip 文件
1
$ ./build.sh

Tip: 如果终端提示没有权限,需在终端执行以下命令

chmod +x buildStarter.swift

chmod +x build.sh

感谢您的阅读,本文由 Joe 版权所有。如若转载,请注明出处:Joe(http://joe0708.github.io/2017/12/23/Chromium-for-macOS-内置插件、自定义及自动化脚本-(二)/
Chromium for macOS 编译教程(一)
fastlane boarding 实践笔记