[Android] VasSonic H5加载优化加载库 源码解读及需要注意的地方

VasSonic是腾讯研发的高性能Hybrid框架,优化H5页面首屏加载速度。本文介绍了如何将其引入Android项目,以及预加载和首次加载的源码解读,揭示了其通过原生传输通道加速页面加载的机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、VasSonic是什么?

一句话总结:优化webview对h5的加载速度

wiki原话:

VasSonic取名于世嘉游戏形象音速小子,是腾讯VAS(SNG增值产品部QQ会员)团队研发的一个轻量级的高性能的Hybrid框架,专注于提升页面首屏加载速度,完美支持静态直出页面和动态直出页面,兼容离线包等方案。

该框架使用终端应用层原生传输通道取代系统浏览器内核自身资源传输通道来请求页面主资源,在移动终端初始化的同时并行请求页面主资源并做到流式拦截,减少传统方案上终端初始化耗时长导致页面主资源发起请求时机慢或传统并行方案下必须等待主资源完成下载才能交给内核加载的影响。
另外通过客户端和服务器端双方遵守VasSonic格式规范(通过在html内增加注释代码区分模板和数据),该框架做到智能地对页面内容进行动态缓存和增量更新,减少对网络的依赖和数据传输的大小,大大提升H5页面的加载速度,让H5页面的体验更加接近原生,提升用户体验及用户留存率。

目前QQ会员、QQ游戏中心、QQ个性化商城、QQ购物、QQ钱包、企鹅电竞等业务已经在使用,日均PV在1.2亿以上(仅统计手Q内数据),页面首屏平均耗时在1s以下。

2、怎么引入到项目中

https://github.com/Tencent/VasSonic/wiki 这里有官方的Android及IOS引入说明

(1)SDK引入

compile 'com.tencent.sonic:sdk:1.0.0'

(2) SonicRuntime 的实现

public class SonicRuntimeImpl extends SonicRuntime {
   
   

        public SonicRuntimeImpl(Context context) {
            super(context);
        }

        /**
         * 获取用户UA信息,这里的返回值会放在header的UserAgent中
         * @return
         */
        @Override
        public String getUserAgent() {
            return "";
        }

        /**
         * 获取用户ID信息,避免多个用户切换可能使用到相同的缓存
         * @return
         */
        @Override
        public String getCurrentUserAccount() {
            return "sonic-demo-master";
        }

        @Override
        public String getCookie(String url) {
            CookieManager cookieManager = CookieManager.getInstance();
            return cookieManager.getCookie(url);
        }

        @Override
        public void log(String tag, int level, String message) {
            switch (level) {
                case Log.ERROR:
                    Log.e(tag, message);
                    break;
                case Log.INFO:
                    Log.i(tag, message);
                    break;
                default:
                    Log.d(tag, message);
            }
        }

        @Override
        public Object createWebResourceResponse(String mimeType, String encoding, InputStream data, Map<String, String> headers) {
            WebResourceResponse resourceResponse =  new WebResourceResponse(mimeType, encoding, data);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                resourceResponse.setResponseHeaders(headers);
            }
            return resourceResponse;
        }

        @Override
        public void showToast(CharSequence text, int duration) {

        }

        @Override
        public void notifyError(SonicSessionClient client, String url, int errorCode) {

        }
        // 这里可以设置某个url是否为SonicUrl,如果指定为不是,则不会通过Sonic的方式加载url。
        @Override
        public boolean isSonicUrl(String url) {
            return true;
        }

        @Override
        public boolean setCookie(String url, List<String> cookies) {
            if (!TextUtils.isEmpty(url) && cookies != null && cookies.size() > 0) {
                CookieManager cookieManager = CookieManager.getInstance();
                for (String cookie : cookies) {
                    cookieManager.setCookie(url, cookie);
                }
                return true;
            }
            return false;
        }
        // 判断网络连接情况
        @Override
        public boolean isNetworkValid() {
            return true;
        }

        @Override
        public void postTaskToThread(Runnable task, long delayMillis) {
            Thread thread = new Thread(task, "SonicThread");
            thread.start();
        }

        @Override
        public File getSonicCacheDir() {
            if (BuildConfig.DEBUG) {
                String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "sonic/";
                File file = new File(path.trim());
                if(!file.exists()){
                    file.mkdir();
                }
                return file;
            }
           return super.getSonicCacheDir();
        }

        @Override
        public String getHostDirectAddress(String url) {
            return null;
        }
    }

(3)SonicSessionClient的实现

    public class SonicSessionClientImpl extends SonicSessionClient {
   
   

        private WebView webView;

        public void bindWebView(WebView webView) {
            this.webView = webView;
        }

        public WebView getWebView() {
            return webView;
        }

        @Override
        public void loadUrl(String url, Bundle extraData) {
            webView.loadUrl(url);
        }

        @Override
        public void loadDataWithBaseUrl(String baseUrl, String data, String mimeType, String encoding, String historyUrl) {
            webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
        }


        @Override
        public void loadDataWithBaseUrlAndHeader(String baseUrl, String data, String mimeType, String encoding, String historyUrl, HashMap<String, String> headers) {
            loadDataWithBaseUrl(baseUrl, data, mimeType, encoding, historyUrl);
        }

        public void destroy() {
            if (null != webView) {
                webView.destroy();
                webView = null;
            }
        }

    }

(4)SonicJavaScriptInterface的实现

这个类根据自己情况,如果用了jsbridge等库,则这个类不用实现。

(5)相关代码插入

首先是SonicEngine的初始化:

//这段代码可以放在Activity或者Application的onCreate方法中
if (!SonicEngine.isGetInstanceAllowed()) {
            SonicEngine.createInstance(new SonicRuntimeImpl(getApplication()), new SonicConfig.Builder().build());
        }

接着如果要进行预先的加载:

    SonicSessionConfig sessionConfig = new SonicSessionConfig.Builder().build();
    boolean preloadSuccess = SonicEngine.getInstance().preCreateSession(DEMO_URL, sessionConfig);

之后:


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值