0x1、概述
对于Chrome的编译工作,大家可以参考上一篇《编译基于Chrome代码修改的Brave浏览器》,这里就不再重复了,这一篇主要是通过代码如何去修改User-Agent、代理、开启隐私模式等配置。在尝试修改前,自己也通过搜索引擎去搜索,但也没有发现可以直接使用的方式,以下加入功能的地方不一定是最好的,但至少可以实现功能,如果有更好的实现方式,欢迎大家指正。
0x2、修改功能
a、第一次启动跳过接受协议界面
在org.chromium.chrome.browser.firstrun.FirstRunActivity类中,
onNativeDependenciesFullyInitialized方法中添加acceptTermsOfService(false);
b、默认开启设置指纹保护功能
在org.chromium.chrome.browser.firstrun.FirstRunActivity类中,加引用
import org.chromium.chrome.browser.ChromeApplication;
import org.chromium.base.ContextUtils;
//在onNativeDependenciesFullyInitialized方法中添加
ChromeApplication app = (ChromeApplication)ContextUtils.getApplicationContext();
if (null != app) {
app.initShieldsConfig();
app.getShieldsConfig().setBlockFingerprints();
}
c、修改user-agent
在browser-android-tabs-master\net\base\network_delegate.cc中
extern std::string g_custom_ua;
并在NotifyBeforeSendHeaders方法中加入以下代码替换ua
headers->SetHeader("User-Agent", g_custom_ua);
其中g_custom_ua是一个全局变量,定义的地方可以在你喜欢的位置中定义,并实现jni设置代理的方法,在java层调用,以下是一种方式,在browser-android-tabs-master\chrome\browser\offline_pages\android\offline_page_bridge.cc中加入
#include <string>
std::string g_custom_ua;
static jboolean JNI_OfflinePageBridge_SetUserAgent(JNIEnv* env,
const JavaParamRef<jclass>& clazz,const JavaParamRef<jstring>& j_ua){
g_custom_ua = ConvertJavaStringToUTF8(env, j_ua);
return true;
}
并在org.chromium.chrome.browser.offlinepages.OfflinePageBridge.java中加入该方法,以供需要修改的地方调用
public static native boolean nativeSetUserAgent(String ua);
d、修改代理
在browser-android-tabs-master\net\socket\client_socket_pool_manager.h
声明新的函数
ProxyInfo GetProxyInfo(const ProxyInfo& proxy_info1);
在browser-android-tabs-master\net\socket\client_socket_pool_manager.cc
引用全局变量
extern std::string g_custom_host;
extern int g_custom_port;
并实现函数
ProxyInfo GetProxyInfo(const ProxyInfo& proxy_info1) {
ProxyInfo proxy_info;
const net::HostPortPair proxy_host(g_custom_host, g_custom_port);
//注意,这里需要代理的方式修改成你想支持的方式,也可以作为参数传进来,代理的类型请参考ProxyServer
const net::ProxyServer proxy_server(net::ProxyServer::SCHEME_SOCKS5,proxy_host);
proxy_info.UseProxyServer(proxy_server);
proxy_info.set_traffic_annotation(proxy_info1.traffic_annotation());
return proxy_info;
}
最后在InitSocketPoolHelper函数中调用,记得把函数中的原来proxy_info形式参数改为proxy_info1
net::ProxyInfo proxy_info = GetProxyInfo(proxy_info1);
最后在你自己喜欢的地方加上jni方法,给java层调用,我临时加在browser-android-tabs-master\chrome\browser\offline_pages\android\offline_page_bridge.cc中
先定义全局变量
std::string g_custom_host;
int g_custom_port;
再添加给java层调用的静态jni函数
static jboolean JNI_OfflinePageBridge_SetProxy(JNIEnv* env,
const JavaParamRef<jclass>& clazz,const JavaParamRef<jstring>& j_host,const jint j_port){
g_custom_host = ConvertJavaStringToUTF8(env, j_host);
g_custom_port = j_port;
return true;
}
最后在org.chromium.chrome.browser.offlinepages.OfflinePageBridge.java的加入以下方法
public static native boolean nativeSetProxy(String host,int port);
e、开启隐私模式
如果想在启动时自动进入隐私模式,可以加在org.chromium.chrome.browser.ChromeActivity.java中的initializeCompositorContent方法最后面,以下是加入的代码
ContextUtils.getAppSharedPreferences().edit().putBoolean(TemplateUrlService.PREF_DDG_OFFER_SHOWN, true).apply();
TemplateUrlService.getInstance().setSearchEngine(TemplateUrlService.DDG_SE_NAME, TemplateUrlService.DDG_SE_KEYWORD, true);
getTabModelSelector().getModel(false).commitAllTabClosures();
// This action must be recorded before opening the incognito tab since UMA actions
// are dropped when an incognito tab is open.
RecordUserAction.record("MobileMenuNewIncognitoTab");
RecordUserAction.record("MobileNewTabOpened");
//reportNewTabShortcutUsed(true);
getTabCreator(true).launchNTP();
f、自动打开网站
可以在ChromeTabbedActivity.java或者ChromeActivity.java合适的地方加入以下代码就可以了
getActivityTab().loadUrl(new LoadUrlParams(GOOGLE_URL, PageTransition.LINK));