96SEO 2026-02-19 20:59 0
首页没有WebView的使用、预加载X5内核的初始化也在启动流程之后

搞懂流程如果在排查启动性能时发现了不符合预期的主(子)线程耗时第一步就是摸清楚这段耗时代码是怎么被调用的。
见招拆招当我们知道代码如何被调用的之后就可以想办法进行修复工作如果是因为项目代码在错误的时机被调用那就延后或者去除相关调用
那我们开始第一步搞懂流程我们能看到图中耗时代码块被调用的系统方法是
WebViewChromiumAwInit.startChromiumLocked由于
ensureChromiumStartedLocked(boolean
INIT_STARTED;setChromiumUiThreadLocked(fromThreadSafeFunction);}if
(ThreadUtils.runningOnUiThread())
runs.startChromiumLocked();return;}mIsPostedFromBackgroundThread
thread-safe.AwThreadUtils.postToUiThreadLooper(new
文件里大致找一下就能找到以下嫌疑人第一反应是“这也太多了吧这咋排查啊”。
-getDefaultGeolocationPermissions
-getDefaultServiceWorkerController
-getDefaultWebViewDatabasepublic
{ensureChromiumStartedLocked(true);}}return
{ensureChromiumStartedLocked(true);}}return
{ensureChromiumStartedLocked(fromThreadSafeFunction);}}public
{ensureChromiumStartedLocked(true);}}return
getDefaultGeolocationPermissions()
(mDefaultGeolocationPermissions
{ensureChromiumStartedLocked(true);}}return
mDefaultGeolocationPermissions;}public
getDefaultServiceWorkerController()
(mDefaultServiceWorkerController
{ensureChromiumStartedLocked(true);}}return
mDefaultServiceWorkerController;}public
{ensureChromiumStartedLocked(true);if
WebIconDatabaseAdapter();}}return
{ensureChromiumStartedLocked(true);}}return
getDefaultWebViewDatabase(final
{ensureChromiumStartedLocked(true);if
WebViewDatabaseAdapter(mFactory,HttpAuthDatabase.newInstance(context,
HTTP_AUTH_DATABASE_FILE),mDefaultBrowserContext);}}return
}WebViewChromiumFactoryProvider.java
经过上面对的简单分析我们大概知道了WebViewChromiumAwInit.startChromiumLocked是被
方法调用的而ensureChromiumStartedLocked
方法会被以下几个方法调用那我们接下来的工作就需要找到下面这几个方法到底被谁调用了。
-getDefaultGeolocationPermissions
-getDefaultServiceWorkerController
-getDefaultWebViewDatabase到这里分享我的一个土方法我们要找到底哪个地方会调用这些方法那就找一个不认识的、看上去不会被别人提起的方法进行
google我们一眼就选中了getDefaultServiceWorkerController
方法没办法谁叫我不认识你呢。
虽然方法笨但是架不住效率啊。
于是乎我们把它揪出来了
WebViewChromiumFactoryProvider.java
大概是个什么角色WebViewChromiumFactoryProvider
createWebView所以其实就是个工厂模式。
通过抽象规范
我们在这个文件中也如愿以偿的看到了上面列出来的几个方法的调用。
WebViewChromiumFactoryProvider
在接口方法的实现中调用了WebViewChromiumAwInit
//WebViewChromiumFactoryProvider.java
mAwInit.getDefaultGeolocationPermissions();}Overridepublic
mAwInit.getDefaultCookieManager();}Overridepublic
ServiceWorkerControllerAdapter(mAwInit.getDefaultServiceWorkerController());}}return
mServiceWorkerController;}Overridepublic
mAwInit.getWebIconDatabase();}Overridepublic
mAwInit.getDefaultWebStorage();}Overridepublic
mAwInit.getDefaultWebViewDatabase(context);}WebViewDelegate
mWebViewDelegate;}WebViewContentsClientAdapter
createWebViewContentsClientAdapter(WebView
ScopedSysTraceEvent.scoped(WebViewChromiumFactoryProvider.insideCreateWebViewContentsClientAdapter))
WebViewContentsClientAdapter(webView,
ScopedSysTraceEvent.scoped(WebViewChromiumFactoryProvider.startYourEngines))
{mAwInit.startYourEngines(onMainThread);}}boolean
WebViewChromiumFactoryProvider.java、WebViewChromiumAwInit.java
的下面方法中的其中一个或者多个。
那其实问题就清晰了我们只需要找到我们
-getDefaultGeolocationPermissions
-getDefaultServiceWorkerController
##WebViewFactorySystemApipublic
WebViewFactory{//...UnsupportedAppUsageprivate
sProviderInstance;//...}##动态代理try
Class.forName(android.webkit.WebViewFactory);Method
clas.getDeclaredMethod(getProvider);method.setAccessible(true);Object
Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getSuperclass().getInterfaces(),new
RuntimeException(method.getName()).printStackTrace();return
clas.getDeclaredField(sProviderInstance);field.setAccessible(true);field.set(null,
之后我们就可以在我们的代理逻辑中加上断点来进行调试最终找到了造成
WebView非预期初始化的始作俑者WebSettings.getDefaultUserAgent。
WebSettings.getDefaultUserAgent
进行编译期的Hook重定向到带缓存defaultUserAgent
的相关方法就行了本地有缓存则直接读取本地没有则立即读取得益于之前我在项目中实现的使用方便的
发生变化之后怎么才能及时的更新本地缓存以及网络请求中用上新的defaultUserAgent。
我们的做法是
WebSettings.getDefaultUserAgent
每次App启动阶段结束之后会在子线程中去调用WebSettings.getDefaultUserAgent
搞定收工不仅解决问题效率高写博客也效率高一会就整完了简直就像是季度绩效考核前的产品出方案和上线的效率就一个字嗖。
为了帮助到大家更好的全面清晰的掌握好性能优化准备了相关的核心笔记还含底层逻辑https://qr18.cn/FVlo89
Bitmap优化与图片压缩优化https://qr18.cn/FVlo89
Framework学习手册》https://qr18.cn/AQpN4J
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback