类似于小程序这样的功能,腾讯尝试了很多方式来提高打开速度。包括冷热启动多进程、多线程并行、减冗余JS插件、预加载、webview复用、反射、素材校验、进程冗余启动流程、redex等,一步步走了一年多最终完善到sonic。根据 sonic 的测试对比,我们发现采用sonic的结构确实在打开H5首屏效率上提升了不少。本文将详细的讲解使用Android设备配合sonic开发的示例教程。
采用 VasSonic 我们首先需要做的是,下载 VasSonic 的SDK。
在您的模块的build.gradle中添加VasSonic gradle插件作为依赖。
compile 'com.tencent.sonic:sdk:1.0.0'
实现声音界面
实现一个扩展的类 SonicRuntime。
SonicRuntime是与系统中整体运行信息进行交互的类,包括Context,UA,ID(这是保存数据的唯一标识)和其他信息。
/** * 下面是SonicRuntime的样本子类 */ public class HostSonicRuntime extends SonicRuntime { public HostSonicRuntime(Context context) { super(context); } /** * @return 返回用户UA */ @Override public String getUserAgent() { return ""; } /** * @return 返回用户的ID。 */ @Override public String getCurrentUserAccount() { return ""; } /** * @return 返回用于保存Sonic缓存的文件路径。 */ @Override public File getSonicCacheDir() { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "sonic/"; File file = new File(path.trim()); if(!file.exists()){ file.mkdir(); } return file; } }
实现一个扩展的子类 SonicSessionClient。
/** * SonicSessionClient是一个精简的API类,将其公共API委托给后端WebView类实例,如loadUrl和loadDataWithBaseUrl。 */ public class SonicSessionClientImpl extends SonicSessionClient { private WebView webView; public void bindWebView(WebView webView) { this.webView = 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); } }
Android示例
这是一个简单的演示,演示如何创建一个使用VasSonic框架的Android活动。
public class BrowserActivity extends Activity { public final static String PARAM_URL = "param_url"; public final static String PARAM_MODE = "param_mode"; private SonicSession sonicSession; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); String url = intent.getStringExtra(PARAM_URL); int mode = intent.getIntExtra(PARAM_MODE, -1); if (TextUtils.isEmpty(url) || -1 == mode) { finish(); return; } getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); //步骤1:如有必要初始化声音引擎,或者也许当应用程序创建u能做到这一点 if (!SonicEngine.isGetInstanceAllowed()) { SonicEngine.createInstance(new SonicRuntimeImpl(getApplication()), new SonicConfig.Builder().build()); } SonicSessionClientImpl sonicSessionClient = null; //步骤2:创建SonicSession sonicSession = SonicEngine.getInstance().createSession(url, new SonicSessionConfig.Builder().build()); if (null != sonicSession) { sonicSession.bindClient(sonicSessionClient = new SonicSessionClientImpl()); } else { //只有在同一个声音会话已经运行时才会发生, //可以将以下代码注释为默认模式。 throw new UnknownError("create session fail!"); } //步骤3:BindWebView为sessionClient和bindClient为SonicSession //在现实世界中,init流可能花费很长的时间在启动 //运行时,初始化CONFIGS .... setContentView(R.layout.activity_browser); WebView webView = (WebView) findViewById(R.id.webview); webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (sonicSession != null) { sonicSession.getSessionClient().pageFinish(url); } } @TargetApi(21) @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return shouldInterceptRequest(view, request.getUrl().toString()); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (sonicSession != null) { //第6步:致电sessionClient.requestResource当主机允许应用程序 //返回本地数据。 return (WebResourceResponse) sonicSession.getSessionClient().requestResource(url); } return null; } }); WebSettings webSettings = webView.getSettings(); //步骤4:绑定javascript //注意:如果api级别低于17(android 4.2),addJavascriptInterface有安全性 //问题,请使用x5或参见https://developer.android.com/reference/android/webkit/ // WebView.html#addJavascriptInterface(java.lang.Object,java.lang.String) webSettings.setJavaScriptEnabled(true); webView.removeJavascriptInterface("searchBoxJavaBridge_"); intent.putExtra(SonicJavaScriptInterface.PARAM_LOAD_URL_TIME, System.currentTimeMillis()); webView.addJavascriptInterface(new SonicJavaScriptInterface(sonicSessionClient, intent), "sonic"); // init webview设置 webSettings.setAllowContentAccess(true); webSettings.setDatabaseEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheEnabled(true); webSettings.setSavePassword(false); webSettings.setSaveFormData(false); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true); //步骤5:webview已经准备就绪,只需告诉会话客户端绑定 if (sonicSessionClient != null) { sonicSessionClient.bindWebView(webView); sonicSessionClient.clientReady(); } else { //默认模式 webView.loadUrl(url); } } @Override public void onBackPressed() { super.onBackPressed(); } @Override protected void onDestroy() { if (null != sonicSession) { sonicSession.destroy(); sonicSession = null; } super.onDestroy(); } }
简简单单的几十行代码,搞定你的webview的加载速度。
: » Android使用Hybrid框架VasSonic教程
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/251648.html