Chromium内核浏览器编译记(三)116版本内核UI定制

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/132180843?spm=1001.2014.3001.5501

本文出自 容华谢后的博客

往期回顾:

Chromium内核浏览器编译记(一)踩坑实录

Chromium内核浏览器编译记(二)UI定制

0.写在前面

最近因为业务需求,需要编译最新版本的Chromium内核,目前最新的版本是116.0.5845.59,编译的过程中发现有一些代码逻辑修改的地方都变了,所以在此记录下,分享给大家。

定制需求是这样的:

  • 修改包名、版本号、应用图标、应用名称

  • 不显示应用第一次启动时的设置引导页

  • 应用全屏显示,移除首页的所有菜单栏

  • 增加点击两次退出应用的功能

  • 默认不加载新标签页

1.修改包名

源码路径:/chromium/src/chrome/android/chrome_public_apk_tmpl.gni

将下面两个属性的值替换成你要修改的包名就可以了:

chrome_public_manifest_package = "org.chromium.chrome"chrome_public_test_manifest_package = "org.chromium.chrome.tests"

2.修改版本号

源码路径:/chromium/src/build/config/android/config.gni

将下面四个属性的值替换成你要修改的版本号就可以了:

android_default_version_code = "10000"
android_default_version_name = "1.00.00"android_override_version_code = "10000"
android_override_version_name = "1.00.00"

3.修改应用图标

源码路径:/chromium/src/chrome/android/java/res_chromium_base

在这个目录下,有几个mipmap文件夹,把里面的图标替换下就可以,和AS项目是一样的。

4.修改应用名称

源码路径:/chromium/src/chrome/android/java/res_chromium_base/values/channel_constants.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android"><string name="app_name" translatable="false">应用名称</string>
</resources>

5.屏蔽启动引导页

源码路径:/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java

将requiresFirstRunToBeCompleted方法的返回值修改为false:

/*** Overriding this function is almost always wrong.* @return Whether or not the user needs to go through First Run before using this Activity.*/
protected boolean requiresFirstRunToBeCompleted(Intent intent) {return false;
}

源码路径:/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java

删除或注释掉dispatch方法中下面的判断逻辑:

// Check if we should push the user through First Run.
if (FirstRunFlowSequencer.launch(mActivity, mIntent, false /* requiresBroadcast */,false /* preferLightweightFre */)) {return Action.FINISH_ACTIVITY;
}

6.应用全屏显示

源码路径:/chromium/src/chrome/android/java/res/values/styles.xml

在上面的源码中,找到Base.Theme.Chromium.WithWindowAnimation主题,增加下面的全屏设置属性:

<style name="Base.Theme.Chromium.WithWindowAnimation">...<item name="windowNoTitle">true</item><item name="windowActionBar">false</item><item name="android:windowFullscreen">true</item><item name="android:windowActionBar">false</item>
</style>

7.移除首页的所有菜单栏

源码路径:/chromium/src/chrome/android/java/res_app/layout/main.xml

在CoordinatorLayoutForPointer控件中,增加layout_marginTop属性,其实是往上移动了UI,把菜单栏隐藏了:

<mergexmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto">...<org.chromium.components.browser_ui.widget.CoordinatorLayoutForPointerandroid:id="@+id/coordinator"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" android:layout_marginTop="-96dp"></mergr>        

8.增加点击两次退出应用的功能

源码路径:/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java

在ChromeActivity类中增加下面的方法:

public int getTabsCount() {TabModelSelector modelSelector = getTabModelSelector();if (modelSelector == null) return 0;return modelSelector.getTotalTabCount();
}    

源码路径:/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java

修改minimizeAppAndCloseTabOnBackPress方法:

private boolean mExitApp;private boolean minimizeAppAndCloseTabOnBackPress(@Nullable Tab currentTab) {if (currentTab == null) {BackPressManager.record(BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB);MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.MINIMIZE_APP);assertOnLastBackPress();moveTaskToBack(true);return true;}// TAB history handler has a higher priority and should navigate page back before// minimizing app and closing tab.assert !currentTab.canGoBack(): "Tab should be navigated back before closing or exiting app";final boolean shouldCloseTab = backShouldCloseTab(currentTab);final WebContents webContents = currentTab.getWebContents();// Minimize the app if either:// - we decided not to close the tab// - we decided to close the tab, but it was opened by an external app, so we will go//   exit Chrome on top of closing the tabfinal boolean minimizeApp = false;BackPressManager.record(BackPressHandler.Type.MINIMIZE_APP_AND_CLOSE_TAB);assertOnLastBackPress();if (minimizeApp) {if (shouldCloseTab) {MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.MINIMIZE_APP_AND_CLOSE_TAB);sendToBackground(currentTab);} else {MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.MINIMIZE_APP);sendToBackground(null);}return true;} else if (shouldCloseTab) {if (getTabsCount() > 1) {MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.CLOSE_TAB);if (webContents != null) webContents.dispatchBeforeUnload(false);return true;}if (mExitApp) {MinimizeAppAndCloseTabBackPressHandler.record(MinimizeAppAndCloseTabType.CLOSE_TAB);if (webContents != null) webContents.dispatchBeforeUnload(false);return false;}Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();mExitApp = true;new Timer().schedule(new TimerTask() {@Overridepublic void run() {mExitApp = false;}}, 2000);return true;}return false;
}

9.默认不加载新标签页

源码路径:/chromium/src/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java

把下面两个参数,改成你想要显示的网页地址就可以了:

public static final String NTP_URL = "chrome-native://newtab/";public static final String NTP_NON_NATIVE_URL = "chrome://newtab/";

10.导航栏背景

新版本的浏览器,底部导航栏背景是白色的,如果有修改背景颜色的需求,可以改这里:

源码路径:/chromium/src/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedNavigationBarColorController.java

把updateNavigationBarColor方法中,setNavigationBarIconColor参数改成false:

@SuppressLint("NewApi")
private void updateNavigationBarColor() {...UiUtils.setNavigationBarIconColor(mRootView, false);
}

修改下面两个方法,冒号后面修改成你想要设置的导航栏背景颜色就可以了:

private @ColorInt int getNavigationBarColor(boolean forceDarkNavigationBar) {return forceDarkNavigationBar? mContext.getColor(R.color.toolbar_background_primary_dark): mContext.getColor(R.color.navigation_bubble_arrow);
}private @ColorInt int getNavigationBarDividerColor(boolean forceDarkNavigationBar) {return forceDarkNavigationBar? mContext.getColor(R.color.bottom_system_nav_divider_color_light): mContext.getColor(R.color.navigation_bubble_arrow);
}

11.遇到的问题

更新源码的时候,遇到这个提示:

NOTICE: You have PROXY values set in your environment, but gsutilin depot_tools does not (yet) obey them.Also, --no_auth prevents the normal BOTO_CONFIG environmentvariable from being used.To use a proxy in this situation, please supply those settingsin a .boto file pointed to by the NO_AUTH_BOTO_CONFIG environmentvariable.

被墙了,已经设置了全局代理,还需要再加个配置,将下面的配置保存成文件**.boto**,然后配置下环境变量:

[boto]
proxy=127.0.0.1
proxy_port=端口号

环境变量:

export PATH="$PATH:$HOME/.boto"

注意:文章中是把depot_tool下载到了【home/用户名】目录下,所以使用【$HOME】代表,环境变量要根据实际下载的路径修改。

12.编译脚本

最后在附上args.gn编译脚本:

target_os = "android"
target_cpu = "arm"
# Release版本
is_debug = false
# 不允许远程调试
enable_remoting = false
# 使用Chrome官方的编译优化建议
is_official_build = true
# 分散链接编译
is_component_build = false
# 不使用官方API秘钥
use_official_google_api_keys = false
# 关闭支持NACL,这是一种Chrome插件,因为安全性,稳定性存在问题,已经很少使用了
enable_nacl = false# 支持H264编码
proprietary_codecs = true
# 解码器
ffmpeg_branding = "Chrome"# 解决不能播放MP4格式的视频问题
rtc_use_h264  = truedeclare_args(){# 整体优化,对整个程序的多个编译单元进行全局优化,获取更好的性能和代码体积优化full_wpo_on_official = true# 删除内核层支持调试的符号文件remove_webcore_debug_symbols = false# 初始化FFmpegrtc_initialize_ffmpeg = true# 支持OpenH264use_openh264 = true
}

13.写在最后

到这里,Chromium源码的UI定制就完成了,有问题可以给我留言评论,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

木马免杀(篇一)基础知识学习

木马免杀&#xff08;篇一&#xff09;基础知识学习 ———— 简单的木马就是一个 exe 文件&#xff0c;比如今年hw流传的一张图&#xff1a;某可疑 exe 文件正在加载。当然木马还可能伪造成各式各样的文件&#xff0c;dll动态链接库文件、lnk快捷方式文件等&#xff0c;也可能…

MySQL单表查询

单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政治面貌 varch…

Spring MVC项目概述及创建

Spring MVC项目概述及创建 1.什么是Spring MVC Spring MVC是基于SevletAPI的原始Web框架。Spring MVC项目也叫做SpringWeb项目。 它是在springboot项目中引入了web框架&#xff0c;原本的spring项目不具备网络通信能力&#xff0c;而spring mvc允许http响应&#xff0c;当用…

无刷电机控制

无刷电机控制 特点: 线圈不动&#xff0c;磁极转动电子换向方式消除了有刷电机的缺点单位质量/功率转矩大驱动较复杂

群狼调研(靠谱市场调查公司):住宅物业满意度详细指标设计

群狼调研(长沙靠谱市场调查公司)受顾客委托开展住宅物业满意度调研&#xff0c;设计住宅物业满意度调研的详细指标需要考虑多个方面&#xff0c;包括物业服务质量、环境质量、安全与安保、社区活动与设施、居民沟通与投诉处理、费用管理与透明度等。以下是一些常见的详细指标设…

徐雷,太委屈

文 | 螳螂观察 作者 | 仲夏 自3月8日上线以来&#xff0c;京东百亿补贴已整整5个月。相比首月投入10个亿&#xff0c;京东百亿补贴如今的存在显得尴尬与鸡肋。 眼看百亿补贴难以肩负发力下沉市场、扛起低价策略的重任&#xff0c;京东近期又将“京喜拼拼”更名“京东拼拼”卷…

putty上传下载文件笔记

首先声明一点&#xff0c;putty是不支持上传下载的&#xff0c;但是可以变通实现。 通过cmd命令行实现 安装putty后&#xff0c;cmd可以使用pscp命令来上传下载。 1.本地上传至服务器 语法&#xff1a; pscp 盘名:\文件路径\文件名 用户名ip地址:路径 示例&#xff1a; ps…

FFmpeg 编码详细流程

介绍 FFmpeg的 libavcodec 模块完成音视频多媒体的编解码模块。FFmpeg 本身不具有音视频编码的功能和底层能力&#xff0c;只是对各类第三方的编码器API 进行封装调用。老版本的 FFmpeg 将avcodec_encode_video2()作为视频的解码函数 API&#xff0c;将avcodec_encode_audio2(…

(学习笔记-进程管理)进程间有哪些通信方式?

每个进程的用户地址空间都是独立的&#xff0c;一般而言是不能互相访问的&#xff0c;但内核空间时每个进程都共享的&#xff0c;所以进程之间要通信必须通过内核 管道 在Linux命令中 [ | ] 这个竖线就是一个管道。 $ ps auxf | grep mysql 它的功能是讲前一个命令&#xf…

如何使用 AT+WEBSERVER 指令实现自定义的 Webserver html 网页配网

开启 AT 固件中的 Webserver 指令和 FS 指令支持 乐鑫官网发布的默认通用 AT 固件不支持 webserver 配网功能&#xff0c; 需要用户自己搭建 esp-at 环境&#xff0c;并在 sdkconfig 中开启 webserver AT 指令 和 FS 指令的支持&#xff0c; 如下图所示&#xff1a; 测试 AT 固…

java中try-with-resources自动关闭io流

文章目录 java中try-with-resources自动关闭io流0 简要说明try-with-resources java中try-with-resources自动关闭io流 0 简要说明 在传统的输入输出流处理中&#xff0c;我们一般使用的结构如下所示&#xff0c;使用try - catch - finally结构捕获相关异常&#xff0c;最后不…

【香瓜说职场】疫情期间(2020.04.16)

一、疫情分析 也许是因为创业了一段时间&#xff0c;习惯了对产品和行业前景的分析与预测&#xff0c;在新冠肺炎爆发后&#xff0c;我在家对当前疫情进行了分析与自我预防。 在新冠肺炎爆发后&#xff0c;我首先去百度搜索了“非典”的历史&#xff0c;惊讶地发现“非典”是12…

Mybatis-plus的使用

1、介绍 2、开发方式 3、MyBatisPlus-01-MybatisPlus入门案例_哔哩哔哩_bilibili&#xff0c;105,3.55分钟 Mybatis使用流程可以看这&#xff1a; 4、創建一張表&#xff1a; ​ 5、创建一个SpringBoot工程 ​ ​ 6、版本调成8 ​ 7、这里之只做数据层&#xff0c;不弄we…

SpringBoot 依赖管理

Spring Boot 依赖管理 在 Spring Boot 中&#xff0c;依赖管理是通过 Maven 或 Gradle 进行管理的。Spring Boot 提供了一种简化的方式来管理和引入依赖项&#xff0c;使得构建和管理项目变得更加容易。下面是一些关于 Spring Boot 依赖管理的基本信息和示例&#xff1a; 使用…

如何系统的学习单片机?

一、学习单片机需要的一些基础知识 &#xff08;1&#xff09;要具有一些模电、数电的知识&#xff08;不一定要精通&#xff0c;但基本至少要知道&#xff09; &#xff08;2&#xff09;具备C语言基础&#xff0c;有基础就可以入门了。数据结构、设计模式、汇编这些&#x…

go的type关键字

在 Go 语言中&#xff0c;type 关键字用于定义自定义数据类型&#xff08;类型别名、结构体、接口等&#xff09;&#xff0c;以及获取某个变量的类型信息。type 关键字有多种用法&#xff0c;下面将详细解释这些用法&#xff1a; 1. 自定义数据类型 使用 type 关键字可以定义…

管理类联考——逻辑——论证逻辑——汇总篇——真题和典例——假设

通用方法/没有特点 方法关系 199-2013-1-41——方法关系——方法有效或方法可行 新近一项研究发现&#xff0c;海水颜色能够让飓风改变方向&#xff0c;也就是说&#xff0c;如果海水变色&#xff0c;飓风的移动路径也会变向。这也就意味着科学家可以根据海水的“脸色”判断…

Win10关闭自动更新的方法和影响(Windows modules installer worker cpu占用过高)

目录 问题描述&#xff1a; Windows modules installer worker是什么&#xff1f; Win10关闭自动更新的方法&#xff1a; Win10关闭自动更新的影响&#xff1a; 问题描述&#xff1a; 有时我们在使用电脑的过程中会突然出现电脑运行过慢&#xff0c;发热&#xff0c;风扇噪…

C++ string模拟实现(部分接口)

C string模拟实现 string模拟实现&#xff08;部分接口&#xff09; C的string类是一个类模板&#xff0c;用于表示和操作任何字符类型的字符串。 string类内部使用字符数组来存储字符&#xff0c;但是所有的内存管理&#xff0c;分配和空终止都由string类自己处理&#xff0c…

node.js

什么是Node.js Node.js 是一个免费的、开源的、跨平台的 JavaScript 运行时环境,使开发者可以搭建服务器端的JavaScript应用程序 概念: 使用Node.js编写后端程序 // 支持前端工程化 ​ 后端程序&#xff1a;提供接口和数据 &#xff0c;网页资源 ​ 前端工程化:对代码压缩&…