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));