You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ta...@apache.org on 2017/05/16 10:20:30 UTC
[03/51] [abbrv] [partial] incubator-weex-site git commit: Site
updated: 2017-05-16 18:20:09
http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/f3d58bd0/cn/v-0.10/advanced/how-data-binding-works.html
----------------------------------------------------------------------
diff --git a/cn/v-0.10/advanced/how-data-binding-works.html b/cn/v-0.10/advanced/how-data-binding-works.html
deleted file mode 100644
index af4179b..0000000
--- a/cn/v-0.10/advanced/how-data-binding-works.html
+++ /dev/null
@@ -1,397 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title>数据绑定原理 | Weex</title>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
- <meta name="description" content="数据绑定实现原理Weex 的 JS Framework 是一个 MVVM,即 Model-View-ViewModel 框架。他会自动监听数据的变化,并通过 {{字段名}} 的语法把数据和视图中所展示的内容自动绑定起来。当数据被改写的时候,视图会自动根据数据的变化而发生相应的变化。 比如下面这个例子,&lt;text&gt; 的内容被绑定在了 notes 数据字段上: &lt;template&g">
-<meta property="og:type" content="website">
-<meta property="og:title" content="数据绑定原理">
-<meta property="og:url" content="https://weex-project.io/cn/v-0.10/advanced/how-data-binding-works.html">
-<meta property="og:site_name" content="Weex">
-<meta property="og:description" content="数据绑定实现原理Weex 的 JS Framework 是一个 MVVM,即 Model-View-ViewModel 框架。他会自动监听数据的变化,并通过 {{字段名}} 的语法把数据和视图中所展示的内容自动绑定起来。当数据被改写的时候,视图会自动根据数据的变化而发生相应的变化。 比如下面这个例子,&lt;text&gt; 的内容被绑定在了 notes 数据字段上: &lt;template&g">
-<meta property="og:updated_time" content="2017-04-28T02:36:21.000Z">
-<meta name="twitter:card" content="summary">
-<meta name="twitter:title" content="数据绑定原理">
-<meta name="twitter:description" content="数据绑定实现原理Weex 的 JS Framework 是一个 MVVM,即 Model-View-ViewModel 框架。他会自动监听数据的变化,并通过 {{字段名}} 的语法把数据和视图中所展示的内容自动绑定起来。当数据被改写的时候,视图会自动根据数据的变化而发生相应的变化。 比如下面这个例子,&lt;text&gt; 的内容被绑定在了 notes 数据字段上: &lt;template&g">
-
- <link rel="alternate" href="/atom.xml" title="Weex" type="application/atom+xml">
-
-
- <link rel="icon" href="//gw.alicdn.com/tps/TB1XNqxPXXXXXcSXVXXXXXXXXXX-64-63.png">
-
-
- <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
-
- <link rel="stylesheet" href="/css/style.css">
- <link rel="stylesheet" href="/css/swiper.min.css">
-</head>
-
-<body id="advanced" class="lang-cn">
-
- <script>
- window.PAGE_TYPE = "advanced";
- window.ROOT = "/"
- </script>
- <header id="header">
- <div class="navbar">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <div class="main-nav">
- <ul class="links">
- <li><a href="/cn/guide">教程</a></li>
- <li><a href="/cn/references">手册</a></li>
- <li class="dropdown">
- <a href="javascript:;">参考</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/faq.html">FAQ</a>
- </li>
- <li>
- <a href="/cn/releasenote.html">版本说明</a>
- </li>
- </ul>
- </li>
- <li class="dropdown">
- <a href="javascript:;">工具和服务</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/toolkit.html">Weex-toolkit</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Code Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- </ul>
- <ul class="info">
- <li><a href="https://github.com/apache/incubator-weex/" target="_blank"><span class="btn-github iconfont icon-github"></span></a></li>
- </ul>
- <ul class="tools">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-header" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/how-data-binding-works.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/how-data-binding-works.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </li>
- <!--<li></li>-->
- </ul>
- </div>
- </div>
- <div id="mobile-nav">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <a class="btn-menu"><span class="iconfont icon-nav"></span></a>
- </div>
-</header>
-
- <div id="sidebar" class="">
- <div class="sidebar-menu">
-
- <ul class="main-nav">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-sidebar" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <a class="" href="/cn/guide">
- 教程
- </a>
- </li>
- <li>
- <a class="" href="/cn/references">
- 手册
- </a>
- </li>
- <li>
- <a href="/cn/faq.html">
- FAQ
- </a>
- </li>
- <li>
- <p>工具和服务</p>
- <ul class="subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/devtools.html">Devtools</a>
- </li>
- <li>
- <a href="/cn/guide/tools/weexpack.html">Weexpack</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- <li>
- <a href="https://github.com/apache/incubator-weex/" target="_blank">
- GitHub
- </a>
- </li>
- </ul>
-
- <a class="btn-close-sidebar iconfont icon-close"></a>
- </div>
-</div>
-
- <div class="article-wrapper page-layout">
- <div class="doc-nav">
-
-
-
-<div class="summary">
- <h2 class="part-title">
-
- 高阶知识
-
- </h2>
- <ul class="doc-summary">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/index.html" class="sidebar-link ">Weex 工作原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/how-data-binding-works.html" class="sidebar-link current ">数据绑定原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/create-a-weex-project.html" class="sidebar-link ">如何创建一个 Weex 项目</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-android.html" class="sidebar-link ">集成到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-ios.html" class="sidebar-link ">集成到 iOS</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-html5.html" class="sidebar-link ">集成到 web</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/customize-a-native-component.html" class="sidebar-link ">自定义 native 组件</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/cuszomize-native-apis.html" class="sidebar-link ">自定义 native API</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-android.html" class="sidebar-link ">Android 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-ios.html" class="sidebar-link ">iOS 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-html5.html" class="sidebar-link ">weex-html5 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-android.html" class="sidebar-link ">集成 Devtools 到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-ios.html" class="sidebar-link ">集成 Devtools 到 iOS</a></h3>
-
- </li>
-
-
-
- </ul>
-</div>
- </div>
-
-
-<article class="article article-type-advanced">
- <div class="article-entry" itemprop="articleBody">
- <header class="article-header">
-
-
- <h1 class="article-title" itemprop="name">
- 数据绑定原理
- </h1>
-
-
- <time class="article-date" datetime="2017-04-28T02:36:21.000Z">Updated time: 28/04/2017</time>
-</header>
- <h1 id="数据绑定实现原理"><a href="#数据绑定实现原理" class="headerlink" title="数据绑定实现原理"></a>数据绑定实现原理</h1><p>Weex 的 JS Framework 是一个 MVVM,即 Model-View-ViewModel 框架。他会自动监听数据的变化,并通过 <code>{{字段名}}</code> 的语法把数据和视图中所展示的内容自动绑定起来。当数据被改写的时候,视图会自动根据数据的变化而发生相应的变化。</p>
-<p>比如下面这个例子,<code><text></code> 的内容被绑定在了 <code>notes</code> 数据字段上:</p>
-<figure class="highlight html"><table><tr><td class="code"><pre><div class="line"><span class="tag"><<span class="name">template</span>></span></div><div class="line"> <span class="tag"><<span class="name">div</span>></span></div><div class="line"> <span class="tag"><<span class="name">text</span>></span>{{notes}}<span class="tag"></<span class="name">text</span>></span></div><div class="line"> <span class="tag"></<span class="name">div</span>></span></div><div class="line"><span class="tag"><<span class="name">template</span>></span></div><div class="line"></div><div class="line"><span class="tag"><<span class="name">script</span>></span><span class="javascript"></span></div><div class="line"> <span class="built_in">module</span>.exports = {</div><div class="line"> <span class="attr">data</span>: {</div><div class="line"> <span class="attr">notes</span>: <span class="string">'Hello'</span></div><d
iv class="line"> }</div><div class="line"> }</div><div class="line"><span class="tag"></<span class="name">script</span>></span></div></pre></td></tr></table></figure>
-<p>Weex 的 JS Framework 会首先对 <code>data</code> 里的数据进行监听,这样未来的数据变化都能够被监听到。然后我们会编译整个 <code><template></code> 标签里的内容。当我们找到 <code><text></code> 标签里的 <code>{{notes}}</code> 时,JS Framework 会跟踪 <code>data.notes</code> 的变化并在其发生变化时触发一个句柄,将 <code><text></code> 的内容设置为 <code>data.notes</code> 最新的值。这样的话开发者就不必手动关心数据和视图之间的数据同步问题了。</p>
-<p>在这个基础上我们还设计了一些特殊的语法:</p>
-<ul>
-<li><code><foo if="..."></code> 代表一个条件监听,当其值为 <code>true</code> 时,<code><foo></code> 元素将会被创建和载入,反之则不会被创建或被移除掉。</li>
-<li><code><foo repeat="..."></code> 代表一个列表监听,第一次加载的时候 <code><foo></code> 元素会被按照数组里的数据逐条 clone 并赋值。而当有列表项增加、移动或移除时,视图层也会自动触发相应的改变,并且智能优化至最小变更策略</li>
-<li><code><foo if="..." repeat="..."></code> 两个特殊语法共用时,将会优先展开 <code>repeat</code> 然后逐条判断 <code>if</code>。</li>
-</ul>
-<p>相比于一些 virtual-DOM 的 diff 计算机制,我们会直接对数据进行 diff,而且只会 diff 由于用户操作或数据操作发生改变的那部分数据和视图,这是一种更小范围的计算方式。尤其在追求轻量快速的移动端界面上,这种更新机制更加显得具有优势。</p>
-
- </div>
-
-</article>
-</div>
-
- <footer id="footer">
- <div class="row clearfix">
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/how-data-binding-works.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/how-data-binding-works.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </div>
- <div class="disclaimer">
- <div><img src="//gw.alicdn.com/tfs/TB1pTBZQFXXXXX9XXXXXXXXXXXX-794-280.png" width="200px" alt="Apache Incubator"></div>
- <div><span class="title">Disclaimer:</span> Apache Weex is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</div>
- <br/>
- </div>
- <hr>
- <div class="row">
- <p> <img src="//gw.alicdn.com/tfs/TB1bg8SQFXXXXcHXXXXXXXXXXXX-85-170.png" height="50px" alt="Apache"><span>Copyright(c) 2017 The Apache Software Foundation. Licensed under the </span> <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></p>
- </div>
- <div class="row clearfix">
- <div></div>
- </div>
-</footer>
- <div style="display: none;">
- <script src="//s95.cnzz.com/z_stat.php?id=1261496509&web_id=1261496509" language="JavaScript"></script>
-</div>
-
- <script src="/js/reqwest.js"></script>
- <script src="/js/common.js"></script>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/f3d58bd0/cn/v-0.10/advanced/images/how-arch.png
----------------------------------------------------------------------
diff --git a/cn/v-0.10/advanced/images/how-arch.png b/cn/v-0.10/advanced/images/how-arch.png
deleted file mode 100644
index a13df7a..0000000
Binary files a/cn/v-0.10/advanced/images/how-arch.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/f3d58bd0/cn/v-0.10/advanced/images/how-render.png
----------------------------------------------------------------------
diff --git a/cn/v-0.10/advanced/images/how-render.png b/cn/v-0.10/advanced/images/how-render.png
deleted file mode 100644
index db9b0f4..0000000
Binary files a/cn/v-0.10/advanced/images/how-render.png and /dev/null differ
http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/f3d58bd0/cn/v-0.10/advanced/index.html
----------------------------------------------------------------------
diff --git a/cn/v-0.10/advanced/index.html b/cn/v-0.10/advanced/index.html
deleted file mode 100644
index 28d57c6..0000000
--- a/cn/v-0.10/advanced/index.html
+++ /dev/null
@@ -1,436 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title>Weex 工作原理 | Weex</title>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
- <meta name="description" content="Weex 工作原理概述总览Weex是跨平台,可扩展的动态化技术. 你能通过在Weex源码中写&lt;template&gt;, &lt;style&gt; 和 &lt;script&gt;标签,然后把这些标签转换为JS Bundle用于部署, 在服务端以这些JS Bundle响应请求. 当客户端接收到JS Bundle时,它能用被客户端中的JS引擎用于管理Native渲染;API调用和用户交互.">
-<meta property="og:type" content="website">
-<meta property="og:title" content="Weex 工作原理">
-<meta property="og:url" content="https://weex-project.io/cn/v-0.10/advanced/index.html">
-<meta property="og:site_name" content="Weex">
-<meta property="og:description" content="Weex 工作原理概述总览Weex是跨平台,可扩展的动态化技术. 你能通过在Weex源码中写&lt;template&gt;, &lt;style&gt; 和 &lt;script&gt;标签,然后把这些标签转换为JS Bundle用于部署, 在服务端以这些JS Bundle响应请求. 当客户端接收到JS Bundle时,它能用被客户端中的JS引擎用于管理Native渲染;API调用和用户交互.">
-<meta property="og:image" content="http://gtms02.alicdn.com/tps/i2/TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png">
-<meta property="og:image" content="http://gtms03.alicdn.com/tps/i3/TB1_SA4MXXXXXXGaXXXpZ8UVXXX-519-337.png">
-<meta property="og:updated_time" content="2017-04-28T02:36:21.000Z">
-<meta name="twitter:card" content="summary">
-<meta name="twitter:title" content="Weex 工作原理">
-<meta name="twitter:description" content="Weex 工作原理概述总览Weex是跨平台,可扩展的动态化技术. 你能通过在Weex源码中写&lt;template&gt;, &lt;style&gt; 和 &lt;script&gt;标签,然后把这些标签转换为JS Bundle用于部署, 在服务端以这些JS Bundle响应请求. 当客户端接收到JS Bundle时,它能用被客户端中的JS引擎用于管理Native渲染;API调用和用户交互.">
-<meta name="twitter:image" content="http://gtms02.alicdn.com/tps/i2/TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png">
-
- <link rel="alternate" href="/atom.xml" title="Weex" type="application/atom+xml">
-
-
- <link rel="icon" href="//gw.alicdn.com/tps/TB1XNqxPXXXXXcSXVXXXXXXXXXX-64-63.png">
-
-
- <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
-
- <link rel="stylesheet" href="/css/style.css">
- <link rel="stylesheet" href="/css/swiper.min.css">
-</head>
-
-<body id="advanced" class="lang-cn">
-
- <script>
- window.PAGE_TYPE = "advanced";
- window.ROOT = "/"
- </script>
- <header id="header">
- <div class="navbar">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <div class="main-nav">
- <ul class="links">
- <li><a href="/cn/guide">教程</a></li>
- <li><a href="/cn/references">手册</a></li>
- <li class="dropdown">
- <a href="javascript:;">参考</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/faq.html">FAQ</a>
- </li>
- <li>
- <a href="/cn/releasenote.html">版本说明</a>
- </li>
- </ul>
- </li>
- <li class="dropdown">
- <a href="javascript:;">工具和服务</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/toolkit.html">Weex-toolkit</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Code Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- </ul>
- <ul class="info">
- <li><a href="https://github.com/apache/incubator-weex/" target="_blank"><span class="btn-github iconfont icon-github"></span></a></li>
- </ul>
- <ul class="tools">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-header" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/index.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/index.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </li>
- <!--<li></li>-->
- </ul>
- </div>
- </div>
- <div id="mobile-nav">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <a class="btn-menu"><span class="iconfont icon-nav"></span></a>
- </div>
-</header>
-
- <div id="sidebar" class="">
- <div class="sidebar-menu">
-
- <ul class="main-nav">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-sidebar" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <a class="" href="/cn/guide">
- 教程
- </a>
- </li>
- <li>
- <a class="" href="/cn/references">
- 手册
- </a>
- </li>
- <li>
- <a href="/cn/faq.html">
- FAQ
- </a>
- </li>
- <li>
- <p>工具和服务</p>
- <ul class="subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/devtools.html">Devtools</a>
- </li>
- <li>
- <a href="/cn/guide/tools/weexpack.html">Weexpack</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- <li>
- <a href="https://github.com/apache/incubator-weex/" target="_blank">
- GitHub
- </a>
- </li>
- </ul>
-
- <a class="btn-close-sidebar iconfont icon-close"></a>
- </div>
-</div>
-
- <div class="article-wrapper page-layout">
- <div class="doc-nav">
-
-
-
-<div class="summary">
- <h2 class="part-title">
-
- 高阶知识
-
- </h2>
- <ul class="doc-summary">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/index.html" class="sidebar-link current ">Weex 工作原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/how-data-binding-works.html" class="sidebar-link ">数据绑定原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/create-a-weex-project.html" class="sidebar-link ">如何创建一个 Weex 项目</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-android.html" class="sidebar-link ">集成到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-ios.html" class="sidebar-link ">集成到 iOS</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-html5.html" class="sidebar-link ">集成到 web</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/customize-a-native-component.html" class="sidebar-link ">自定义 native 组件</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/cuszomize-native-apis.html" class="sidebar-link ">自定义 native API</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-android.html" class="sidebar-link ">Android 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-ios.html" class="sidebar-link ">iOS 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-html5.html" class="sidebar-link ">weex-html5 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-android.html" class="sidebar-link ">集成 Devtools 到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-ios.html" class="sidebar-link ">集成 Devtools 到 iOS</a></h3>
-
- </li>
-
-
-
- </ul>
-</div>
- </div>
-
-
-<article class="article article-type-advanced">
- <div class="article-entry" itemprop="articleBody">
- <header class="article-header">
-
-
- <h1 class="article-title" itemprop="name">
- Weex 工作原理
- </h1>
-
-
- <time class="article-date" datetime="2017-04-28T02:36:21.000Z">Updated time: 28/04/2017</time>
-</header>
- <h1 id="Weex-工作原理概述"><a href="#Weex-工作原理概述" class="headerlink" title="Weex 工作原理概述"></a>Weex 工作原理概述</h1><h2 id="总览"><a href="#总览" class="headerlink" title="总览"></a>总览</h2><p>Weex是跨平台,可扩展的动态化技术. 你能通过在Weex源码中写<code><template></code>, <code><style></code> 和 <code><script></code>标签,然后把这些标签转换为JS Bundle用于部署, 在服务端以这些JS Bundle响应请求. 当客户端接收到JS Bundle时,它能用被客户端中的JS引擎用于管理Native渲染;API调用和用户交互.</p>
-<h3 id="工作流"><a href="#工作流" class="headerlink" title="工作流"></a>工作流</h3><figure class="highlight plain"><table><tr><td class="code"><pre><div class="line">Weex we 文件 --------------前端(we源码)</div><div class="line">↓ (转换) ------------------前端(构建过程)</div><div class="line">JS Bundle -----------------前端(JS Bundle代码)</div><div class="line">↓ (部署) ------------------服务器</div><div class="line">在服务器上的JS bundle ----服务器</div><div class="line">↓ (编译) ------------------ 客户端(JS引擎)</div><div class="line">虚拟 DOM 树 --------------- 客户端(Weex JS Framework)</div><div class="line">↓ (渲染) ------------------ 客户端(渲染引擎)</div><div class="line">Native视图 --------------- 客户端(渲染引擎)</div></pre></td></tr></table></figure>
-<p>在上面的工作流中,我们提到:</p>
-<ul>
-<li>Transformer(转换器): 一个Node JS工具, 转换Weex源码为JS Bundle </li>
-<li>Weex JS Framework(JS框架): 运行于客户端的的JS框架,管理着Weex实例的运行。Weex实例由JS Bundle创建并构建起虚拟DOM树. 另外,它发送/接受 Native 渲染层产生的系统调用,从而间接的响应用户交互。</li>
-<li>Native引擎: 在不同的端上,有着不同的实现: iOS/Android/HTML5. 他们有着共同的组件设计, 模块API 和渲染效果. 所以他们能配合同样的 JS Framework 和 JS Bundle工作。</li>
-</ul>
-<h2 id="转换器"><a href="#转换器" class="headerlink" title="转换器"></a>转换器</h2><p>转换器转换Weex源码为JS Bundle. 整体工作可以分为三个部分:</p>
-<ul>
-<li>转换 <code><template></code> 为类JSON的树状数据结构, 转换数据绑定为返回数据的函数原型.例如. For example: <code><foo a="{{x}}" b="1" /></code> 将转换为 <code>{type: "foo", attr: {a: function () {return this.x}, b: 1}}</code>.</li>
-<li>转换 <code><style></code> 为类JSON的树状数据结构. 例如: <code>.classname {name: value;}</code> 将转换为 <code>{classname: {name: value}}</code>.</li>
-<li>把上面两部分的内容和 <code><script></code> 中的内容结合. 上面的三个部分将结合成一个JavaScript AMD 模块.</li>
-</ul>
-<p>一个完整的例子:</p>
-<figure class="highlight html"><table><tr><td class="code"><pre><div class="line"><span class="tag"><<span class="name">template</span>></span></div><div class="line"> <span class="tag"><<span class="name">foo</span> <span class="attr">a</span>=<span class="string">"{{x}}"</span> <span class="attr">b</span>=<span class="string">"1"</span> <span class="attr">class</span>=<span class="string">"bar"</span>></span><span class="tag"></<span class="name">foo</span>></span></div><div class="line"><span class="tag"></<span class="name">template</span>></span></div><div class="line"><span class="tag"><<span class="name">style</span>></span><span class="css"></span></div><div class="line"> <span class="selector-class">.bar</span> {<span class="attribute">width</span>: <span class="number">200</span>; <span class="attribute">height</span>: <span class="number">200</span>}</div><div class="line"><span class="tag"></<span class="na
me">style</span>></span></div><div class="line"><span class="tag"><<span class="name">script</span>></span><span class="javascript"></span></div><div class="line"> <span class="built_in">module</span>.exports = {</div><div class="line"> <span class="attr">data</span>: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</div><div class="line"> <span class="keyword">return</span> {<span class="attr">x</span>: <span class="number">100</span>}</div><div class="line"> }</div><div class="line"> }</div><div class="line"><span class="tag"></<span class="name">script</span>></span></div></pre></td></tr></table></figure>
-<p>将转换为:</p>
-<figure class="highlight javascript"><table><tr><td class="code"><pre><div class="line">define(<span class="string">'@weex-component/main'</span>, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</div><div class="line"> <span class="built_in">module</span>.exports = {</div><div class="line"> <span class="attr">data</span>: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</div><div class="line"> <span class="keyword">return</span> {<span class="attr">x</span>: <span class="number">100</span>}</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="built_in">module</span>.template = {</div><div class="line"> <span class="attr">type</span>: <span class="string">"foo"</span>,</div><div class="line"> <span class="attr">attr</span>: {</div><div class="line"> <span class="attr">a</span>
: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{<span class="keyword">return</span> <span class="keyword">this</span>.x},</div><div class="line"> <span class="attr">b</span>: <span class="number">1</span>,</div><div class="line"> <span class="attr">classname</span>: [<span class="string">'bar'</span>]</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="built_in">module</span>.style = {</div><div class="line"> <span class="attr">bar</span>: {<span class="attr">width</span>: <span class="number">200</span>, <span class="attr">height</span>: <span class="number">200</span>}</div><div class="line"> }</div><div class="line">})</div><div class="line">bootstrap(<span class="string">'@weex-component/main'</span>)</div></pre></td></tr></table></figure>
-<p>除此之外,转换器还会做一些额外的事情: 合并Bundle ,添加引导函数,配置外部数据等等,更详细的,请参阅<a href="../references/specs/js-bundle-format.html">Synatax</a>章节.</p>
-<h2 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h2><p>当前大部分Weex工具最终输出的JS Bundle格式都经过了<a href="https://webpack.github.io/" target="_blank" rel="external">Webpack</a>的二次处理,所以你实际使用工具输出的JS Bundle会和上面的有所区别.</p>
-<h2 id="JS-Framework"><a href="#JS-Framework" class="headerlink" title="JS Framework"></a>JS Framework</h2><p>JS Framework 在初始化阶段被原生 JavaScript 引擎运行. 它提供被每个JS Bundle调用的 <code>define()</code> 和 <code>bootstrap()</code> 函数. 一旦JS Bundle从服务器下载后,这些函数就会执行. <code>define()</code> 函数以注册模块;<code>bootstrap()</code>会编译主要的模块为虚拟DOM,并发送渲染指令给Native .</p>
-<p>JS 和 Native 的沟通主要通过两个关键方法进行:</p>
-<ul>
-<li><code>callNative</code> 是一个由native代码实现的函数, 它被JS代码调用并向native发送指令,例如 <code>rendering</code>, <code>networking</code>, <code>authorizing</code>和其他客户端侧的 <code>toast</code> 等API.</li>
-<li><code>callJS</code> 是一个由JS实现的函数, 它用于Native向JS发送指令. 目前这些指令由用户交互和Native的回调函数组成.<h2 id="Native-渲染引擎"><a href="#Native-渲染引擎" class="headerlink" title="Native 渲染引擎"></a>Native 渲染引擎</h2></li>
-</ul>
-<p>Native 渲染引擎提供客户端组件和模块.</p>
-<p><strong>Component(组件)</strong> 在屏幕内可见,有特定行为. 能被配置不同的属性和样式,能响应用户交互. 常见的组件有: <code><div></code>, <code><text></code>, <code><image></code>.</p>
-<p><strong>Module(模块)</strong> 是一组能被JS Framework调用的API. 其中的一些能以异步的方式调用JS Framework, 例如: 发送HTTP请求.</p>
-<p>在Weex实例运行期间,Native渲染引擎将接收各种各样不同模块的API调用。这些调用创建或更新组件外观,运行如<code>toast</code>的Native API.当用户交互或模块回调时,<code>callJS()</code>会由JS Framework调用. 这样的循环往复将从Weex实例初始化到销毁一直持续. 如下面的架构图所示, HTML5渲染引擎提供和Native渲染引擎几乎一致的功能。 </p>
-<p><img src="http://gtms02.alicdn.com/tps/i2/TB1ootBMpXXXXXrXXXXwi60UVXX-596-397.png" alt="arch"></p>
-<p>Weex架构图</p>
-<h3 id="从Javascript中调用Native"><a href="#从Javascript中调用Native" class="headerlink" title="从Javascript中调用Native"></a>从Javascript中调用Native</h3><figure class="highlight plain"><table><tr><td class="code"><pre><div class="line">[JS Framework]</div><div class="line">↓ callNative</div><div class="line">模块 APIs</div><div class="line"> 渲染 -> 模块显示</div><div class="line"> 其他功能</div><div class="line">[Native 渲染引擎]</div></pre></td></tr></table></figure>
-<h3 id="从Native中调用Javascript"><a href="#从Native中调用Javascript" class="headerlink" title="从Native中调用Javascript"></a>从Native中调用Javascript</h3><figure class="highlight plain"><table><tr><td class="code"><pre><div class="line">[Native 渲染引擎]</div><div class="line">模块 APIs 回调</div><div class="line">用户交互</div><div class="line">↓ callJS</div><div class="line">[JS Framework]</div></pre></td></tr></table></figure>
-<h3 id="渲染流程"><a href="#渲染流程" class="headerlink" title="渲染流程"></a>渲染流程</h3><p><img src="http://gtms03.alicdn.com/tps/i3/TB1_SA4MXXXXXXGaXXXpZ8UVXXX-519-337.png" alt="render flow"> </p>
-<p>Weex 渲染流程</p>
-<ol>
-<li>虚拟DOM.</li>
-<li><strong>构造树结构</strong>. 分析虚拟DOM JSON数据以构造渲染树(RT).</li>
-<li><strong>添加样式</strong>. 为渲染树的各个节点添加样式.</li>
-<li><strong>创建视图</strong>. 为渲染树各个节点创建Native视图.</li>
-<li><strong>绑定事件</strong>. 为Native视图绑定事件.</li>
-<li><strong>CSS布局</strong>. 使用 <a href="https://github.com/facebook/css-layout" target="_blank" rel="external">css-layout</a> 来计算各个视图的布局.</li>
-<li><strong>更新视窗(Frame)</strong>. 采用上一步的计算结果来更新视窗中各个视图的最终布局位置.</li>
-<li>最终页面呈现.</li>
-</ol>
-<p>在Weex HTML5环境下 <code>CSS 布局</code> and <code>更新视窗</code> 由浏览器引擎(例如webkit)实现.</p>
-
- </div>
-
-</article>
-</div>
-
- <footer id="footer">
- <div class="row clearfix">
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/index.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/index.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </div>
- <div class="disclaimer">
- <div><img src="//gw.alicdn.com/tfs/TB1pTBZQFXXXXX9XXXXXXXXXXXX-794-280.png" width="200px" alt="Apache Incubator"></div>
- <div><span class="title">Disclaimer:</span> Apache Weex is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</div>
- <br/>
- </div>
- <hr>
- <div class="row">
- <p> <img src="//gw.alicdn.com/tfs/TB1bg8SQFXXXXcHXXXXXXXXXXXX-85-170.png" height="50px" alt="Apache"><span>Copyright(c) 2017 The Apache Software Foundation. Licensed under the </span> <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></p>
- </div>
- <div class="row clearfix">
- <div></div>
- </div>
-</footer>
- <div style="display: none;">
- <script src="//s95.cnzz.com/z_stat.php?id=1261496509&web_id=1261496509" language="JavaScript"></script>
-</div>
-
- <script src="/js/reqwest.js"></script>
- <script src="/js/common.js"></script>
-</body>
-</html>
http://git-wip-us.apache.org/repos/asf/incubator-weex-site/blob/f3d58bd0/cn/v-0.10/advanced/integrate-devtools-to-android.html
----------------------------------------------------------------------
diff --git a/cn/v-0.10/advanced/integrate-devtools-to-android.html b/cn/v-0.10/advanced/integrate-devtools-to-android.html
deleted file mode 100644
index 139d6e6..0000000
--- a/cn/v-0.10/advanced/integrate-devtools-to-android.html
+++ /dev/null
@@ -1,532 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <meta charset="utf-8">
-
- <title>集成 Devtools 到 Android | Weex</title>
- <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
- <meta name="description" content="集成 Devtools 到 AndroidWeex Devtools 能够方便调试 Weex 页面,但此功能离不开 Native 的支持。如何让你的 App 也集成 Devtools,在本章将会详细说明 Android 端如何接入 Weex Devtools。 Android 应用接入添加依赖可以通过 Gradle 或者 Maven 添加对 devtools aar 的依赖,也可以直接对源码依赖。">
-<meta property="og:type" content="website">
-<meta property="og:title" content="集成 Devtools 到 Android">
-<meta property="og:url" content="https://weex-project.io/cn/v-0.10/advanced/integrate-devtools-to-android.html">
-<meta property="og:site_name" content="Weex">
-<meta property="og:description" content="集成 Devtools 到 AndroidWeex Devtools 能够方便调试 Weex 页面,但此功能离不开 Native 的支持。如何让你的 App 也集成 Devtools,在本章将会详细说明 Android 端如何接入 Weex Devtools。 Android 应用接入添加依赖可以通过 Gradle 或者 Maven 添加对 devtools aar 的依赖,也可以直接对源码依赖。">
-<meta property="og:image" content="https://img.alicdn.com/tps/TB1aKy4NXXXXXacXVXXXXXXXXXX-1019-756.png">
-<meta property="og:image" content="https://img.alicdn.com/tps/TB13fwSKFXXXXXDaXXXXXXXXXXX-887-828.png">
-<meta property="og:image" content="https://img.alicdn.com/tps/TB1igLoMVXXXXawapXXXXXXXXXX-786-1610.jpg">
-<meta property="og:updated_time" content="2017-04-28T02:36:21.000Z">
-<meta name="twitter:card" content="summary">
-<meta name="twitter:title" content="集成 Devtools 到 Android">
-<meta name="twitter:description" content="集成 Devtools 到 AndroidWeex Devtools 能够方便调试 Weex 页面,但此功能离不开 Native 的支持。如何让你的 App 也集成 Devtools,在本章将会详细说明 Android 端如何接入 Weex Devtools。 Android 应用接入添加依赖可以通过 Gradle 或者 Maven 添加对 devtools aar 的依赖,也可以直接对源码依赖。">
-<meta name="twitter:image" content="https://img.alicdn.com/tps/TB1aKy4NXXXXXacXVXXXXXXXXXX-1019-756.png">
-
- <link rel="alternate" href="/atom.xml" title="Weex" type="application/atom+xml">
-
-
- <link rel="icon" href="//gw.alicdn.com/tps/TB1XNqxPXXXXXcSXVXXXXXXXXXX-64-63.png">
-
-
- <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
-
- <link rel="stylesheet" href="/css/style.css">
- <link rel="stylesheet" href="/css/swiper.min.css">
-</head>
-
-<body id="advanced" class="lang-cn">
-
- <script>
- window.PAGE_TYPE = "advanced";
- window.ROOT = "/"
- </script>
- <header id="header">
- <div class="navbar">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <div class="main-nav">
- <ul class="links">
- <li><a href="/cn/guide">教程</a></li>
- <li><a href="/cn/references">手册</a></li>
- <li class="dropdown">
- <a href="javascript:;">参考</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/faq.html">FAQ</a>
- </li>
- <li>
- <a href="/cn/releasenote.html">版本说明</a>
- </li>
- </ul>
- </li>
- <li class="dropdown">
- <a href="javascript:;">工具和服务</a>
- <ul class="dropdown-menu subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/toolkit.html">Weex-toolkit</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Code Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- </ul>
- <ul class="info">
- <li><a href="https://github.com/apache/incubator-weex/" target="_blank"><span class="btn-github iconfont icon-github"></span></a></li>
- </ul>
- <ul class="tools">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-header" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/integrate-devtools-to-android.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/integrate-devtools-to-android.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </li>
- <!--<li></li>-->
- </ul>
- </div>
- </div>
- <div id="mobile-nav">
- <a id="logo" href="/cn/">
- <img src="//img.alicdn.com/tps/TB1zBLaPXXXXXXeXXXXXXXXXXXX-121-59.svg" />
- </a>
- <a class="btn-menu"><span class="iconfont icon-nav"></span></a>
- </div>
-</header>
-
- <div id="sidebar" class="">
- <div class="sidebar-menu">
-
- <ul class="main-nav">
- <li>
- <div class="search">
- <form id="search-form" class="search-form"> <!-- 搜索框相关 -->
- <input type="text" id="search-input-sidebar" name="q" results="0" class="form-control search-input" autocomplete="off" autocorrect="off"/>
- <span class="iconfont icon-search"></span>
- </form>
- <div class="results-panel">
- </div>
-</div>
- </li>
- <li>
- <a class="" href="/cn/guide">
- 教程
- </a>
- </li>
- <li>
- <a class="" href="/cn/references">
- 手册
- </a>
- </li>
- <li>
- <a href="/cn/faq.html">
- FAQ
- </a>
- </li>
- <li>
- <p>工具和服务</p>
- <ul class="subnav">
- <li>
- <a href="/cn/playground.html">Playground</a>
- </li>
- <li>
- <a href="/cn/guide/tools/devtools.html">Devtools</a>
- </li>
- <li>
- <a href="/cn/guide/tools/weexpack.html">Weexpack</a>
- </li>
- <li>
- <a href="http://dotwe.org" target="_blank">Snippets</a>
- </li>
- <li>
- <a href="https://market.dotwe.org" target="_blank">Market</a>
- </li>
- </ul>
- </li>
- <li>
- <a href="https://github.com/apache/incubator-weex/" target="_blank">
- GitHub
- </a>
- </li>
- </ul>
-
- <a class="btn-close-sidebar iconfont icon-close"></a>
- </div>
-</div>
-
- <div class="article-wrapper page-layout">
- <div class="doc-nav">
-
-
-
-<div class="summary">
- <h2 class="part-title">
-
- 高阶知识
-
- </h2>
- <ul class="doc-summary">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/index.html" class="sidebar-link ">Weex 工作原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/how-data-binding-works.html" class="sidebar-link ">数据绑定原理</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/create-a-weex-project.html" class="sidebar-link ">如何创建一个 Weex 项目</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-android.html" class="sidebar-link ">集成到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-ios.html" class="sidebar-link ">集成到 iOS</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-to-html5.html" class="sidebar-link ">集成到 web</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/customize-a-native-component.html" class="sidebar-link ">自定义 native 组件</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/cuszomize-native-apis.html" class="sidebar-link ">自定义 native API</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-android.html" class="sidebar-link ">Android 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-ios.html" class="sidebar-link ">iOS 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/extend-to-html5.html" class="sidebar-link ">weex-html5 扩展</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-android.html" class="sidebar-link current ">集成 Devtools 到 Android</a></h3>
-
- </li>
-
- <li>
- <h3 class="chapter-title"><a href="/cn/v-0.10/advanced/integrate-devtools-to-ios.html" class="sidebar-link ">集成 Devtools 到 iOS</a></h3>
-
- </li>
-
-
-
- </ul>
-</div>
- </div>
-
-
-<article class="article article-type-advanced">
- <div class="article-entry" itemprop="articleBody">
- <header class="article-header">
-
-
- <h1 class="article-title" itemprop="name">
- 集成 Devtools 到 Android
- </h1>
-
-
- <time class="article-date" datetime="2017-04-28T02:36:21.000Z">Updated time: 28/04/2017</time>
-</header>
- <h1 id="集成-Devtools-到-Android"><a href="#集成-Devtools-到-Android" class="headerlink" title="集成 Devtools 到 Android"></a>集成 Devtools 到 Android</h1><p>Weex Devtools 能够方便调试 Weex 页面,但此功能离不开 Native 的支持。如何让你的 App 也集成 Devtools,在本章将会详细说明 Android 端如何接入 Weex Devtools。</p>
-<h2 id="Android-应用接入"><a href="#Android-应用接入" class="headerlink" title="Android 应用接入"></a>Android 应用接入</h2><h3 id="添加依赖"><a href="#添加依赖" class="headerlink" title="添加依赖"></a>添加依赖</h3><p>可以通过 Gradle 或者 Maven 添加对 devtools aar 的依赖,也可以直接对源码依赖。强烈建议使用最新版本,因为 Weex SDK 和 devtools 都在快速的迭代开发中,新版本会有更多惊喜,同时也修复老版本中一些问题。最新的 release 版本可在<a href="https://github.com/weexteam/weex_devtools_android/releases" target="_blank" rel="external">这里</a>查看。所有的 release 版本都会发布到 <a href="https://bintray.com/alibabaweex/maven/weex_inspector" target="_blank" rel="external">jcenter repo</a>。</p>
-<ul>
-<li><p><em>Gradle 依赖</em></p>
-<figure class="highlight gradle"><table><tr><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.taobao.android:weex_inspector:0.8.0.0'</span></div><div class="line">}</div></pre></td></tr></table></figure>
-</li>
-<li><p><em>Maven依赖</em></p>
-<figure class="highlight xml"><table><tr><td class="code"><pre><div class="line"><span class="tag"><<span class="name">dependency</span>></span></div><div class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.taobao.android<span class="tag"></<span class="name">groupId</span>></span></div><div class="line"> <span class="tag"><<span class="name">artifactId</span>></span>weex_inspector<span class="tag"></<span class="name">artifactId</span>></span></div><div class="line"> <span class="tag"><<span class="name">version</span>></span>0.8.0.0<span class="tag"></<span class="name">version</span>></span></div><div class="line"> <span class="tag"><<span class="name">type</span>></span>pom<span class="tag"></<span class="name">type</span>></span></div><div class="line"><span class="tag"></<span class="name">dependency</span>></span></div></pre></td></tr></table></figure>
-</li>
-<li><p><em>源码依赖</em></p>
-<p>需要复制 <a href="https://github.com/weexteam/weex_devtools_android/tree/master/inspector" target="_blank" rel="external">inspector</a> 目录到你的 App 的同级目录,然后在工程的 <code>settings.gradle</code> 文件下添加 <code>include ":inspector"</code>,此过程可以参考 playground 源码的工程配置及其配置,然后在 App 的 <code>build.gralde</code> 中添加依赖。</p>
-<figure class="highlight gradle"><table><tr><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> <span class="keyword">compile</span> <span class="keyword">project</span>(<span class="string">':inspector'</span>)</div><div class="line">}</div></pre></td></tr></table></figure>
-<p>另外 weex_inspector 中有一部分包是以 provided 的方式引入,接入方需要自行解决依赖和版本冲突。</p>
-<ul>
-<li><p><strong>provided方式引用的包</strong></p>
-<figure class="highlight gradle"><table><tr><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> provided <span class="string">'com.google.code.findbugs:jsr305:2.0.1'</span></div><div class="line"> provided <span class="string">'com.android.support:appcompat-v7:23.1.1'</span></div><div class="line"> provided <span class="string">'com.taobao.android:weex_sdk:0.8.0'</span></div><div class="line"> provided <span class="string">'com.alibaba:fastjson:1.1.45+'</span></div><div class="line"> ...</div><div class="line">}</div></pre></td></tr></table></figure>
-</li>
-</ul>
-</li>
-</ul>
-<ul>
-<li><p><strong>反射引用的包(0.8.0.0以上版本)</strong></p>
-<figure class="highlight gradle"><table><tr><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.squareup.okhttp:okhttp:2.3.0'</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.squareup.okhttp:okhttp-ws:2.3.0'</span></div><div class="line"> ...</div><div class="line">}</div></pre></td></tr></table></figure>
-</li>
-</ul>
-<pre><code>或者
-
-<figure class="highlight gradle"><table><tr><td class="code"><pre><div class="line"><span class="keyword">dependencies</span> {</div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.squareup.okhttp:okhttp:3.4.1'</span></div><div class="line"> <span class="keyword">compile</span> <span class="string">'com.squareup.okhttp:okhttp-ws:3.4.1'</span></div><div class="line"> ...</div><div class="line">}</div></pre></td></tr></table></figure>
-</code></pre><h4 id="版本兼容"><a href="#版本兼容" class="headerlink" title="版本兼容"></a>版本兼容</h4><table>
-<thead>
-<tr>
-<th>weex sdk</th>
-<th>weex inspector</th>
-<th>Debugger Server</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>0.8.0.1+</td>
-<td>0.0.8.1+</td>
-<td>0.2.39+</td>
-</tr>
-<tr>
-<td>0.7.0+</td>
-<td>0.0.7.13</td>
-<td>0.2.38</td>
-</tr>
-<tr>
-<td>0.6.0+</td>
-<td>0.0.2.2</td>
-<td>-</td>
-</tr>
-</tbody>
-</table>
-<h3 id="添加-Debug-模式开关"><a href="#添加-Debug-模式开关" class="headerlink" title="添加 Debug 模式开关"></a>添加 Debug 模式开关</h3><p>控制调试模式的打开和关闭的关键点可以概括为三条规则。</p>
-<p><strong>规则一:通过 <code>sRemoteDebugMode</code> 和 <code>sRemoteDebugProxyUrl</code> 和来设置开关和 Debugger Server 地址。</strong></p>
-<p>Weex SDK 的 <code>WXEnvironment</code> 类里有一对静态变量标记了 Weex 当前的调试模式是否开启分别是:</p>
-<figure class="highlight java"><table><tr><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> sRemoteDebugMode; <span class="comment">// 是否开启 debug 模式,默认关闭</span></div><div class="line"><span class="keyword">public</span> <span class="keyword">static</span> String sRemoteDebugProxyUrl; <span class="comment">// DebugServer的websocket地址</span></div></pre></td></tr></table></figure>
-<p>无论在 App 中无论以何种方式设置 Debug 模式,都必须在恰当的时机调用类似如下的方法来设置 <code>WXEnvironment.sRemoteDebugMode</code> 和 <code>WXEnvironment.sRemoteDebugProxyUrl</code>。</p>
-<figure class="highlight java"><table><tr><td class="code"><pre><div class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">initDebugEnvironment</span><span class="params">(<span class="keyword">boolean</span> enable, String host)</span> </span>{</div><div class="line"> WXEnvironment.sRemoteDebugMode = enable;</div><div class="line"> WXEnvironment.sRemoteDebugProxyUrl = <span class="string">"ws://"</span> + host + <span class="string">":8088/debugProxy/native"</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
-<p><strong>规则二:修改 <code>sRemoteDebugMode</code> 后一定要调用<code>`WXSDKEngine.reload()</code>。</strong></p>
-<p>一般來說,在修改了 <code>WXEnvironment.sRemoteDebugMode</code> 以后调用了 <code>WXSDKEngine.reload()</code> 方法才能够使 Debug模式生效。<code>WXSDKEngine.reload()</code> 用来重置 Weex 的运行环境上下文,在切换调试模式时需要调用此方法来创建新的 Weex 运行时和 DebugBridge 并将所有的 JS 调用桥接到调试服务器执行。在 reload 过程中会调用 launchInspector,这就是 SDK 控制 Debug 模式最核心一个方法,其传入参数即为 <code>sRemoteDebugMode</code>,若为 <code>true</code> 则该方法中尝试以反射的方式获取 DebugBridge 用来在远端执行 JS,否则在本地运行。</p>
-<figure class="highlight java"><table><tr><td class="code"><pre><div class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">launchInspector</span><span class="params">(<span class="keyword">boolean</span> remoteDebug)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (WXEnvironment.isApkDebugable()) {</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> <span class="keyword">if</span> (mWxDebugProxy != <span class="keyword">null</span>) {</div><div class="line"> mWxDebugProxy.stop();</div><div class="line"> }</div><div class="line"> HackedClass<Object> debugProxyClass = WXHack.into(<span class="string">"com.taobao.weex.devtools.debug.DebugServerProxy"</span>);</div><div class="line"> mWxDebugProxy = (IWXDebugProxy) debugProxyClass.constructor(Context.class, WXBridgeManager.class)</div><div class="lin
e"> .getInstance(WXEnvironment.getApplication(), WXBridgeManager.<span class="keyword">this</span>);</div><div class="line"> <span class="keyword">if</span> (mWxDebugProxy != <span class="keyword">null</span>) {</div><div class="line"> mWxDebugProxy.start();</div><div class="line"> <span class="keyword">if</span> (remoteDebug) {</div><div class="line"> mWXBridge = mWxDebugProxy.getWXBridge();</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> <span class="keyword">if</span> (mWXBridge != <span class="keyword">null</span> && !(mWXBridge <span class="keyword">instanceof</span> WXBridge)) {</div><div class="line"> mWXBridge = <span class="keyword">null</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> } <span class="keyword">catch</span> (HackAsserti
onException e) {</div><div class="line"> WXLogUtils.e(<span class="string">"launchInspector HackAssertionException "</span>, e);</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
-<p>只要遵循上面的原理,开启 Debug 模式的方式和时机可由接入方灵活实现。从 launchInspector 可以看到,SDK 对 devtools 的 aar 包并无强依赖,我们的 App 只需要在 Debug 包中打包该 aar 即可,这样多少可以缓解包大小问题和安全问题。</p>
-<p><strong>例外:</strong> <em>若修改 <code>WXEnvironment.sRemoteDebugMode</code> 的时机在 <code>WXBridgeManager</code> 初始化和 restart 和之前则 <code>WXSDKEngine.reload()</code> 可忽略.</em></p>
-<p><strong>规则三:通过响应 <code>ACTION_DEBUG_INSTANCE_REFRESH</code> 广播及时刷新。</strong></p>
-<p>广播 <code>ACTION_DEBUG_INSTANCE_REFRESH</code> 在调试模式切换和 Chrome 调试页面刷新时发出,主要用来通知当前的 Weex容器以 Debug 模式重新加载当前页。在 playground 中的处理过程如下:</p>
-<figure class="highlight java"><table><tr><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">RefreshBroadcastReceiver</span> <span class="keyword">extends</span> <span class="title">BroadcastReceiver</span> </span>{</div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onReceive</span><span class="params">(Context context, Intent intent)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (IWXDebugProxy.ACTION_DEBUG_INSTANCE_REFRESH.equals(intent.getAction())) {</div><div class="line"> <span class="keyword">if</span> (mUri != <span class="keyword">null</span>) {</div><div class="line"> <span class="keyword">if</span> (TextUtils.equals(mUri.getScheme(), <span class="string">"http"</span>)
|| TextUtils.equals(mUri.getScheme(), <span class="string">"https"</span>)) {</div><div class="line"> loadWXfromService(mUri.toString());</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> loadWXfromLocal(<span class="keyword">true</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
-<p>如果接入方的容器未对该广播做处理,那么将不支持刷新和调试过程中编辑代码时的 watch 功能。</p>
-<h2 id="接入示例"><a href="#接入示例" class="headerlink" title="接入示例"></a>接入示例</h2><p>最简单方式就是复用 Playground 的相关代码,比如扫码和刷新等模块,但是扫码不是必须的,它只是与 App 通信的一种形式,二维码里的包含DebugServer IP 及 bundle 地址等信息,用于建立 App 和 Debugger Server 之间的连接及动态加载 bundle。在 Playground 中给出了两种开启 debug 模式的范例。</p>
-<ul>
-<li>范例1:通过在 <code>XXXApplication</code> 中设置开关打开调试模式</li>
-</ul>
-<figure class="highlight java"><table><tr><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyApplication</span> <span class="keyword">extends</span> <span class="title">Application</span> </span>{</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onCreate();</div><div class="line"> initDebugEnvironment(<span class="keyword">true</span>, <span class="string">"xxx.xxx.xxx.xxx"</span><span class="comment">/*"DEBUG_SERVER_HOST"*/</span>);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
-<p>这种方式最直接,在代码中直接 hardcode 了开启调试模式,如果在 SDK 初始化之前调用甚至连 <code>WXSDKEngine.reload()</code> 都不需要调用,接入方如果需要更灵活的策略可以将 <code>initDebugEnvironment(boolean enable, String host)</code> 和 <code>WXSDKEngine.reload()</code> 组合在一起在合适的位置和时机调用即可。</p>
-<ul>
-<li>范例2:通过扫码打开调试模式</li>
-</ul>
-<p>Playground 中较多的使用扫码的方式传递信息,不仅用这种方式控制 Debug 模式的开关,而且还通过它来传入 bundle 的 url 直接调试。应当说在开发中这种方式是比较高效的,省去了修改 SDK 代码重复编译和安装 App 的麻烦,缺点就是调试工具这种方式接入需要 App 具有扫码和处理特定规则二维码的能力。除了 Playground 中的方式,接入方亦可根据业务场景对 Debugger 和接入方式进行二次开发。</p>
-<p>Playground 集成的具体代码可参考如下两个文件:</p>
-<ul>
-<li><p>开关控制,主要参考对二维码的处理部分,详见 <a href="https://github.com/weexteam/weex_devtools_android/blob/master/playground/app/src/main/java/com/alibaba/weex/WXApplication.java" target="_blank" rel="external"><code>WXApplication.java</code></a></p>
-</li>
-<li><p>刷新控制 ,主要参考是对容器 <code>ACTION_DEBUG_INSTANCE_REFRESH</code>的处理,详见 <a href="https://github.com/weexteam/weex_devtools_android/blob/master/playground/app/src/main/java/com/alibaba/weex/WXPageActivity.java" target="_blank" rel="external"><code>WXPageActivity.java</code></a></p>
-</li>
-</ul>
-<h2 id="牛刀小试"><a href="#牛刀小试" class="headerlink" title="牛刀小试"></a>牛刀小试</h2><h3 id="前置工作"><a href="#前置工作" class="headerlink" title="前置工作"></a>前置工作</h3><p>如果未安装 Debugger Server,在命令行执行 <code>npm install -g weex-toolkit</code> 既可以安装调试服务器,运行命令 <code>weex debug</code> 就会启动 DebugServer 并打开一个调试页面(详情请查看 <a href="/develop-on-your-local-machine.md">本地开发</a>)。页面下方会展示一个二维码,这个二维码用于向 App 传递 Server 端的地址建立连接。</p>
-<p><img src="https://img.alicdn.com/tps/TB1aKy4NXXXXXacXVXXXXXXXXXX-1019-756.png" alt="_"></p>
-<h3 id="开始调试"><a href="#开始调试" class="headerlink" title="开始调试"></a>开始调试</h3><p>如果你的 App 客户端完成了以上步骤那么恭喜你已经接入完毕,可以愉快的调试 Weex bundle 了,调试体验和网页调试一致!建议新手首先用官方的 Playground 体验一下调试流程。只需要启动 App 扫描 Chrome 调试页面下方的第一个二维码即可建立与 Debugger Server 的通信,Chorome 的调试页面将会列出连接成功的设备信息。</p>
-<p><img src="https://img.alicdn.com/tps/TB13fwSKFXXXXXDaXXXXXXXXXXX-887-828.png" alt="devtools-main"></p>
-<h4 id="主要步骤如下"><a href="#主要步骤如下" class="headerlink" title="主要步骤如下"></a>主要步骤如下</h4><ol>
-<li>如果你要加载服务器上 bundle,第一步就是要让你的 bundle sever 跑起来. 在 Playground 中特别简单,只需要你到 Weex 源码目录下,运行 <code>./start</code> 即可。</li>
-<li>命令行运行 <code>weex debug</code> 启动 Debugger Server,Chrome 将会打开一个网页,在网页下方有一个二维码和简单的介绍。</li>
-<li>启动 App 并确认打开调试模式。你将在上一步中打开的网页中看到一个设备列表,每个设备项都有两个按钮,分别是 <code>Debugger</code> 和 <code>Inspector</code>。</li>
-<li>点击 <code>Inspector</code> Chrome 将创建 Inspector 网页;点击 <code>Debugger</code> Chrome 将创建 Debugger 网页;二者是相互独立的功能,不相互依赖。</li>
-</ol>
-<hr>
-<h2 id="背景知识"><a href="#背景知识" class="headerlink" title="背景知识"></a>背景知识</h2><h3 id="Devtools-组件介绍"><a href="#Devtools-组件介绍" class="headerlink" title="Devtools 组件介绍"></a>Devtools 组件介绍</h3><p>Devtools 扩展了 <a href="https://developer.chrome.com/devtools/docs/debugger-protocol" target="_blank" rel="external">Chrome Debugging Protocol</a>,在客户端和调试服务器之间的采用 <a href="https://en.wikipedia.org/wiki/JSON-RPC" target="_blank" rel="external">JSON-RPC</a> 作为通信机制,本质上调试过程是两个进程间协同,相互交换控制权及运行结果的过程。更多细节还请阅读 <a href="http://www.atatech.org/articles/59284" target="_blank" rel="external">Weex Devtools Debugger 的技术选型实录</a>这篇文章。</p>
-<ul>
-<li><p><strong>客户端</strong></p>
-<p>Devtools 客户端作为 aar 被集成 App 中,它通过 webscoket 连接到调试服务器,此处并未做安全检查。出于安全机制及包大小考虑,强烈建议接入方只在 debug 版本中打包此 aar。</p>
-</li>
-<li><p><strong>服务器</strong></p>
-<p>Devtools 服务器端是信息交换的中枢,既连接客户端,又连接 Chrome,大多数情况下扮演一个消息转发服务器和 Runtime Manager 的角色。</p>
-</li>
-<li><p><strong>Web端</strong></p>
-<p>Chrome 的 V8 引擎扮演着 Bundle javascript runtime 的角色。开启 debug 模式后,所有的 bundle js 代码都在该引擎上运行。另一方面我们也复用了 Chrome 前端的调试界面,例如设置断点,查看调用栈等,调试页关闭则 runtime 将会被清理。</p>
-</li>
-</ul>
-<p>调试的大致过程请参考如下时序图。</p>
-<p><img src="https://img.alicdn.com/tps/TB1igLoMVXXXXawapXXXXXXXXXX-786-1610.jpg" alt="debug sequence diagram" title="debug sequence diagram"></p>
-<h2 id="FAQ"><a href="#FAQ" class="headerlink" title="FAQ"></a>FAQ</h2><p>在各业务接入过程中,陆续发现一些问题,对高频次的问题解答如下,开发中以 weex debug -V 的方式启动 Debugger Server 可以看到 server 端的 log 信息,对照上文中的时序图对于定位问题还是非常有帮助,建议调试中默认开启 server 端 log。</p>
-<ol>
-<li><p><strong>扫码 App 在 DebugServerProxy 中抛出 class not found</strong></p>
-<p>已知的原因如下:</p>
-<ul>
-<li>weex_inspector 以 provided 方式引用的包是否引入成功,如 fastjson 等。</li>
-<li>weex_inspector 以 compile 方式引用的包是否引入成功,某些 app 重新引入 <code>com.squareup.okhttp:okhttp:2.3.0</code> 和 <code>com.squareup.okhttp:okhttp-ws:2.3.0</code> 则不再报错。</li>
-<li>混淆规则影响反射。</li>
-</ul>
-</li>
-<li><p><strong>playground 扫码调试 crash</strong></p>
-<p>已知的原因如下:</p>
-<ul>
-<li>系统为 android 6+,崩溃信息提示进程需要 <code>android.permission.READ_PHONE_STATE</code> 权限,代码中未做权限检查,在 0.0.2.7 版本以后已修复,不再需要此权限。</li>
-</ul>
-</li>
-<li><p><strong>扫码后设备列表页并没有出现我的设备信息</strong></p>
-<p>已知的原因如下:</p>
-<ul>
-<li>Debugger Server 和手机在不同网段,被防火墙隔离。</li>
-<li>手机连接了 PC 端的代理,当前尚不支持。</li>
-<li>多进程连接服务器端的同一端口,比如在 Application 的 <code>onCreate</code> 中初始化 sdk,若多个进程连接服务器端的同一端口则报错,在 0.0.2.3 版本以后已支持多进程无此问题。</li>
-</ul>
-</li>
-<li><p><strong>调试过程中频繁刷新连接失败,Server 端提示重新启动 App,非必现</strong></p>
-<p>已知的原因如下:</p>
-<ul>
-<li>多线程操作网络连接引起,在频繁的即断即连时容易触发。在 0.0.7.1 版本已修复。</li>
-</ul>
-</li>
-</ol>
-
- </div>
-
-</article>
-</div>
-
- <footer id="footer">
- <div class="row clearfix">
- <div class="dropdown select-lang">
- <a href="javascript:;" class="dropdown-toggle">
- Language
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu pick-lang">
- <li>
- <a href="/v-0.10/advanced/integrate-devtools-to-android.html" data-lang="en">English</a>
- </li>
- <li>
- <a href="/cn/v-0.10/advanced/integrate-devtools-to-android.html" data-lang="zh-cn">中文</a>
- </li>
- </ul>
- </div>
- </div>
- <div class="disclaimer">
- <div><img src="//gw.alicdn.com/tfs/TB1pTBZQFXXXXX9XXXXXXXXXXXX-794-280.png" width="200px" alt="Apache Incubator"></div>
- <div><span class="title">Disclaimer:</span> Apache Weex is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</div>
- <br/>
- </div>
- <hr>
- <div class="row">
- <p> <img src="//gw.alicdn.com/tfs/TB1bg8SQFXXXXcHXXXXXXXXXXXX-85-170.png" height="50px" alt="Apache"><span>Copyright(c) 2017 The Apache Software Foundation. Licensed under the </span> <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a></p>
- </div>
- <div class="row clearfix">
- <div></div>
- </div>
-</footer>
- <div style="display: none;">
- <script src="//s95.cnzz.com/z_stat.php?id=1261496509&web_id=1261496509" language="JavaScript"></script>
-</div>
-
- <script src="/js/reqwest.js"></script>
- <script src="/js/common.js"></script>
-</body>
-</html>