<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ernest的Blog</title><description>一个有理想的Android程序员</description><link>https://ernest-su.github.io/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.13.6</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年7月9日 01:01:28</lastBuildDate><item><title>使用Github Actions  完成编译、发布release apk</title><link>https://ernest-su.github.io/%E4%BD%BF%E7%94%A8github-actions%E5%AE%8C%E6%88%90%E7%BC%96%E8%AF%91%E5%8F%91%E5%B8%83release-apk/</link><guid isPermaLink="true">https://ernest-su.github.io/%E4%BD%BF%E7%94%A8github-actions%E5%AE%8C%E6%88%90%E7%BC%96%E8%AF%91%E5%8F%91%E5%B8%83release-apk/</guid><description>使用Github Actions，我们可以编译，运行测试，还可以签署发布工件 。 但是，如果我们将密钥库上载到公共存储库，这很危险。作为开发人员，我们必须采取一些预防措施，例如不要提交API密钥或密钥库（使用Github Actions作为CI并不是这样做的借口。）</description><pubDate>Mon, 25 Apr 2022 09:30:55 GMT</pubDate><content:encoded>&lt;p&gt;使用&lt;em&gt;Github Actions，&lt;em&gt;我们可以编译，运行测试，还可以&lt;strong&gt;签署发布工件&lt;/strong&gt; 。 &lt;strong&gt;但是&lt;/strong&gt;，如果我们将密钥库上载到公共存储库，这很&lt;/em&gt;&lt;strong&gt;危险&lt;/strong&gt;。作为开发人员，我们必须采取一些预防措施，例如&lt;strong&gt;不要提交API密钥或密钥库&lt;/strong&gt;&lt;/em&gt;（使用&lt;em&gt;Github Actions&lt;/em&gt;作为CI并不是这样做的借口。）&lt;/p&gt;
&lt;p&gt;那我们怎样才能在仓库中使用github actions 完成编译签署发布工作，同时又保证密钥和密钥口令的安全性呢？&lt;/p&gt;
&lt;p&gt;跟着以下步骤，你应该就能明白了。&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;创建签名环境&lt;a href=&quot;#创建签名环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;创建签名环境，主要实现两个目标，一是保护签名文件不被泄露，公共存储库是所有人可读的。二是保证签名文件的密钥密码等信息不被泄露，包括在执行编译、发布apk整个过程的安全。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;创建存储签名文件的私有仓库&lt;a href=&quot;#创建存储签名文件的私有仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;首先，我们在github上创建一个&lt;strong&gt;私有&lt;/strong&gt;仓库，为简单起见，我们将其称为&lt;code&gt; keystore&lt;/code&gt;。得到的仓库地址是&lt;code&gt;git@github.com:Ernest-su/keystore.git&lt;/code&gt;&lt;/p&gt;&lt;p&gt;然后，把仓库clone到本地。&lt;code&gt;git clone git@github.com:Ernest-su/keystore.git&lt;/code&gt;&lt;/p&gt;&lt;p&gt;将签名文件放到keystore内.例如，我的签名文件名称是&lt;code&gt;keyfile&lt;/code&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add .\keyfile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit -m &quot;添加签名文件&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;: 在github上新建仓库的时候，github已经把默认分支从以前的&lt;code&gt;master&lt;/code&gt;改为了&lt;code&gt;main&lt;/code&gt; ,所以上面的命令是&lt;code&gt;git push origin main&lt;/code&gt;，而不是之前的&lt;code&gt;git push origin master&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;添加签名文件仓库为git的子模块&lt;a href=&quot;#添加签名文件仓库为git的子模块&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;切换到项目目录，使用以下命令将包含密钥文件的私有存储库添加为子模块，为简单起见，我们将其称为&lt;code&gt; keystore&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;code&gt;git submodule add git@github.com:Ernest-su/keystore.git keystore&lt;/code&gt;&lt;/p&gt;&lt;p&gt;这样，我们便拥有了可以在本地进行签名的密钥库，并且因为该仓库是私有仓库，其他人&lt;strong&gt;不会&lt;/strong&gt;获取到签名文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/image-20220426130338684.png&quot; alt=&quot;image-20220426130338684&quot; /&gt;&lt;figcaption&gt;image-20220426130338684&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;可以看到，项目已经多了一个&lt;code&gt;keystore&lt;/code&gt;文件夹，里面有我们的签名文件。因为是作为git的子模块&lt;code&gt;submodule&lt;/code&gt; 来添加的，所以提交的时候，项目只会引用子模块的提交信息，不会包含此文件夹。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/image-20220426130224297.png&quot; alt=&quot;image-20220426130224297&quot; /&gt;&lt;figcaption&gt;image-20220426130224297&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;加密的环境变量 Secrets&lt;a href=&quot;#加密的环境变量-secrets&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为了拥有更&lt;strong&gt;安全的环境&lt;/strong&gt;来使用github actions签署apk,我们在项目的设置中做以下配置。&lt;/p&gt;&lt;p&gt;在项目 &lt;code&gt;Settings -&amp;gt; Secrets-&amp;gt; Actions&lt;/code&gt;  中配置加密的环境变量，这里配置的环境变量很安全，有&lt;a href=&quot;https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets&quot; target=&quot;_blank&quot;&gt;特殊处理&lt;/a&gt;，不会在日志中显示。同时也不会传递由 &lt;code&gt;Fork&lt;/code&gt; 发起的 &lt;code&gt;Pull Request&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;以下配置，KEY*开头的是签名文件的密码和签名别名，根据上面添加为git子模块的签名文件填入正确的信息。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/images/image-20220425174715402.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;TOKEN&lt;/code&gt;配置的是github 的 &lt;code&gt;PAT&lt;/code&gt;,也就是Personal access tokens，这里就不展开介绍了，可以查阅&lt;a href=&quot;https://docs.github.com/cn/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token&quot; target=&quot;_blank&quot;&gt;官方的说明&lt;/a&gt; 这里配置的&lt;code&gt;TOKEN&lt;/code&gt;用于Github Actions执行时，拉取私有仓库子模块的签名文件。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/image-20220426130619781.png&quot; alt=&quot;image-20220426130619781&quot; /&gt;&lt;figcaption&gt;image-20220426130619781&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;修改app签名配置&lt;a href=&quot;#修改app签名配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在&lt;strong&gt;app模块&lt;/strong&gt;的&lt;code&gt;build.gradle&lt;/code&gt;中调整签名配置。&lt;code&gt;System.getenv&lt;/code&gt;读取的是系统环境变量，在GitHub Actions执行时候，读取的是上面&lt;strong&gt;加密的环境变量 Secrets&lt;/strong&gt; 中配置的信息。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;signingConfigs {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;release {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;storeFile &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;KEYSTORE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;storePassword &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getenv&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;KEYSTORE_PASSWORD&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keyAlias &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getenv&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;KEY_ALIAS&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keyPassword &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getenv&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;KEY_PASSWORD&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;在&lt;strong&gt;项目根目录&lt;/strong&gt;的&lt;code&gt;gradle.properties&lt;/code&gt;配置以下信息。我们把&lt;code&gt;KEYSTORE&lt;/code&gt;直接在这里定义了，而不是通过获取系统环境变量的方式。当然，通过上面定义加密的环境变量Secrets,再用读取系统环境变量的方式，也是ok的。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;KEYSTORE&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;../keystore/keyfile&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#以下配置到环境变量里了,在github actions的脚本中会自动读取&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# KEY_ALIAS=System.getenv(&quot;KEY_ALIAS&quot;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# KEY_PASSWORD=[your key password]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# KEYSTORE_PASSWORD=[your store password]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;配置Github Actions&lt;a href=&quot;#配置github-actions&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;在项目新建&lt;code&gt;.github\workflows&lt;/code&gt;目录，在&lt;code&gt;workflows&lt;/code&gt;目录下新建&lt;code&gt;android.yml&lt;/code&gt;文件,内容如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Android CI&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;on&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;&apos;*&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;jobs&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;runs-on&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;ubuntu-latest&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;steps&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;actions/checkout@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;submodules&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;recursive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;token&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.TOKEN }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;set up JDK 11&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;actions/setup-java@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;java-version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;11&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;distribution&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;temurin&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;cache&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;gradle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Grant execute permission for gradlew&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;chmod +x gradlew&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Build with Gradle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;env&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;#  as an environment variable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;KEYSTORE_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.KEYSTORE_PASSWORD }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;KEY_ALIAS&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.KEY_ALIAS }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;KEY_PASSWORD&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.KEY_PASSWORD }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;./gradlew assemble&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Upload binaries to release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;uses&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;svenstaro/upload-release-action@v2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;repo_token&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;:  &lt;/span&gt;&lt;span&gt;app/build/outputs/apk/release/*.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ github.ref }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;release_name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;${{ github.ref }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;overwrite&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;file_glob&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h2&gt;Github Actions 触发条件&lt;a href=&quot;#github-actions-触发条件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;简单说明下配置的含义。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;on:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;push:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tags:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &apos;*&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;意思是在推送tag到远程仓库时候，触发GitHub Actions。&lt;code&gt;&apos;*&apos;&lt;/code&gt; 表示推送所有的tag都会触发，可以改为&lt;code&gt;&apos;v*&apos;&lt;/code&gt;,表示推送了&lt;code&gt;v&lt;/code&gt;开头的tag才触发。如果希望是在推送到特定分支时候触发，如&lt;code&gt;release&lt;/code&gt;，则可以这样配置&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;on:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;push:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;branches: [ release ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;或需要推送到&lt;code&gt;master&lt;/code&gt;分支时候触发&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;on:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;push:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;branches: [ master ]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;但是需要注意,如果&lt;code&gt;master&lt;/code&gt;分支是默认分支，且是私有仓库，会浪费掉GitHub Actions的运行时间额度。公共仓库和自托管运行器免费使用 GitHub Actions。 对于私有仓库，每个 GitHub 帐户可获得一定数量的免费记录和存储。&lt;a href=&quot;https://docs.github.com/cn/billing/managing-billing-for-github-actions/managing-your-spending-limit-for-github-actions&quot; target=&quot;_blank&quot;&gt;关于额度的说明&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Github Actions 的子模块配置&lt;a href=&quot;#github-actions-的子模块配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- uses: actions/checkout@v3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;with:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;submodules: recursive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;token: ${{ secrets.TOKEN }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只有加了&lt;code&gt;  submodules: recursive&lt;/code&gt;以及&lt;code&gt;   token: ${{ secrets.TOKEN }}&lt;/code&gt;才会在构建时候拉取到私有仓库的子模块。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;读取Actions 加密系统环境变量&lt;a href=&quot;#读取actions-加密系统环境变量&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- name: Build with Gradle&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;env: #  as an environment variable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;KEY_ALIAS: ${{ secrets.KEY_ALIAS }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;此步骤用于配置解密后的环境变量到系统环境变量中,供&lt;code&gt;gradle&lt;/code&gt;脚本使用&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;上传apk文件到github release&lt;a href=&quot;#上传apk文件到github-release&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- name: Upload binaries to release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;uses: svenstaro/upload-release-action@v2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;with:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repo_token: ${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;file:  app/build/outputs/apk/release/*.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tag: ${{ github.ref }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;release_name: ${{ github.ref }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;overwrite: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;file_glob: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;body: &quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>curl批量下载并设置正确名称</title><link>https://ernest-su.github.io/curl%E6%89%B9%E9%87%8F%E4%B8%8B%E8%BD%BD%E5%B9%B6%E8%AE%BE%E7%BD%AE%E6%AD%A3%E7%A1%AE%E5%90%8D%E7%A7%B0/</link><guid isPermaLink="true">https://ernest-su.github.io/curl%E6%89%B9%E9%87%8F%E4%B8%8B%E8%BD%BD%E5%B9%B6%E8%AE%BE%E7%BD%AE%E6%AD%A3%E7%A1%AE%E5%90%8D%E7%A7%B0/</guid><description>我有一个文件，其中包含一个或多个链接。使用wget从URL列表中下载带有文件名的文件</description><pubDate>Wed, 05 Jan 2022 06:46:55 GMT</pubDate><content:encoded>&lt;p&gt;我有一个文件，其中包含一个或多个链接。使用wget从URL列表中下载带有文件名的文件&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://example.com/00001&quot; target=&quot;_blank&quot;&gt;http://example.com/00001&lt;/a&gt;
&lt;a href=&quot;http://example.com/00002&quot; target=&quot;_blank&quot;&gt;http://example.com/00002&lt;/a&gt;
&lt;a href=&quot;http://example.com/00003&quot; target=&quot;_blank&quot;&gt;http://example.com/00003&lt;/a&gt;
&lt;a href=&quot;http://example.com/00004&quot; target=&quot;_blank&quot;&gt;http://example.com/00004&lt;/a&gt;
当在浏览器中手动转到其中一个链接时，文件将自动下载。下载的文件具有该文件的唯一名称，与url路径不同。&lt;/p&gt;
&lt;p&gt;我知道使用wget -i file-of-links.txt，但下载时，每个文件的标题将基于url，而不是基于文件名。&lt;/p&gt;
&lt;p&gt;是否有一个命令可以让我下载给定文件中的链接并用文件名而不是url名保存下载的文件？&lt;/p&gt;
&lt;p&gt;可以使用—trust-server-names和—content-disposition选项执行此操作。&lt;/p&gt;
&lt;p&gt;—trust-server-names&lt;/p&gt;
&lt;p&gt;如果设置为on，对重定向重定向URL的最后一部分将用作本地文件名。默认情况下，它被用来在原来的URL&lt;/p&gt;
&lt;p&gt;—content-disposition&lt;/p&gt;
&lt;p&gt;如果设置为on，Content-Disposition的头实验（不完全功能）支持启用的最后一个组件。这可能会导致额外往返服务器的HEAD请求，并且已知会遇到一些错误，这就是为什么默认情况下当前不启用它的原因。&lt;/p&gt;
&lt;p&gt;此选项对于某些使用Content-Disposition标头描述下载文件名称的文件下载CGI程序很有用。&lt;/p&gt;</content:encoded></item><item><title>Android处理dicom文件记录</title><link>https://ernest-su.github.io/android%E5%A4%84%E7%90%86dicom%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://ernest-su.github.io/android%E5%A4%84%E7%90%86dicom%E6%96%87%E4%BB%B6%E8%AE%B0%E5%BD%95/</guid><description>纯java编写，网上有搜到android版本的jar包，是dcm4che低版本，只在安卓平台上实现了reader,没实现writer。github上的版本有reader和writer实现，但是是依赖javax相关包的，安卓上没有这些包。所以用不了github上的版本。</description><pubDate>Fri, 29 Oct 2021 09:30:55 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;dcm4che&lt;a href=&quot;#dcm4che&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;纯java编写，网上有搜到android版本的jar包，是dcm4che低版本，只在安卓平台上实现了reader,没实现writer。github上的版本有reader和writer实现，但是是依赖javax相关包的，安卓上没有这些包。所以用不了github上的版本。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;Modules&lt;a href=&quot;#modules&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;dcm4che-audit&lt;/li&gt;
&lt;li&gt;dcm4che-audit-keycloak&lt;/li&gt;
&lt;li&gt;dcm4che-conf
&lt;ul&gt;
&lt;li&gt;dcm4che-conf-api&lt;/li&gt;
&lt;li&gt;dcm4che-conf-api-hl7&lt;/li&gt;
&lt;li&gt;dcm4che-conf-json&lt;/li&gt;
&lt;li&gt;dcm4che-conf-json-schema&lt;/li&gt;
&lt;li&gt;dcm4che-conf-ldap&lt;/li&gt;
&lt;li&gt;dcm4che-conf-ldap-audit&lt;/li&gt;
&lt;li&gt;dcm4che-conf-ldap-hl7&lt;/li&gt;
&lt;li&gt;dcm4che-conf-ldap-imageio&lt;/li&gt;
&lt;li&gt;dcm4che-conf-ldap-schema&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;dcm4che-core&lt;/li&gt;
&lt;li&gt;dcm4che-dcmr&lt;/li&gt;
&lt;li&gt;dcm4che-deident&lt;/li&gt;
&lt;li&gt;dcm4che-dict&lt;/li&gt;
&lt;li&gt;dcm4che-dict-priv&lt;/li&gt;
&lt;li&gt;dcm4che-emf&lt;/li&gt;
&lt;li&gt;dcm4che-hl7&lt;/li&gt;
&lt;li&gt;dcm4che-image&lt;/li&gt;
&lt;li&gt;dcm4che-imageio&lt;/li&gt;
&lt;li&gt;dcm4che-imageio-opencv&lt;/li&gt;
&lt;li&gt;dcm4che-imageio-rle&lt;/li&gt;
&lt;li&gt;dcm4che-js-dict&lt;/li&gt;
&lt;li&gt;dcm4che-json&lt;/li&gt;
&lt;li&gt;dcm4che-mime&lt;/li&gt;
&lt;li&gt;dcm4che-net&lt;/li&gt;
&lt;li&gt;dcm4che-net-audit&lt;/li&gt;
&lt;li&gt;dcm4che-net-hl7&lt;/li&gt;
&lt;li&gt;dcm4che-net-imageio&lt;/li&gt;
&lt;li&gt;dcm4che-soundex&lt;/li&gt;
&lt;li&gt;dcm4che-ws-rs&lt;/li&gt;
&lt;li&gt;dcm4che-xdsi&lt;/li&gt;
&lt;li&gt;dcm4che-jboss-modules&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Utilities&lt;a href=&quot;#utilities&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-agfa2dcm/README.md&quot; target=&quot;_blank&quot;&gt;agfa2dcm&lt;/a&gt;: Extract DICOM files from Agfa BLOB file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2dcm/README.md&quot; target=&quot;_blank&quot;&gt;dcm2dcm&lt;/a&gt;: Transcode DICOM file according the specified Transfer Syntax&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2jpg/README.md&quot; target=&quot;_blank&quot;&gt;dcm2jpg&lt;/a&gt;: Convert DICOM image to JPEG or other image formats&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2json/README.md&quot; target=&quot;_blank&quot;&gt;dcm2json&lt;/a&gt;: Convert DICOM file in JSON presentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2pdf/README.md&quot; target=&quot;_blank&quot;&gt;dcm2pdf&lt;/a&gt;: Extract encapsulated PDF, CDA or STL from DICOM file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2str/README.md&quot; target=&quot;_blank&quot;&gt;dcm2str&lt;/a&gt;: Apply Attributes Format Pattern to dicom file or command line parameters.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcm2xml/README.md&quot; target=&quot;_blank&quot;&gt;dcm2xml&lt;/a&gt;: Convert DICOM file in XML presentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcmdir/README.md&quot; target=&quot;_blank&quot;&gt;dcmdir&lt;/a&gt;: Dump, create or update DICOMDIR file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcmdump/README.md&quot; target=&quot;_blank&quot;&gt;dcmdump&lt;/a&gt;: Dump DICOM file in textual form&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcmldap/README.md&quot; target=&quot;_blank&quot;&gt;dcmldap&lt;/a&gt;: Insert/remove configuration entries for Network AEs into/from LDAP server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcmqrscp/README.md&quot; target=&quot;_blank&quot;&gt;dcmqrscp&lt;/a&gt;: Simple DICOM archive&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-dcmvalidate/README.md&quot; target=&quot;_blank&quot;&gt;dcmvalidate&lt;/a&gt;: Validate DICOM object according a specified Information Object Definition&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-deidentify/README.md&quot; target=&quot;_blank&quot;&gt;deidentify&lt;/a&gt;: De-identify one or several DICOM files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-emf2sf/README.md&quot; target=&quot;_blank&quot;&gt;emf2sf&lt;/a&gt;: Convert DICOM Enhanced Multi-frame image to legacy DICOM Single-frame images&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-findscu/README.md&quot; target=&quot;_blank&quot;&gt;findscu&lt;/a&gt;: Invoke DICOM C-FIND Query Request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-getscu/README.md&quot; target=&quot;_blank&quot;&gt;getscu&lt;/a&gt;: Invoke DICOM C-GET Retrieve Request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-hl72xml/README.md&quot; target=&quot;_blank&quot;&gt;hl72xml&lt;/a&gt;: Convert HL7 v2.x message in XML presentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-hl7pdq/README.md&quot; target=&quot;_blank&quot;&gt;hl7pdq&lt;/a&gt;: Query HL7 v2.x Patient Demographics Supplier&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-hl7pix/README.md&quot; target=&quot;_blank&quot;&gt;hl7pix&lt;/a&gt;: Query HL7 v2.x PIX Manager&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-hl7rcv/README.md&quot; target=&quot;_blank&quot;&gt;hl7rcv&lt;/a&gt;: HL7 v2.x Receiver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-hl7snd/README.md&quot; target=&quot;_blank&quot;&gt;hl7snd&lt;/a&gt;: Send HL7 v2.x message&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-ianscp/README.md&quot; target=&quot;_blank&quot;&gt;ianscp&lt;/a&gt;: DICOM Instance Availability Notification receiver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-ianscu/README.md&quot; target=&quot;_blank&quot;&gt;ianscu&lt;/a&gt;: Send DICOM Instance Availability Notification&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-jpg2dcm/README.md&quot; target=&quot;_blank&quot;&gt;jpg2dcm&lt;/a&gt;: Convert JPEG images or MPEG videos in DICOM files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-json2props/README.md&quot; target=&quot;_blank&quot;&gt;json2props&lt;/a&gt;: Convert Archive configuration schema JSON files to key/value properties files and vice versa&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-json2rst/README.md&quot; target=&quot;_blank&quot;&gt;json2rst&lt;/a&gt;: Generate ReStructuredText files from Archive configuration schema JSON files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-mkkos/README.md&quot; target=&quot;_blank&quot;&gt;mkkos&lt;/a&gt;: Make DICOM Key Object Selection Document&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-ihe/dcm4che-tool-ihe-modality/README.md&quot; target=&quot;_blank&quot;&gt;modality&lt;/a&gt;: Simulates DICOM Modality&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-movescu/README.md&quot; target=&quot;_blank&quot;&gt;movescu&lt;/a&gt;: Invoke DICOM C-MOVE Retrieve request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-mppsscp/README.md&quot; target=&quot;_blank&quot;&gt;mppsscp&lt;/a&gt;: DICOM Modality Performed Procedure Step Receiver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-mppsscu/README.md&quot; target=&quot;_blank&quot;&gt;mppsscu&lt;/a&gt;: Send DICOM Modality Performed Procedure Step&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-pdf2dcm/README.md&quot; target=&quot;_blank&quot;&gt;pdf2dcm&lt;/a&gt;: Convert PDF file into DICOM file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-stgcmtscu/README.md&quot; target=&quot;_blank&quot;&gt;stgcmtscu&lt;/a&gt;: Invoke DICOM Storage Commitment Request&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-storescp/README.md&quot; target=&quot;_blank&quot;&gt;storescp&lt;/a&gt;: DICOM Composite Object Receiver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-storescu/README.md&quot; target=&quot;_blank&quot;&gt;storescu&lt;/a&gt;: Send DICOM Composite Objects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-stowrs/README.md&quot; target=&quot;_blank&quot;&gt;stowrs&lt;/a&gt;: Send DICOM Composite Objects or Bulkdata file over Web&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-stowrsd/README.md&quot; target=&quot;_blank&quot;&gt;stowrsd&lt;/a&gt;: STOW-RS Server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-swappxdata/README.md&quot; target=&quot;_blank&quot;&gt;swappxdata&lt;/a&gt;: Swaps bytes of uncompressed pixel data in DICOM files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-syslog/README.md&quot; target=&quot;_blank&quot;&gt;syslog&lt;/a&gt;: Send Syslog messages via TCP/TLS or UDP to a Syslog Receiver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-syslogd/README.md&quot; target=&quot;_blank&quot;&gt;syslogd&lt;/a&gt;: Receives RFC 5424 Syslog messages via TCP/TLS or UDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-upsscu/README.md&quot; target=&quot;_blank&quot;&gt;upsscu&lt;/a&gt;: Invokes services of Unified Procedure Step Service Class&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-wadors/README.md&quot; target=&quot;_blank&quot;&gt;wadors&lt;/a&gt;: Wado RS Client Simulator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-wadows/README.md&quot; target=&quot;_blank&quot;&gt;wadows&lt;/a&gt;: Wado WS Client Simulator&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-xml2dcm/README.md&quot; target=&quot;_blank&quot;&gt;xml2dcm&lt;/a&gt;: Create/Update DICOM file from/with XML presentation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-xml2hl7/README.md&quot; target=&quot;_blank&quot;&gt;xml2hl7&lt;/a&gt;: Create HL7 v2.x message from XML presentation&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;license: Mozilla Public License Version 1.1&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;imebra&lt;a href=&quot;#imebra&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;Imebra now supplies the pre-compiled library for Android, which applies the Windowing in real time when you use the DicomView class (an Android View that displays the Dicom Image).&lt;/p&gt;&lt;p&gt;There is no need to convert to jpeg: Follow the example in the documentation and then modify the windowing value in the voilut object.&lt;/p&gt;&lt;p&gt;license use Imebra without being bound to the &lt;strong&gt;GPLv2&lt;/strong&gt; license you have to &lt;strong&gt;buy a commercial license&lt;/strong&gt;. &lt;a href=&quot;https://imebra.com/buy/&quot; target=&quot;_blank&quot;&gt;https://imebra.com/buy/&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;&lt;a href=&quot;http://www.pixelmed.com/&quot; target=&quot;_blank&quot;&gt;PixelMed&lt;/a&gt;&lt;a href=&quot;#pixelmed&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;stackoverflow上有帖子说可以用在安卓上，相关资料很少&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;DCMTK&lt;a href=&quot;#dcmtk&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;论坛说可以用ndk编译，跑在安卓上&lt;/p&gt;&lt;p&gt;Compiling DCMTK for Android(中文版)
&lt;a href=&quot;https://blog.csdn.net/chenhuakang/article/details/73608510&quot; target=&quot;_blank&quot;&gt;https://blog.csdn.net/chenhuakang/article/details/73608510&lt;/a&gt;&lt;/p&gt;&lt;p&gt;license&lt;a&gt;&lt;/a&gt; free evaluation licence is available for the OFFIS DICOM software packages DCMPPS, DCMPPSCU, PPSMGR, DCMPRINT SCU, DCMPRINT SCP, DCM2AVI, DCMJP2K and DCMSTCOM. The evaluation licence allows to download the software from the internet and to evaluate it for a period of four months. Any further use of the software requires a full licence agreement.&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>一句话笔记：常用linux命令</title><link>https://ernest-su.github.io/one-word-linux-command/</link><guid isPermaLink="true">https://ernest-su.github.io/one-word-linux-command/</guid><description>SMB</description><pubDate>Thu, 15 Jul 2021 09:21:02 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;文件系统远程挂载&lt;a href=&quot;#文件系统远程挂载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;SMB&lt;/p&gt;&lt;p&gt;//IP地址是windows地址，后面跟上windows上的共享目录，后面的路径是linux上的挂载路径
sudo mount -t cifs  //172.20.4.5/临时文件  /data/sync -o username=cad,password=tdc1718,sec=ntlm,vers=1.0&lt;/p&gt;&lt;p&gt;NFS&lt;/p&gt;&lt;p&gt;mount -t nfs -o nolock 172.20.4.106:/home /data/sync&lt;/p&gt;&lt;p&gt;开机挂载&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;开机自动挂载文件&lt;a href=&quot;#开机自动挂载文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;修改 /etc/fstab 文件， 挂载命令如：&lt;/p&gt;&lt;p&gt;SMB&lt;/p&gt;&lt;p&gt;//192.168.22.111/shared /home/www/ cifs username=xxx,password=xxx,rw,dir_mode=0777,file_mode=0777 0 0&lt;/p&gt;&lt;p&gt;NFS&lt;/p&gt;&lt;p&gt;172.20.4.106:/home /data/sync nfs username=suqishuo,password=suqishuo@4.106,rw,dir_mode=0777,file_mode=0777 0 0&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;curl,apt 设置代理&lt;a href=&quot;#curlapt-设置代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;curl -x socks5h://192.168.3.125:9081 -LO &lt;a href=&quot;http://google.com&quot; target=&quot;_blank&quot;&gt;http://google.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;sudo apt-get -o Acquire::http::proxy=“socks5h://192.168.3.125:9081/” update
apt-get -o Acquire::http::proxy=“socks5h://192.168.3.125:9081/”  install xxx&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;批量替换文件内容&lt;a href=&quot;#批量替换文件内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/http:\/\/tracker\.m.com/https:\/\/tracker\.m\.com/&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;软连接&lt;a href=&quot;#软连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;sudo ln -s “/data_20t/media/霍元甲港版导演剪辑版” “/data_20t/media/Fearless Hong Kong Version Director’s Cut 2006 Blu-Ray 1080p AVC LPCM 7.1”&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;配置 ipv6&lt;a href=&quot;#配置-ipv6&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat /etc/network/interfaces&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# The loopback network interface&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;auto lo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iface lo inet loopback&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;auto enp3s0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iface enp3s0 inet dhcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iface enp3s0 inet6 dhcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;autoconf 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;accept_ra 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;auto enp4s0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;iface enp4s0 inet dhcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;重启网卡&lt;a href=&quot;#重启网卡&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;code&gt;sudo /etc/init.d/networking restart&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>一句话笔记：常用mac命令</title><link>https://ernest-su.github.io/one-word-mac-command/</link><guid isPermaLink="true">https://ernest-su.github.io/one-word-mac-command/</guid><description>查看路由表 netstat nr 删除路由 sudo route v delete net 172.20/24 添加路由 sudo route n add net 172.20.3.0 netmask 255.255.255.0 192.168.123.1</description><pubDate>Thu, 15 Jul 2021 09:21:02 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;双网卡路由配置&lt;a href=&quot;#双网卡路由配置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;查看路由表  netstat -nr&lt;/li&gt;
&lt;li&gt;删除路由 sudo route -v delete -net 172.20/24&lt;/li&gt;
&lt;li&gt;添加路由 sudo route -n add -net 172.20.3.0 -netmask 255.255.255.0 192.168.123.1&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;文件系统远程挂载&lt;a href=&quot;#文件系统远程挂载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;SMB&lt;/p&gt;&lt;p&gt;//IP地址是windows地址，后面跟上windows上的共享目录，后面的路径是linux上的挂载路径
sudo mount -t cifs  //172.20.4.5/临时文件  /data/sync -o username=cad,password=tdc1718,sec=ntlm,vers=1.0&lt;/p&gt;&lt;p&gt;NFS&lt;/p&gt;&lt;p&gt;mount -t nfs -o nolock 172.20.4.106:/home /data/sync&lt;/p&gt;&lt;p&gt;开机挂载&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;开机自动挂载文件&lt;a href=&quot;#开机自动挂载文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;修改 /etc/fstab 文件， 挂载命令如：&lt;/p&gt;&lt;p&gt;SMB&lt;/p&gt;&lt;p&gt;//192.168.22.111/shared /home/www/ cifs username=xxx,password=xxx,rw,dir_mode=0777,file_mode=0777 0 0&lt;/p&gt;&lt;p&gt;NFS&lt;/p&gt;&lt;p&gt;172.20.4.106:/home /data/sync nfs username=suqishuo,password=suqishuo@4.106,rw,dir_mode=0777,file_mode=0777 0 0&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;curl,apt 设置代理&lt;a href=&quot;#curlapt-设置代理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;curl -x socks5h://192.168.3.125:9081 -LO &lt;a href=&quot;http://google.com&quot; target=&quot;_blank&quot;&gt;http://google.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;sudo apt-get -o Acquire::http::proxy=“socks5h://192.168.3.125:9081/” update
apt-get -o Acquire::http::proxy=“socks5h://192.168.3.125:9081/”  install xxx&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;批量替换文件内容&lt;a href=&quot;#批量替换文件内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/http:\/\/tracker\.m.com/https:\/\/tracker\.m\.com/&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.txt&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>一句话PT笔记</title><link>https://ernest-su.github.io/one-word-pt/</link><guid isPermaLink="true">https://ernest-su.github.io/one-word-pt/</guid><description>https://www.kdocs.cn/l/sEi6Sg5iu</description><pubDate>Thu, 15 Jul 2021 09:21:02 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;盒子（seedbox）限制汇总，H&amp;amp;R汇总&lt;a href=&quot;#盒子seedbox限制汇总hr汇总&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.kdocs.cn/l/sEi6Sg5iu&quot; target=&quot;_blank&quot;&gt;https://www.kdocs.cn/l/sEi6Sg5iu&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Android基于Modbus RTU协议通过蓝牙与蓝牙串口开发板通信</title><link>https://ernest-su.github.io/modbus-over-androidble/</link><guid isPermaLink="true">https://ernest-su.github.io/modbus-over-androidble/</guid><description>原文</description><pubDate>Mon, 08 Feb 2021 08:46:55 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h3&gt;Android基于Modbus RTU协议通过蓝牙与蓝牙串口开发板通信&lt;a href=&quot;#android基于modbus-rtu协议通过蓝牙与蓝牙串口开发板通信&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/weixin_42644340/article/details/111504661&quot; target=&quot;_blank&quot;&gt;原文&lt;/a&gt;&lt;/p&gt;&lt;p&gt;[TOC]&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;最近接到一位老师的项目，他们公司要求利用Android基于Modbus RTU协议通过蓝牙与蓝牙串口开发板通信，然后通过开发板控制硬件设备从而实现Android移动设备与硬件交互。所以今天我给大家分享下Android基于Modbus RTU协议的蓝牙通信。当然Android也可以直接通过串口利用Modbus RTU协议与开发板通信，或者基于Modbus TCP通信。至于非蓝牙非Modbus RTU协议通信，大家可以跳转到这位博主的博客：&lt;a href=&quot;https://stevenjon.blog.csdn.net/&quot; target=&quot;_blank&quot;&gt;Steven Jon&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;实现原理&lt;a href=&quot;#实现原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;要想实现Android与开发板通信，那么必将涉及到协议问题。Android采用蓝牙协议通信，而开发板使用的是串口的协议(Modbus协议)，那么应该如何实现让采用两种不同协议通信的设备进行交互呢？那当然是两种协议的套接啦，接下来我将以Modbus RTU协议给大家介绍下实现原理：
(1) 在Android中我们不能直接将指令放在蓝牙帧的数据域内，因为这样不能满足Modbus RTU协议，因此开发板无法从蓝牙帧中正确解析出你的指令，所以我们应该先将指令数据按照Modbus RTU协议先进行指令封装，然后将封装好的Modbus RTU协议指令帧整个放在蓝牙帧的数据域内。这样当开发板获取蓝牙帧时会自动获取数据域内的数据，这时候将获取到含有指令的Modbus RTU协议帧，然后从含有指令的Modbus RTU协议帧中解析出指令操作。
(2) 当然开发板要想从蓝牙帧中自动提取数据域中的数据也是有条件的，那就是在开发板上必须加上串口转蓝牙接口。
这个串口转蓝牙接口就是实现两种协议套接的核心。它的作用是如果获取到的是Android发出的蓝牙帧时自动提取数据区域内的Modbus RTU协议帧，而如果收到的是开发板发出的Modbus RTU协议帧时则自动将它封装到蓝牙帧中。都是文字的话大家是不是很难理解，那么接下来上原理图：&lt;/p&gt;&lt;p&gt;套接原理图：
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/modbus_over_android_ble01.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;figcaption&gt;在这里插入图片描述&lt;/figcaption&gt;&lt;/figure&gt;
功能原理图：
&lt;figure&gt;&lt;img src=&quot;/images/modbus_over_android_ble2.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;figcaption&gt;在这里插入图片描述&lt;/figcaption&gt;&lt;/figure&gt;看完实现原理接下来介绍最重要的代码实现。&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在Android上实现Modbus RTU Master&lt;a href=&quot;#在android上实现modbus-rtu-master&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;在Android中针对Modbus RTU消息帧没有现成的组装模块，因此需要自己写。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;组装Modbus RTU消息帧&lt;a href=&quot;#组装modbus-rtu消息帧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这里是将输入的指令转换成对应的Modbus RTU协议的帧。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 组装Modbus RTU消息帧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt; 从站地址号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; 功能码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; 读取寄存器起始地址 / 写入寄存器地址 / 写入寄存器起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; 读取寄存器个数 / 写入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt; 需要写入单个寄存器的数值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt; 需要写入多个寄存器的数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; 将整个消息帧转成byte[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;synchronized&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//检查参数是否符合协议规定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid slave &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xffff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid starting_address &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid quantity_of_x &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 构造request&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//写入从站地址号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//根据功能码组装数据区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//如果为读取寄存器指令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;READ_COILS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;READ_DISCRETE_INPUTS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;READ_INPUT_REGISTERS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;READ_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_REGISTER&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写单个寄存器指令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xff00&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;//如果为线圈寄存器（写1时为 FF 00,写0时为00 00）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WRITE_COILS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写多个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//计算写入字节数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;/// 满足关系-&amp;gt; (w /8) + 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入数量 == 8 ,则写入字节数为1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//如果写入数据数量 &amp;gt; 8 ，则需要拆分开来&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;//数组开始位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;//数组结束位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//循环写入拆分数组，直到剩下最后一组 元素个数 &amp;lt;= 8 的数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sIndex&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;sIndex&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;//数据反转 对于是否要反转要看你传过来的数据，如果高低位顺序正确则不用反转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reverseArr&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;//写入拆分数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;toDecimal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入最后剩下的数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arraycopy&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//数据反转 对于是否要反转要看你传过来的数据，如果高低位顺序正确则不用反转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reverseArr&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;toDecimal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;WRITE_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写多个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ModbusFunctionNotSupportedError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Not support function &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;toByteArray&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//计算CRC校验码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CRC16&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16Reversal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;crc&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;toByteArray&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ModbusErrorType&lt;a href=&quot;#modbuserrortype&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;定义Modbus通讯错误类型&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 常见的Modbus通讯错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusFunctionNotSupportedError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusDuplicatedKeyError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusMissingKeyError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusInvalidBlockError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusOverlapBlockError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusOutOfBlockError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusInvalidResponseError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusInvalidRequestError&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ModbusTimeoutError&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ModbusError&lt;a href=&quot;#modbuserror&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;&lt;span&gt;TextUtils&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;isEmpty&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Modbus Error: Exception code = &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;: &quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getCode&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ModbusFunction&lt;a href=&quot;#modbusfunction&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;功能码定义&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 功能码（十进制显示）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;READ_COILS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读离散输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;READ_DISCRETE_INPUTS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;READ_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;READ_INPUT_REGISTERS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//写单个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//写单个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WRITE_SINGLE_REGISTER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//写入多个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WRITE_COILS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//写入多个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WRITE_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ByteArrayWriter&lt;a href=&quot;#bytearraywriter&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteArrayOutputStream&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteUtil&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeInt16Reversal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;ByteUtil&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt16Reversal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeInt32&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteUtil&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt32&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeBytes&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bs&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ByteUtil&lt;a href=&quot;#byteutil&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteUtil&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toHexString&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;separator&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;separator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;separator&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;toHexString&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xff&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;0&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sb&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;toHexString&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toHexString&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot; &quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt32&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;16&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt16&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fromInt16Reversal&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;CRC16&lt;a href=&quot;#crc16&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CRC16&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;crc16_tab_h&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;crc16_tab_l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { (byte) &lt;/span&gt;&lt;span&gt;0x00&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x01&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC3&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x03&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x02&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC2&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC6&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x06&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x07&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xC7&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x05&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC5&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC4&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x04&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xCC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x0C&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x0D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xCD&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x0F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xCF&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xCE&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x0E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x0A&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xCA&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xCB&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x0B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC9&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x09&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x08&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xC8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xD8&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x18&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x19&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD9&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x1B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDB&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDA&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x1A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x1E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDE&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDF&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x1F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDD&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x1D&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x1C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xDC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x14&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD4&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD5&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x15&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD7&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x17&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x16&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD6&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD2&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x12&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x13&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x11&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xD0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x10&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x30&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x31&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xF1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x33&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF3&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF2&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x32&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x36&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF6&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xF7&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x37&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF5&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x35&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x34&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF4&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3C&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xFC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xFD&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xFF&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xFE&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xFA&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x3B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xFB&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x39&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF9&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xF8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x38&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x28&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE8&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE9&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x29&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xEB&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x2B&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x2A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xEA&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xEE&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x2E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x2F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xEF&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x2D&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xED&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xEC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x2C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE4&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x24&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x25&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x27&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE7&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE6&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x26&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x22&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE2&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x23&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x21&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x20&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xE0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x60&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x61&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x63&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA3&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA2&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x62&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x66&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xA6&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA7&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x67&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA5&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x65&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x64&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x6C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xAC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xAD&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x6D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xAF&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x6F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x6E&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xAE&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xAA&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x6A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x6B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xAB&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x69&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xA9&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xA8&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x68&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x78&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB8&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB9&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x79&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBB&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x7B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x7A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBA&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBE&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x7E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x7F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBF&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x7D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBD&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xBC&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x7C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB4&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x74&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x75&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xB5&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x77&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB7&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB6&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x76&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x72&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0xB3&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x73&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB1&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x71&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x70&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0xB0&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x50&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x90&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x91&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x51&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x93&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x53&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x52&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x92&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x96&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x56&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x57&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x97&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x55&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x95&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x94&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x54&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x9C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x9D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x9F&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x9E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x9A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x9B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x5B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x99&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x59&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x58&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x98&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x88&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x48&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x49&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x89&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x4B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8B&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x4A&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x4E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8E&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8F&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x4F&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x4D&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x4C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x8C&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x44&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x84&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x85&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x45&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x87&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x47&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x46&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x86&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x82&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;(byte) &lt;/span&gt;&lt;span&gt;0x42&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x43&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x83&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x41&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x81&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x80&lt;/span&gt;&lt;span&gt;, (byte) &lt;/span&gt;&lt;span&gt;0x40&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 计算CRC16校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            需要计算的数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; CRC16校验值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 计算CRC16校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            需要计算的数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            起始位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            长度&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; CRC16校验值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;0xffff&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 计算CRC16校验&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            需要计算的数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            起始位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            长度&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preval&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*            之前的校验值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; CRC16校验值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preval&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ucCRCHi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;preval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xff00&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ucCRCLo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;preval&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x00ff&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;iIndex&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;len&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;iIndex&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;ucCRCLo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;offset&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x00ff&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ucCRCLo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ucCRCHi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crc16_tab_h&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;iIndex&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ucCRCHi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crc16_tab_l&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;iIndex&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;ucCRCHi&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x00ff&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;ucCRCLo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x00ff&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0xffff&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;ModbusRtuMaster完整代码&lt;a href=&quot;#modbusrtumaster完整代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这个类主要的功能就是将输入的指令转换成符合ModbusRtu协议的指令并返回，之后Android只需将返回的byte[]类型的值用蓝牙发送即可。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusRtuMaster&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 组装Modbus RTU消息帧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;            从站地址号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;    功能码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; 读取寄存器起始地址 / 写入寄存器地址 / 写入寄存器起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;    读取寄存器个数 / 写入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt;     需要写入单个寄存器的数值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;    需要写入多个寄存器的数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; 将整个消息帧转成byte[]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;synchronized&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                                        &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//检查参数是否符合协议规定&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt; &amp;lt; 0 || &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt; &amp;gt; 0&lt;/span&gt;&lt;span&gt;xff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid slave &quot;&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; &amp;lt; 0 || &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt; &amp;gt; 0&lt;/span&gt;&lt;span&gt;xffff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid starting_address &quot;&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &amp;lt; 1 || &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; &amp;gt; 0&lt;/span&gt;&lt;span&gt;xff&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ModbusInvalidArgumentError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Invalid quantity_of_x &quot;&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 构造request&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ByteArrayWriter&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//写入从站地址号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//根据功能码组装数据区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//如果为读取寄存器指令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_COILS&lt;/span&gt;&lt;span&gt; || &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_DISCRETE_INPUTS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;|| &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_INPUT_REGISTERS&lt;/span&gt;&lt;span&gt; || &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt; || &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_REGISTER&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写单个寄存器指令&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt; != 0) &lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt; = 0&lt;/span&gt;&lt;span&gt;xff00&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;//如果为线圈寄存器（写1时为 FF 00,写0时为00 00）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output_value&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_COILS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写多个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//计算写入字节数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; = (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; / 8) + 1;&lt;/span&gt;&lt;span&gt;/// 满足关系-&amp;gt; (w /8) + 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入数量 == 8 ,则写入字节数为1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; % 8 == 0) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; -= 1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; = 0;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//如果写入数据数量 &amp;gt; 8 ，则需要拆分开来&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; = 0;&lt;/span&gt;&lt;span&gt;//数组开始位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt; = 7;&lt;/span&gt;&lt;span&gt;//数组结束位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[8];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//循环写入拆分数组，直到剩下最后一组 元素个数 &amp;lt;= 8 的数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt; &amp;gt; 1) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;writeByteCount&lt;/span&gt;&lt;span&gt;--;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sIndex&lt;/span&gt;&lt;span&gt; = 0;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt; &amp;lt;= &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;++) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;sIndex&lt;/span&gt;&lt;span&gt;++] = &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;//数据反转 对于是否要反转要看你传过来的数据，如果高低位顺序正确则不用反转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;reverseArr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;//写入拆分数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;toDecimal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;splitData&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;start&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;span&gt; += 8;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入最后剩下的数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt; - &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;arraycopy&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;index&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;last&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//数据反转 对于是否要反转要看你传过来的数据，如果高低位顺序正确则不用反转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;reverseArr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;toDecimal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tData&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt; == &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;span&gt;//写多个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;starting_address&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt8&lt;/span&gt;&lt;span&gt;(2 &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;quantity_of_x&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;//写入数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;output_values&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;throw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;ModbusErrorType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ModbusFunctionNotSupportedError&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Not support function &quot;&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;function_code&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toByteArray&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//计算CRC校验码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;crc&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;CRC16&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;compute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;writeInt16Reversal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;crc&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toByteArray&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 读多个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;          从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;   起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt; 读取线圈寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readCoils&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_COILS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读单个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readCoil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;readCoils&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 读多个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;          从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;   起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt; 读取保持寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readHoldingRegisters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读单个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readHoldingRegister&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;readHoldingRegisters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 读多个输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;          从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;   起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt; 读取输入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readInputRegisters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_INPUT_REGISTERS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读单个输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readInputRegister&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;readInputRegisters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 读多个离散输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;          从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;   起始地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt; 读取离散输入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readDiscreteInputs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;READ_DISCRETE_INPUTS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;startAddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;numberOfPoints&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//读单个离散输入寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;readDiscreteInput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;readDiscreteInputs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 写单个线圈寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;   从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt; 写入寄存器地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;   写入值（true/false)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;writeSingleCoil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_COIL&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1, &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt; ? 1 : 0, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 写单个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;   从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt; 写入寄存器地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;   写入值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError Modbus错误&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;writeSingleRegister&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_SINGLE_REGISTER&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, 1, &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 写入多个保持寄存器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;   从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt; 写入寄存器地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sCount&lt;/span&gt;&lt;span&gt;  写入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;    写入数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;writeHoldingRegisters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sCount&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_HOLDING_REGISTERS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;sCount&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;228&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 写入多个位&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;229&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;230&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;   从站地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;231&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt; 写入寄存器地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;232&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bCount&lt;/span&gt;&lt;span&gt;  写入寄存器个数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;233&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;    写入数据{1,0}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;234&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; ModbusError&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;235&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;236&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;writeCoils&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bCount&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;throws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusError&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;237&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;slave&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ModbusFunction&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;WRITE_COILS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;address&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;bCount&lt;/span&gt;&lt;span&gt;, 0, &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;238&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sendBytes&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;239&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;240&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;241&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;242&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//将数组反转&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;243&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;reverseArr&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;244&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;tem&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;245&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = 0; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &amp;lt; &lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;++) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;246&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;tem&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;arr&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt; - 1 - &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;247&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;248&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;249&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;250&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;251&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;252&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 字节转换为 16 进制字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;253&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;254&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; 字节&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;255&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; Hex 字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;256&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;257&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;byte2Hex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;258&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toHexString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;259&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;() &amp;gt; 2) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;260&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;() - 2));&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;261&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;262&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;() &amp;lt; 2) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;263&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(0, &lt;/span&gt;&lt;span&gt;&quot;0&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;264&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;265&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;266&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;267&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;268&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;269&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;270&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* 字节数组转换为 16 进制字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;271&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;272&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;param&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt; 字节数组&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;273&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;* &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; Hex 字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;274&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;&lt;span&gt;*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;275&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bytes2Hex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;276&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;277&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;278&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;%02x &quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;279&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;280&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;281&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;282&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;283&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;284&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;285&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//将int[1,0,0,1,1,0]数组转换为十进制数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;286&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;toDecimal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;287&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; = 0;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;288&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt; != &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;289&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sData&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;StringBuilder&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;290&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;291&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;sData&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;append&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;292&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;293&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;294&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parseInt&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sData&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;(), 2);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;295&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;NumberFormatException&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;296&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; = -1;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;297&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;298&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;299&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;300&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;301&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;302&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在Android上实现用蓝牙传递Modbus Rtu协议帧&lt;a href=&quot;#在android上实现用蓝牙传递modbus-rtu协议帧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;今天分享的是Android如何基于Modbus RTU协议与蓝牙串口开发板通信，至于Android如何搜索蓝牙设备，如何连接我这就不多做介绍了，网上有很多博主做了一大堆了。接下来来看看我们写好的ModbusRtuMaster怎么使用吧。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//首先在你的activity中定义一个ModbusRtuMaster类型&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusRtuMaster&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modbusRtuMaster&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//然后在activity中的onCreate方法里初始化ModbusRtuMaster&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;modbusRtuMaster&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ModbusRtuMaster&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//最后利用ModbusRtuMaster对输入的指令进行协议封装并接收返回结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//这时候results就是一个符合ModbusRtu协议的消息针了&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;results&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modbusRtuMaster&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;writeHoldingRegisters&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Rs485&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Rsaddress&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Hvalue&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;length&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Hvalue&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//接下来可以把results用蓝牙发给你的蓝牙串口开发板了&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;OutputStream&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mmOutStream&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;mmOutStream&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;results&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;字节数组转换为 16 进制字符串的方法&lt;a href=&quot;#字节数组转换为-16-进制字符串的方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;这里我再提下ModbusRtuMaster里面的bytes2Hex方法，如果你想把转换后的指令或者是串口返回的数据显示在Android设备上，那么必须将其转化为Hex类型的16进制字符串，如果不转换成Hex那么显示出来将是乱码等，因为那些数据是btye类型，然后就是这里不能使用
new String(byte[])
去将byte数组转换成string，否则将显示成符号字母，请务必按照我在ModbusRtuMaster内写的bytes2Hex将字节数组转换为 16 进制字符串，再输出显示。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bytes2Hex&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Formatter&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;byte&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;bytes&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;%02x &quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;toString&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;formatter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;close&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如何使用bytes2Hex&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;modbusRtuMaster&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;bytes2Hex&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;results&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;最终效果&lt;a href=&quot;#最终效果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;最后让我们来看看使用ModbusRtuMaster返回帧通过蓝牙传给蓝牙串口开发板的效果吧！(蓝色代表发送指令，绿色代表接收开发板返回的数据)
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/modbus_over_android_ble03.png&quot; alt=&quot;在这里插入图片描述&quot; /&gt;&lt;figcaption&gt;在这里插入图片描述&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以上就是《Android基于ModbusRtu协议通过蓝牙与蓝牙串口开发板通信》的全部内容了，我也是第一次使用Android去通信开发板与硬件交互。这里非常感谢另一位博主的文章 &lt;a href=&quot;https://stevenjon.blog.csdn.net/&quot; target=&quot;_blank&quot;&gt;Steven Jon&lt;/a&gt;，我也是借鉴了他博客中的一篇关于ModbusRtuMaster的文章才实现通信的，对其他通信方法感兴趣的小伙伴可以点击去Steven Jon大佬的博客继续学习。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>ADB 操作命令详解及用法大全</title><link>https://ernest-su.github.io/adb-command-usage-collection/</link><guid isPermaLink="true">https://ernest-su.github.io/adb-command-usage-collection/</guid><description>[TOC]</description><pubDate>Mon, 08 Feb 2021 03:46:55 GMT</pubDate><content:encoded>&lt;p&gt;[TOC]&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;一、ADB是什么？&lt;a href=&quot;#一adb是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;ADB，即 &lt;a href=&quot;https://link.juejin.im/?target=https://developer.android.com/studio/command-line/adb.html&quot; target=&quot;_blank&quot;&gt;Android Debug Bridge&lt;/a&gt; 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具，它可为各种设备操作提供便利，如安装和调试应用，并提供对 Unix shell（可用来在模拟器或连接的设备上运行各种命令）的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载 &lt;a href=&quot;http://adbshell.com/downloads&quot; target=&quot;_blank&quot;&gt;ADB Kits&lt;/a&gt; 。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;二、ADB有什么作用？&lt;a href=&quot;#二adb有什么作用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;ADB 是 Android SDK 里的一个工具, 用这个工具可以直接操作管理Android模拟器或者真实的Android设备。它的主要功能有:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;在设备上运行Shell命令； 将本地APK软件安装至模拟器或Android设备；&lt;/li&gt;
&lt;li&gt;管理设备或手机模拟器上的预定端口；&lt;/li&gt;
&lt;li&gt;在设备或手机模拟器上复制或粘贴文件。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;ADB 是一个客户端-服务器程序程序，包括三个组件：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;客户端：该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。&lt;/li&gt;
&lt;li&gt;后台程序：该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。&lt;/li&gt;
&lt;li&gt;服务器：该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;三、ADB命令语法&lt;a href=&quot;#三adb命令语法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;adb 命令的基本语法如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb [-d|-e|-s &amp;lt;serial-number&amp;gt;] &amp;lt;command&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h5&gt;单一设备/模拟器连接&lt;a href=&quot;#单一设备模拟器连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;如果只有一个设备/模拟器连接时，可以省略掉 &lt;code&gt;[-d|-e|-s &amp;lt;serial-number&amp;gt;]&lt;/code&gt; 这一部分，直接使用 &lt;code&gt;adb &amp;lt;command&amp;gt;&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;多个设备/模拟器连接&lt;a href=&quot;#多个设备模拟器连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;如果有多个设备/模拟器连接，则需要为命令指定目标设备，下表是指定目标设备的命令选项：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-d&lt;/td&gt;&lt;td&gt;指定当前唯一通过 USB 连接的 Android 设备为命令目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-e&lt;/td&gt;&lt;td&gt;指定当前唯一运行的模拟器为命令目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;serial-number&amp;gt;&lt;/code&gt; 指定相应设备序列号的设备/模拟器为命令目标&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;在多个设备/模拟器连接的情况下较常用的是 &lt;code&gt;-s &amp;lt;serial-number&amp;gt;&lt;/code&gt; 参数，&lt;code&gt;serial-number&lt;/code&gt;是指设备的设备序列号，可以通过 &lt;code&gt;adb devices&lt;/code&gt; 命令获取。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;四、ADB常用命令&lt;a href=&quot;#四adb常用命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;4.1 基本命令&lt;a href=&quot;#41-基本命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1.1 查看adb的版本信息&lt;a href=&quot;#411-查看adb的版本信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.1.2 启动adb&lt;a href=&quot;#412-启动adb&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb start-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;一般无需手动执行此命令，在运行 adb 命令时若发现 adb server 没有启动会自动调起。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.1.3 停止adb&lt;a href=&quot;#413-停止adb&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb kill-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.1.4 以 root 权限运行 adbd&lt;a href=&quot;#414-以-root-权限运行-adbd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.1.5 指定 adb server 的网络端口&lt;a href=&quot;#415-指定-adb-server-的网络端口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb -P &amp;lt;port&amp;gt; start-server&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;ADB的默认端口为 5037。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.1.6 查询已连接的设备/模拟器列表&lt;a href=&quot;#416-查询已连接的设备模拟器列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb devices&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.2 设备连接管理&lt;a href=&quot;#42-设备连接管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.2.1 USB 连接&lt;a href=&quot;#421-usb-连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过 USB 连接来正常使用 adb 需要以下步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;确认硬件状态正常(包括 Android 设备处于正常开机状态，USB 连接线和各种接口完好)。&lt;/li&gt;
&lt;li&gt;Android 设备的开发者选项和 USB 调试模式已开启(可以在「设置」-「开发者选项」-「USB调试」打开USB调试)。&lt;/li&gt;
&lt;li&gt;确认设备驱动状态正常(安装ADB驱动程序)。&lt;/li&gt;
&lt;li&gt;通过 USB 线连接好电脑和设备后确认状态。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;adb devices&lt;/code&gt; 命令查看设备连接情况。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2.2 WLAN 连接（需要 USB 线）&lt;a href=&quot;#422-wlan-连接需要-usb-线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤：
操作步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。&lt;/li&gt;
&lt;li&gt;将设备与电脑通过 USB 线连接(可通过 &lt;code&gt;adb devices&lt;/code&gt; 命令查看设备连接情况)。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;adb tcpip 5555&lt;/code&gt; 命令让设备在 5555 端口监听 TCP/IP 连接。&lt;/li&gt;
&lt;li&gt;断开 USB 连接。&lt;/li&gt;
&lt;li&gt;找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;adb connect &amp;lt;device-ip-address&amp;gt;&lt;/code&gt; 命令使用 IP 地址将 Android 设备与电脑连接。&lt;/li&gt;
&lt;li&gt;通过 &lt;code&gt;adb devices&lt;/code&gt; 命令查看设备连接情况。&lt;/li&gt;
&lt;li&gt;使用完毕后可通过 &lt;code&gt;adb disconnect &amp;lt;device-ip-address&amp;gt;&lt;/code&gt; 命令断开无线连接。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2.3 WLAN 连接（无需借助 USB 线）&lt;a href=&quot;#423-wlan-连接无需借助-usb-线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注：需要 root 权限。不借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 Android 设备上安装一个终端模拟器(可通过&lt;a href=&quot;https://jackpal.github.io/Android-Terminal-Emulator/&quot; target=&quot;_blank&quot;&gt;Terminal Emulator for Android Downloads&lt;/a&gt;下载)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 Android 设备上的终端模拟器，在里面依次运行命令：&lt;/p&gt;
&lt;p&gt;su
setprop service.adb.tcp.port 5555&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;code&gt;adb connect &amp;lt;device-ip-address&amp;gt;&lt;/code&gt; 命令使用 IP 地址将 Android 设备与电脑连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 &lt;code&gt;adb devices&lt;/code&gt; 命令查看设备连接情况。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2.4 WiFi 连接转为 USB 连接&lt;a href=&quot;#424-wifi-连接转为-usb-连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;通过&lt;code&gt;adb usb&lt;/code&gt;命令以USB模式重新启动ADB：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb usb&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.3 应用管理&lt;a href=&quot;#43-应用管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.3.1 查看应用列表&lt;a href=&quot;#431-查看应用列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;查看应用列表的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;adb shell pm list packages&lt;/code&gt; 后面可以跟一些可选参数进行过滤查看不同的列表，可用参数及含义如下：&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;显示列表&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;所有应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-f&lt;/td&gt;&lt;td&gt;显示应用关联的 apk 文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-d&lt;/td&gt;&lt;td&gt;只显示 disabled 的应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-e&lt;/td&gt;&lt;td&gt;只显示 enabled 的应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s&lt;/td&gt;&lt;td&gt;只显示系统应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-3&lt;/td&gt;&lt;td&gt;只显示第三方应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-i&lt;/td&gt;&lt;td&gt;显示应用的 installer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-u&lt;/td&gt;&lt;td&gt;包含已卸载应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;包名包含 &lt;code&gt;&amp;lt;filter&amp;gt;&lt;/code&gt; 字符串&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.1.1 查看所有应用&lt;a href=&quot;#4311-查看所有应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm list packages&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.1.2 查看系统应用&lt;a href=&quot;#4312-查看系统应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm list packages -s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.1.3 查看第三方应用&lt;a href=&quot;#4313-查看第三方应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm list packages -3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.1.4 包名包含某字符串的应用&lt;a href=&quot;#4314-包名包含某字符串的应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;比如要查看包名包含字符串 huawei 的应用列表，命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm list packages huawei&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.2 安装应用&lt;a href=&quot;#432-安装应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;安装应用的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb install [-l] [-r] [-t] [-s] [-d] [-g] &amp;lt;apk-file&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;adb install&lt;/code&gt; 后面可以跟一些可选参数来控制安装 APK 的行为，可用参数及含义如下：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-l&lt;/td&gt;&lt;td&gt;将应用安装到保护目录 /mnt/asec&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-r&lt;/td&gt;&lt;td&gt;允许覆盖安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-t&lt;/td&gt;&lt;td&gt;允许安装 AndroidManifest.xml 里 application 指定 android=“true” 的应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s&lt;/td&gt;&lt;td&gt;将应用安装到 sdcard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-d&lt;/td&gt;&lt;td&gt;允许降级覆盖安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-g&lt;/td&gt;&lt;td&gt;授予所有运行时权限&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;运行命令后可以看到输出内容，包含安装进度和状态，安装状态如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Success：代表安装成功。&lt;/li&gt;
&lt;li&gt;Failure：代表安装失败。APK 安装失败的情况有很多，Failure状态之后有安装失败输出代码。常见安装失败输出代码、含义及可能的解决办法如下：&lt;/li&gt;
&lt;/ul&gt;


















































































































































































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;输出代码&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;解决办法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_ALREADY_EXISTS&lt;/td&gt;&lt;td&gt;应用已经存在，或卸载了但没卸载干净&lt;/td&gt;&lt;td&gt;adb install 时使用 -r 参数，或者先 adb uninstall 再安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_INVALID_APK&lt;/td&gt;&lt;td&gt;无效的 APK 文件&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_INVALID_URI&lt;/td&gt;&lt;td&gt;无效的 APK 文件名&lt;/td&gt;&lt;td&gt;确保 APK 文件名里无中文&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_INSUFFICIENT_STORAGE&lt;/td&gt;&lt;td&gt;空间不足&lt;/td&gt;&lt;td&gt;清理空间&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_DUPLICATE_PACKAGE&lt;/td&gt;&lt;td&gt;已经存在同名程序&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_NO_SHARED_USER&lt;/td&gt;&lt;td&gt;请求的共享用户不存在&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_UPDATE_INCOMPATIBLE&lt;/td&gt;&lt;td&gt;以前安装过同名应用，但卸载时数据没有移除；或者已安装该应用，但签名不一致&lt;/td&gt;&lt;td&gt;先 adb uninstall 再安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_SHARED_USER_INCOMPATIBLE&lt;/td&gt;&lt;td&gt;请求的共享用户存在但签名不一致&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_MISSING_SHARED_LIBRARY&lt;/td&gt;&lt;td&gt;安装包使用了设备上不可用的共享库&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_REPLACE_COULDNT_DELETE&lt;/td&gt;&lt;td&gt;替换时无法删除&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_DEXOPT&lt;/td&gt;&lt;td&gt;dex 优化验证失败或空间不足&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_OLDER_SDK&lt;/td&gt;&lt;td&gt;设备系统版本低于应用要求&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_CONFLICTING_PROVIDER&lt;/td&gt;&lt;td&gt;设备里已经存在与应用里同名的 content provider&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_NEWER_SDK&lt;/td&gt;&lt;td&gt;设备系统版本高于应用要求&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_TEST_ONLY&lt;/td&gt;&lt;td&gt;应用是 test-only 的，但安装时没有指定 -t 参数&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_CPU_ABI_INCOMPATIBLE&lt;/td&gt;&lt;td&gt;包含不兼容设备 CPU 应用程序二进制接口的 native code&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_MISSING_FEATURE&lt;/td&gt;&lt;td&gt;应用使用了设备不可用的功能&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_CONTAINER_ERROR&lt;/td&gt;&lt;td&gt;1. sdcard 访问失败;2. 应用签名与 ROM 签名一致，被当作内置应用。&lt;/td&gt;&lt;td&gt;1. 确认 sdcard 可用，或者安装到内置存储;2. 打包时不与 ROM 使用相同签名。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_INVALID_INSTALL_LOCATION&lt;/td&gt;&lt;td&gt;1. 不能安装到指定位置;2. 应用签名与 ROM 签名一致，被当作内置应用。&lt;/td&gt;&lt;td&gt;1. 切换安装位置，添加或删除 -s 参数;2. 打包时不与 ROM 使用相同签名。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_MEDIA_UNAVAILABLE&lt;/td&gt;&lt;td&gt;安装位置不可用&lt;/td&gt;&lt;td&gt;一般为 sdcard，确认 sdcard 可用或安装到内置存储&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_VERIFICATION_TIMEOUT&lt;/td&gt;&lt;td&gt;验证安装包超时&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_VERIFICATION_FAILURE&lt;/td&gt;&lt;td&gt;验证安装包失败&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_PACKAGE_CHANGED&lt;/td&gt;&lt;td&gt;应用与调用程序期望的不一致&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_UID_CHANGED&lt;/td&gt;&lt;td&gt;以前安装过该应用，与本次分配的 UID 不一致&lt;/td&gt;&lt;td&gt;清除以前安装过的残留文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_VERSION_DOWNGRADE&lt;/td&gt;&lt;td&gt;已经安装了该应用更高版本&lt;/td&gt;&lt;td&gt;使用 -d 参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE&lt;/td&gt;&lt;td&gt;已安装 target SDK 支持运行时权限的同名应用，要安装的版本不支持运行时权限&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_NOT_APK&lt;/td&gt;&lt;td&gt;指定路径不是文件，或不是以 .apk 结尾&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_BAD_MANIFEST&lt;/td&gt;&lt;td&gt;无法解析的 AndroidManifest.xml 文件&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION&lt;/td&gt;&lt;td&gt;解析器遇到异常&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_NO_CERTIFICATES&lt;/td&gt;&lt;td&gt;安装包没有签名&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES&lt;/td&gt;&lt;td&gt;已安装该应用，且签名与 APK 文件不一致&lt;/td&gt;&lt;td&gt;先卸载设备上的该应用，再安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING&lt;/td&gt;&lt;td&gt;解析 APK 文件时遇到 CertificateEncodingException&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME&lt;/td&gt;&lt;td&gt;manifest 文件里没有或者使用了无效的包名&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID&lt;/td&gt;&lt;td&gt;manifest 文件里指定了无效的共享用户 ID&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_MANIFEST_MALFORMED&lt;/td&gt;&lt;td&gt;解析 manifest 文件时遇到结构性错误&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_PARSE_FAILED_MANIFEST_EMPTY&lt;/td&gt;&lt;td&gt;在 manifest 文件里找不到找可操作标签（instrumentation 或 application）&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_INTERNAL_ERROR&lt;/td&gt;&lt;td&gt;因系统问题安装失败&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_USER_RESTRICTED&lt;/td&gt;&lt;td&gt;用户被限制安装应用&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_DUPLICATE_PERMISSION&lt;/td&gt;&lt;td&gt;应用尝试定义一个已经存在的权限名称&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_NO_MATCHING_ABIS&lt;/td&gt;&lt;td&gt;应用包含设备的应用程序二进制接口不支持的 native code&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_CANCELED_BY_USER&lt;/td&gt;&lt;td&gt;应用安装需要在设备上确认，但未操作设备或点了取消&lt;/td&gt;&lt;td&gt;在设备上同意安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_ACWF_INCOMPATIBLE&lt;/td&gt;&lt;td&gt;应用程序与设备不兼容&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;INSTALL_FAILED_TEST_ONLY&lt;/td&gt;&lt;td&gt;APK 文件是使用 Android Studio 直接 RUN 编译出来的文件&lt;/td&gt;&lt;td&gt;通过 Gradle 的 assembleDebug 或 assembleRelease 重新编译，或者 Generate Signed APK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;does not contain AndroidManifest.xml&lt;/td&gt;&lt;td&gt;无效的 APK 文件&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;is not a valid zip file&lt;/td&gt;&lt;td&gt;无效的 APK 文件&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Offline&lt;/td&gt;&lt;td&gt;设备未连接成功&lt;/td&gt;&lt;td&gt;先将设备与 adb 连接成功&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;unauthorized&lt;/td&gt;&lt;td&gt;设备未授权允许调试&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;error: device not found&lt;/td&gt;&lt;td&gt;没有连接成功的设备&lt;/td&gt;&lt;td&gt;先将设备与 adb 连接成功&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;protocol failure&lt;/td&gt;&lt;td&gt;设备已断开连接&lt;/td&gt;&lt;td&gt;先将设备与 adb 连接成功&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unknown option: -s&lt;/td&gt;&lt;td&gt;Android 2.2 以下不支持安装到 sdcard&lt;/td&gt;&lt;td&gt;不使用 -s 参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No space left on device&lt;/td&gt;&lt;td&gt;空间不足&lt;/td&gt;&lt;td&gt;清理空间&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Permission denied … sdcard …&lt;/td&gt;&lt;td&gt;sdcard 不可用&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;signatures do not match the previously installed version; ignoring!&lt;/td&gt;&lt;td&gt;已安装该应用且签名不一致&lt;/td&gt;&lt;td&gt;先卸载设备上的该应用，再安装&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;参考：&lt;a href=&quot;https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/content/pm/PackageManager.java&quot; target=&quot;_blank&quot;&gt;PackageManager.java&lt;/a&gt;
&lt;code&gt;adb install&lt;/code&gt; 实际是分三步完成：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;code&gt;push apk&lt;/code&gt; 文件到 &lt;code&gt;/data/local/tmp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;pm install&lt;/code&gt; 安装。&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;/data/local/tmp&lt;/code&gt; 下的对应 apk 文件。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.3 卸载应用&lt;a href=&quot;#433-卸载应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;卸载应用的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb uninstall [-k] &amp;lt;package-name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 表示应用的包名，-k 参数可选，表示卸载应用但保留数据和缓存目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.4 清除应用数据与缓存&lt;a href=&quot;#434-清除应用数据与缓存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm clear &amp;lt;package-name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 表示应用名包，这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.5 查看前台 Activity&lt;a href=&quot;#435-查看前台-activity&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys activity activities | grep mFocusedActivity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.6 查看正在运行的 Services&lt;a href=&quot;#436-查看正在运行的-services&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys activity services [&amp;lt;package-name&amp;gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 参数不是必须的，指定 &lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 表示查看与某个包名相关的 Services，不指定表示查看所有 Services。&lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 不一定要给出完整的包名，可以只给一部分，那么所给包名相关的 Services 都会列出来。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.7 查看应用详细信息&lt;a href=&quot;#437-查看应用详细信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys package &amp;lt;package-name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 表示应用包名。运行次命令的输出中包含很多信息，包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3.7 查看应用安装路径&lt;a href=&quot;#437-查看应用安装路径&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pm path &amp;lt;package-name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.4 与应用交互&lt;a href=&quot;#44-与应用交互&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;与应用交互主要是使用 &lt;code&gt;am &amp;lt;command&amp;gt;&lt;/code&gt; 命令，常用的 &lt;code&gt;&amp;lt;command&amp;gt;&lt;/code&gt; 如下：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;command&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;start [options] &amp;lt;intent&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动 &lt;code&gt;&amp;lt;intent&amp;gt;&lt;/code&gt; 指定的 Activity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;startservice [options] &amp;lt;intent&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;启动 &lt;code&gt;&amp;lt;intent&amp;gt;&lt;/code&gt; 指定的 Service&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;broadcast [options] &amp;lt;intent&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;发送 &lt;code&gt;&amp;lt;intent&amp;gt;&lt;/code&gt; 指定的广播&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;force-stop &amp;lt;package-name&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;停止 &lt;code&gt;&amp;lt;package-name&amp;gt;&lt;/code&gt; 相关的进程&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;&amp;lt;intent&amp;gt;&lt;/code&gt; 参数很灵活，和写 Android 程序时代码里的 Intent 相对应。
用于决定 intent 对象的选项如下：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;-a &amp;lt;action&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定 action，比如 android.intent.action.VIEW&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;-c &amp;lt;category&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定 category，比如 android.intent.category.APP_CONTACTS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;-n &amp;lt;component&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指定完整 component 名，用于明确指定启动哪个 Activity&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;&amp;lt;intent&amp;gt;&lt;/code&gt; 里还能带数据，就像写代码时的 Bundle 一样：&lt;/p&gt;
















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--esn &amp;lt;extra-key&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;null 值(只有 key 名)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;`-e&lt;/td&gt;&lt;td&gt;—es  `&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ez &amp;lt;extra-key&amp;gt; &amp;lt;extra-boolean-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;boolean 值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ei &amp;lt;extra-key&amp;gt; &amp;lt;extra-int-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;integer 值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--el &amp;lt;extra-key&amp;gt; &amp;lt;extra-long-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;long 值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ef &amp;lt;extra-key&amp;gt; &amp;lt;extra-float-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;float 值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--eu &amp;lt;extra-key&amp;gt; &amp;lt;extra-uri-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;URI&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ecn &amp;lt;extra-key&amp;gt; &amp;lt;extra-component-name-value&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;component name&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--eia &amp;lt;extra-key&amp;gt; &amp;lt;extra-int-value&amp;gt;[,&amp;lt;extra-int-value...]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;integer 数组&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--ela &amp;lt;extra-key&amp;gt; &amp;lt;extra-long-value&amp;gt;[,&amp;lt;extra-long-value...]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;long 数组&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&gt;&lt;h3&gt;4.4.1 启动应用/ 调起 Activity&lt;a href=&quot;#441-启动应用-调起-activity&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am start [options] &amp;lt;intent&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am start -a android.settings.SETTINGS                   # 打开系统设置页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am start -a android.intent.action.DIAL -d tel:10086     # 打开拨号页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am start -n com.android.mms/.ui.ConversationList        # 打开短信会话列表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;options 是一些改变其行为的选项，支持的可选参数及含义如下：&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;选项&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-D&lt;/td&gt;&lt;td&gt;启用调试&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-W&lt;/td&gt;&lt;td&gt;等待启动完成&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–start-profiler file&lt;/td&gt;&lt;td&gt;启动分析器并将结果发送到 file&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-P file&lt;/td&gt;&lt;td&gt;类似于 —start-profiler，但当应用进入空闲状态时分析停止&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-R count&lt;/td&gt;&lt;td&gt;重复 Activity 启动次数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-S&lt;/td&gt;&lt;td&gt;启动 Activity 前强行停止目标应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–opengl-trace&lt;/td&gt;&lt;td&gt;启用 OpenGL 函数的跟踪&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–user user_id&lt;/td&gt;&lt;td&gt;current&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4.2 调起 Service&lt;a href=&quot;#442-调起-service&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am startservice [options] &amp;lt;intent&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示，可以试试这个：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am startservice -n com.android.systemui/.SystemUIService&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4.3 停止 Service&lt;a href=&quot;#443-停止-service&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am stopservice [options] &amp;lt;intent&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4.4 发送广播&lt;a href=&quot;#444-发送广播&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am broadcast [options] &amp;lt;INTENT&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;可以向所有组件广播，也可以只向指定组件广播。
例如，向所有组件广播 &lt;code&gt;BOOT_COMPLETED&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am broadcast -a android.intent.action.BOOT_COMPLETED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;又例如，只向 &lt;code&gt;com.android.receiver.test/.BootCompletedReceiver&lt;/code&gt; 广播 &lt;code&gt;BOOT_COMPLETED&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这类用法在测试的时候很实用，比如某个广播的场景很难制造，可以考虑通过这种方式来发送广播。
既能发送系统预定义的广播，也能发送自定义广播。如下是部分系统预定义广播及正常触发时机：&lt;/p&gt;
































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;action&lt;/th&gt;&lt;th&gt;触发时机&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;android.net.conn.CONNECTIVITY_CHANGE&lt;/td&gt;&lt;td&gt;网络连接发生变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.SCREEN_ON&lt;/td&gt;&lt;td&gt;屏幕点亮&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.SCREEN_OFF&lt;/td&gt;&lt;td&gt;屏幕熄灭&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.BATTERY_LOW&lt;/td&gt;&lt;td&gt;电量低，会弹出电量低提示框&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.BATTERY_OKAY&lt;/td&gt;&lt;td&gt;电量恢复了&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.BOOT_COMPLETED&lt;/td&gt;&lt;td&gt;设备启动完毕&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.DEVICE_STORAGE_LOW&lt;/td&gt;&lt;td&gt;存储空间过低&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.DEVICE_STORAGE_OK&lt;/td&gt;&lt;td&gt;存储空间恢复&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.PACKAGE_ADDED&lt;/td&gt;&lt;td&gt;安装了新的应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.net.wifi.STATE_CHANGE&lt;/td&gt;&lt;td&gt;WiFi连接状态发生变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.net.wifi.WIFI_STATE_CHANGED&lt;/td&gt;&lt;td&gt;WiFi状态变为启用/关闭/正在启动/正在关闭/未知&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.BATTERY_CHANGED&lt;/td&gt;&lt;td&gt;电池电量发生变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.INPUT_METHOD_CHANGED&lt;/td&gt;&lt;td&gt;系统输入法发生变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.ACTION_POWER_CONNECTED&lt;/td&gt;&lt;td&gt;外部电源连接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.ACTION_POWER_DISCONNECTED&lt;/td&gt;&lt;td&gt;外部电源断开连接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.DREAMING_STARTED&lt;/td&gt;&lt;td&gt;系统开始休眠&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.DREAMING_STOPPED&lt;/td&gt;&lt;td&gt;系统停止休眠&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.WALLPAPER_CHANGED&lt;/td&gt;&lt;td&gt;壁纸发生变化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.HEADSET_PLUG&lt;/td&gt;&lt;td&gt;插入耳机&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.MEDIA_UNMOUNTED&lt;/td&gt;&lt;td&gt;卸载外部介质&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.intent.action.MEDIA_MOUNTED&lt;/td&gt;&lt;td&gt;挂载外部介质&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;android.os.action.POWER_SAVE_MODE_CHANGED&lt;/td&gt;&lt;td&gt;省电模式开启&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;（以上广播均可使用 adb 触发）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4.5 强制停止应用&lt;a href=&quot;#445-强制停止应用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am force-stop &amp;lt;packagename&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4.6 收紧内存&lt;a href=&quot;#446-收紧内存&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell am send-trim-memory  &amp;lt;pid&amp;gt; &amp;lt;level&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;pid: 进程 ID&lt;/li&gt;
&lt;li&gt;level、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.5 文件管理&lt;a href=&quot;#45-文件管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.5.1 从模拟器/设备下载指定的文件到计算机&lt;a href=&quot;#451-从模拟器设备下载指定的文件到计算机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;从模拟器/设备下载指定的文件到计算机的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb pull &amp;lt;remote&amp;gt; [local]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;remote: 模拟器/设备里的文件路径&lt;/li&gt;
&lt;li&gt;local:计算机上的目录，参数可以省略，默认复制到当前目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;例如，将 &lt;code&gt;/sdcard/music.mp4&lt;/code&gt; 下载到计算机的当前目录：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb pull /sdcard/music.mp4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;将 &lt;code&gt;/sdcard/music.mp4&lt;/code&gt; 下载到计算机的当前目录(目录需存在)：&lt;/p&gt;&lt;p&gt;adb pull /sdcard/music.mp4 D:\Download&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.2 将指定的文件从计算机上传到模拟器/设备&lt;a href=&quot;#452-将指定的文件从计算机上传到模拟器设备&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将指定的文件从计算机上传到模拟器/设备的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb push &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;local:计算机上的文件路径&lt;/li&gt;
&lt;li&gt;remote: 模拟器/设备里的目录&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;例如，将 &lt;code&gt;D:\Download\music.mp4&lt;/code&gt; 下载到设备的&lt;code&gt;/sdcard/music/&lt;/code&gt;目录：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb push D:\Download\music.mp4 /sdcard/music/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.4 列出指定目录的内容&lt;a href=&quot;#454-列出指定目录的内容&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;列出模拟器/设备上指定目录的内容的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ls [options] &amp;lt;directory&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;directory&amp;gt;&lt;/code&gt; 表示指定目录，可以省略，表示列出根目录下的所有文件和目录。
&lt;code&gt;adb shell ls&lt;/code&gt; 后面可以跟一些可选参数进行过滤查看不同的列表，可用参数及含义如下：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;显示列表&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;列出目录下的所有文件和目录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-a&lt;/td&gt;&lt;td&gt;列出目录下的所有文件(包括隐藏的)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-i&lt;/td&gt;&lt;td&gt;列出目录下的所有文件和索引编号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s&lt;/td&gt;&lt;td&gt;列出目录下的所有文件和文件大小&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-n&lt;/td&gt;&lt;td&gt;列出目录下的所有文件及其 UID和 GID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-R&lt;/td&gt;&lt;td&gt;列出目录下的所有子目录中的文件&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.5 切换到目标目录&lt;a href=&quot;#455-切换到目标目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cd &amp;lt;directory&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;cd &amp;lt;directory&amp;gt;&lt;/code&gt;命令切换到目标目录。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.6 删除文件或目录&lt;a href=&quot;#456-删除文件或目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell rm [options] &amp;lt;files or directory&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;rm [options] &amp;lt;files or directory&amp;gt;&lt;/code&gt;命令删除文件或目录。
rm 后面可以跟一些可选参数进行不同的操作，可用参数及含义如下：&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;删除文件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-f&lt;/td&gt;&lt;td&gt;强制删除文件，系统不提示&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-r&lt;/td&gt;&lt;td&gt;强制删除指定目录中的所有文件和子目录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-d&lt;/td&gt;&lt;td&gt;删除指定目录，即使它是一个非空目录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-i&lt;/td&gt;&lt;td&gt;交互式删除，删除前提示&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;code&gt;rm -d&lt;/code&gt; 等同于 &lt;code&gt;rmdir&lt;/code&gt; 命令，有些版本不包含-d 参数。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.7 创建目录&lt;a href=&quot;#457-创建目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell mkdir [options] &amp;lt;directory-name&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;mkdir [options] &amp;lt;directory-name&amp;gt;&lt;/code&gt;命令创建目录。
&lt;code&gt;mkdir&lt;/code&gt; 后面可以跟一些可选参数进行不同的操作，可用参数及含义如下：&lt;/p&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;创建指定目录&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-m&lt;/td&gt;&lt;td&gt;创建指定目录并赋予读写权限&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-p&lt;/td&gt;&lt;td&gt;创建指定目录及其父目录&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.8 创建空文件或改变文件时间戳&lt;a href=&quot;#458-创建空文件或改变文件时间戳&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell touch [options] &amp;lt;file&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;touch [options] &amp;lt;file&amp;gt;&lt;/code&gt;命令创建空文件或改变文件时间戳。
可通过&lt;code&gt;ls -n &amp;lt;directory&amp;gt;&lt;/code&gt; 命令查看文件的时间。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.9 输出当前目录路径&lt;a href=&quot;#459-输出当前目录路径&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell pwd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行pwd命令输出当前目录路径。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.10 复制文件和目录&lt;a href=&quot;#4510-复制文件和目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cp [options] &amp;lt;source&amp;gt; &amp;lt;dest&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;cp [options] &amp;lt;source&amp;gt; &amp;lt;dest&amp;gt;&lt;/code&gt;命令复制文件和目录。
参数说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;source:源文件路径&lt;/li&gt;
&lt;li&gt;dest: 目标文件路径&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5.11 移动或重命名文件&lt;a href=&quot;#4511-移动或重命名文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell mv [options] &amp;lt;source&amp;gt; &amp;lt;dest&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第一步：执行&lt;code&gt;adb shell&lt;/code&gt;命令；
第二步：执行&lt;code&gt;mv [options] &amp;lt;source&amp;gt; &amp;lt;dest&amp;gt;&lt;/code&gt;命令移动或重命名文件。
参数说明：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;source:源文件路径&lt;/li&gt;
&lt;li&gt;dest: 目标文件路径&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.6 网络管理&lt;a href=&quot;#46-网络管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.6.1 查看网络统计信息&lt;a href=&quot;#461-查看网络统计信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell netstat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;也可以将网络统计信息输出到指定文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell netstat&amp;gt;&amp;lt;file-path&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;例如，可以通过 &lt;code&gt;adb shell netstat&amp;gt;D:\netstat.log&lt;/code&gt; 将日志输出到 &lt;code&gt;D:\netstat.log&lt;/code&gt; 中。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.6.2 测试两个网络间的连接和延迟&lt;a href=&quot;#462-测试两个网络间的连接和延迟&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ping 命令的格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[-w deadline] [-W timeout] [hop1 ...] destination&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1234&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;例如，ping一个域名：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ping www.google.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;不结束的话会一直ping下去，可以按 Ctrl + C 停止ping操作。
也可以指定ping的次数：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ping -c 4 www.google.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.6.3 通过配置文件配置和管理网络连接&lt;a href=&quot;#463-通过配置文件配置和管理网络连接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;netcfg 命令的格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell netcfg [&amp;lt;interface&amp;gt; {dhcp|up|down}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_ims10 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_ims00 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun04 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun03 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun02 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun01 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun00 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun14 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun13 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun12 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun11 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_tun10 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet1   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet0   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet4   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet3   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet2   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet6   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet5   DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dummy0   UP                                     0.0.0.0/0   0x000000c3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_r_ims10 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_r_ims00 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmnet_emc0 DOWN                                   0.0.0.0/0   0x00001002&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;lo       UP                                   127.0.0.1/8   0x00000049&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sit0     DOWN                                   0.0.0.0/0   0x00000080&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wlan0    UP                                 10.0.38.176/23  0x00001043&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1234567891011121314151617181920212223242526&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.6.4 显示、操作路由、设备、策略路由和隧道&lt;a href=&quot;#464-显示操作路由设备策略路由和隧道&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;ip 命令的格式如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ip [ options ] object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;options := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve]
|-f[amily] { inet | inet6 | ipx | dnet | link } |-l[oops] {
maximum-addr-flush-attempts } |-o[neline] | -t[imestamp] | -b[atch]
[filename] |-rc[vbuf] [size]}&lt;/li&gt;
&lt;li&gt;object := { link | addr | addrlabel | route | rule | neigh | ntable
|tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |netns |
l2tp }&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;options 是一些修改ip行为或者改变其输出的选项。所有的选项都是以-字符开头，分为长、短两种形式，支持的可选参数及含义如下：&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;选项&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-V,-Version&lt;/td&gt;&lt;td&gt;打印ip的版本并退出&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s,-stats,-statistics&lt;/td&gt;&lt;td&gt;输出更为详尽的信息(如果这个选项出现两次或者多次，输出的信息将更为详尽)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-f,-family&lt;/td&gt;&lt;td&gt;强调使用的协议种类(包括：inet、inet6或者link)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-4&lt;/td&gt;&lt;td&gt;是-family inet的简写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-6&lt;/td&gt;&lt;td&gt;是-family inet6的简写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-0&lt;/td&gt;&lt;td&gt;是-family link的简写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-o,-oneline&lt;/td&gt;&lt;td&gt;对每行记录都使用单行输出，回行用字符代替&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-r,-resolve&lt;/td&gt;&lt;td&gt;查询域名解析系统，用获得的主机名代替主机IP地址&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;object 是你要管理或者获取信息的对象。目前ip认识的对象包括：&lt;/p&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;显示列表&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;link&lt;/td&gt;&lt;td&gt;网络设备&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;address&lt;/td&gt;&lt;td&gt;一个设备的协议(IP或者IPV6)地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;neighbour&lt;/td&gt;&lt;td&gt;ARP或者NDISC缓冲区条目&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;route&lt;/td&gt;&lt;td&gt;路由表条目&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rule&lt;/td&gt;&lt;td&gt;路由策略数据库中的规则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;maddress&lt;/td&gt;&lt;td&gt;多播地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mroute&lt;/td&gt;&lt;td&gt;多播路由缓冲区条目&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tuntap&lt;/td&gt;&lt;td&gt;管理 TUN/TAP 设备&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;netns&lt;/td&gt;&lt;td&gt;管理网络空间&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;例如，查看 WiFi IP 地址：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ip -f inet addr show wlan0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.7 模拟按键/输入&lt;a href=&quot;#47-模拟按键输入&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在 &lt;code&gt;adb shell&lt;/code&gt; 里有个很实用的命令叫 input，通过它可以做一些有趣的事情。
可以执行&lt;code&gt;adb shell input&lt;/code&gt;命令查看完整 help 信息如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: input [&amp;lt;source&amp;gt;] &amp;lt;command&amp;gt; [&amp;lt;arg&amp;gt;...]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The sources are:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dpad&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keyboard&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mouse&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;touchpad&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;gamepad&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;touchnavigation&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;joystick&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;touchscreen&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;stylus&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;trackball&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;The commands and default sources are:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;text &amp;lt;string&amp;gt; (Default: touchscreen)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;keyevent [--longpress] &amp;lt;key code number or name&amp;gt; ... (Default: keyboard)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;tap &amp;lt;x&amp;gt; &amp;lt;y&amp;gt; (Default: touchscreen)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;swipe &amp;lt;x1&amp;gt; &amp;lt;y1&amp;gt; &amp;lt;x2&amp;gt; &amp;lt;y2&amp;gt; [duration(ms)] (Default: touchscreen)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;draganddrop &amp;lt;x1&amp;gt; &amp;lt;y1&amp;gt; &amp;lt;x2&amp;gt; &amp;lt;y2&amp;gt; [duration(ms)] (Default: touchscreen)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;press (Default: trackball)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;roll &amp;lt;dx&amp;gt; &amp;lt;dy&amp;gt; (Default: trackball)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1234567891011121314151617181920212223&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;比如使用 &lt;code&gt;adb shell input keyevent &amp;lt;keycode&amp;gt;&lt;/code&gt; 命令，不同的 keycode 能实现不同的功能，完整的 keycode 列表详见 &lt;a href=&quot;https://developer.android.com/reference/android/view/KeyEvent&quot; target=&quot;_blank&quot;&gt;KeyEvent&lt;/a&gt;，摘引部分我觉得有意思的如下：&lt;/p&gt;




































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;keycode&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;HOME 键&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;返回键&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;打开拨号应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;挂断电话&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;增加音量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;降低音量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;电源键&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;27&lt;/td&gt;&lt;td&gt;拍照（需要在相机应用里）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;打开浏览器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;菜单键&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;85&lt;/td&gt;&lt;td&gt;播放/暂停&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;86&lt;/td&gt;&lt;td&gt;停止播放&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;87&lt;/td&gt;&lt;td&gt;播放下一首&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;88&lt;/td&gt;&lt;td&gt;播放上一首&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;122&lt;/td&gt;&lt;td&gt;移动光标到行首或列表顶部&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;123&lt;/td&gt;&lt;td&gt;移动光标到行末或列表底部&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;126&lt;/td&gt;&lt;td&gt;恢复播放&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;127&lt;/td&gt;&lt;td&gt;暂停播放&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;164&lt;/td&gt;&lt;td&gt;静音&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;176&lt;/td&gt;&lt;td&gt;打开系统设置&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;187&lt;/td&gt;&lt;td&gt;切换应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;207&lt;/td&gt;&lt;td&gt;打开联系人&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;208&lt;/td&gt;&lt;td&gt;打开日历&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;209&lt;/td&gt;&lt;td&gt;打开音乐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;210&lt;/td&gt;&lt;td&gt;打开计算器&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;220&lt;/td&gt;&lt;td&gt;降低屏幕亮度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;221&lt;/td&gt;&lt;td&gt;提高屏幕亮度&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;223&lt;/td&gt;&lt;td&gt;系统休眠&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;224&lt;/td&gt;&lt;td&gt;点亮屏幕&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;231&lt;/td&gt;&lt;td&gt;打开语音助手&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;276&lt;/td&gt;&lt;td&gt;如果没有 wakelock 则让系统休眠&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;下面是 &lt;code&gt;input&lt;/code&gt; 命令的一些用法举例。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;4.7.1 电源键&lt;a href=&quot;#471-电源键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 26&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;执行效果相当于按电源键。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.2 菜单键&lt;a href=&quot;#472-菜单键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 82&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.3 HOME 键&lt;a href=&quot;#473-home-键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.4 返回键&lt;a href=&quot;#474-返回键&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.5 音量控制&lt;a href=&quot;#475-音量控制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;增加音量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 24&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;降低音量：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 25&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;静音：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 164&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.6 媒体控制&lt;a href=&quot;#476-媒体控制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;播放/暂停：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 85&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;停止播放：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 86&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;播放下一首：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 87&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;播放上一首：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 88&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;恢复播放：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 126&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;暂停播放：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 127&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.7 点亮/熄灭屏幕&lt;a href=&quot;#477-点亮熄灭屏幕&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;点亮屏幕：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 224&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;熄灭屏幕：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input keyevent 223&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.8 滑动解锁&lt;a href=&quot;#478-滑动解锁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果锁屏没有密码，是通过滑动手势解锁，那么可以通过 input swipe 来解锁。
命令（参数以机型 Nexus 5，向上滑动手势解锁举例）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input swipe 300 1000 300 500&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.7.9 输入文本&lt;a href=&quot;#479-输入文本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在焦点处于某文本框时，可以通过 input 命令来输入文本。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell input text hello&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8 日志打印&lt;a href=&quot;#48-日志打印&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Android 系统的日志分为两部分，底层的 Linux 内核日志输出到 /proc/kmsg，Android 的日志输出到 /dev/log。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1 Android 日志&lt;a href=&quot;#481-android-日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;查看 Android 设备系统属性的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat [option] [filter-specs]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果需要停止 logcat 日志打印，可以按 Ctrl + C 停止日志监控。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.1 按级别过滤日志&lt;a href=&quot;#4811-按级别过滤日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;按级别过滤日志的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat [filter-specs]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Android 的日志分为如下几个优先级（priority）：&lt;/p&gt;




































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;级别&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;过滤只显示 Verbose 及以上级别(优先级最低)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*:&lt;code&gt;D&lt;/code&gt;&lt;/td&gt;&lt;td&gt;过滤只显示 Debug 及以上级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;i&gt;&lt;/i&gt;&lt;/td&gt;&lt;td&gt;过滤只显示 Info 及以上级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;过滤只显示 Warning 及以上级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;过滤只显示 Error 及以上级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;过滤只显示 Fatal 及以上级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;s&gt;&lt;/s&gt;&lt;/td&gt;&lt;td&gt;过滤只显示 Silent 及以上级别(优先级最高，什么也不输出)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;按某级别过滤日志则会将该级别及以上的日志输出。
比如，命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat *:W&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;会将 Warning、Error、Fatal 和 Silent 日志输出。
（注： 在 macOS 下需要给 * 这样以 * 作为 tag 的参数加双引号，如 &lt;code&gt;adb logcat &quot;*:W&quot;&lt;/code&gt;，不然会报错 &lt;code&gt;no matches found: *:W&lt;/code&gt;。）&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.2 按 tag 和级别过滤日志&lt;a href=&quot;#4812-按-tag-和级别过滤日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;按 tag 和级别过滤日志的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat [tag:level] [tag:level] ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;比如，命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat ActivityManager:I MyApp:D *:S&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示输出 tag ActivityManager 的 Info 以上级别日志，输出 tag MyApp 的 Debug 以上级别日志，及其它 tag 的 Silent 级别日志（即屏蔽其它 tag 日志）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.3 将日志格式化输出&lt;a href=&quot;#4813-将日志格式化输出&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以用 &lt;code&gt;adb logcat -v &amp;lt;format&amp;gt;&lt;/code&gt; 选项指定日志输出格式。
日志支持按以下几种 &lt;code&gt;&amp;lt;format&amp;gt;&lt;/code&gt;：&lt;/p&gt;




































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;显示格式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;brief&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;priority&amp;gt;/&amp;lt;tag&amp;gt;(&amp;lt;pid&amp;gt;): &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;process&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;priority&amp;gt;(&amp;lt;pid&amp;gt;) &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;tag&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;priority&amp;gt;/&amp;lt;tag&amp;gt;: &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;raw&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;time&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;datetime&amp;gt; &amp;lt;priority&amp;gt;/&amp;lt;tag&amp;gt;(&amp;lt;pid&amp;gt;): &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;threadtime&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;datetime&amp;gt; &amp;lt;pid&amp;gt; &amp;lt;tid&amp;gt; &amp;lt;priority&amp;gt; &amp;lt;tag&amp;gt;: &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;long&lt;/td&gt;&lt;td&gt;&lt;code&gt;[ &amp;lt;datetime&amp;gt; &amp;lt;pid&amp;gt;:&amp;lt;tid&amp;gt; &amp;lt;priority&amp;gt;/&amp;lt;tag&amp;gt; ] &amp;lt;message&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;日志格式默认为 brief，指定格式可与上面的过滤同时使用。比如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -v long ActivityManager:I *:S&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.3 清空已存在的日志&lt;a href=&quot;#4813-清空已存在的日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.4 将日志显示在控制台&lt;a href=&quot;#4814-将日志显示在控制台&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.5 将日志输出到文件&lt;a href=&quot;#4815-将日志输出到文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -f &amp;lt;file-path&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.6 加载一个可使用的日志缓冲区供查看&lt;a href=&quot;#4816-加载一个可使用的日志缓冲区供查看&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -b &amp;lt;Buffer&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Android log 输出量巨大，特别是通信系统的log，因此，Android把log输出到不同的缓冲区中，目前定义了四个log缓冲区：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;缓冲区&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Radio&lt;/td&gt;&lt;td&gt;输出通信系统的 log&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;System&lt;/td&gt;&lt;td&gt;输出系统组件的 log&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Event&lt;/td&gt;&lt;td&gt;输出 event 模块的 log&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Main&lt;/td&gt;&lt;td&gt;所有 java 层的 log 以及不属于上面3层的 log&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;缓冲区主要给系统组件使用，一般的应用不需要关心，应用的log都输出到main缓冲区中。默认log输出（不指定缓冲区的情况下）是输出System和Main缓冲区的log。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.1.7 打印指定日志缓冲区的大小&lt;a href=&quot;#4817-打印指定日志缓冲区的大小&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb logcat -g&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.8.2 内核日志&lt;a href=&quot;#482-内核日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dmesg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.684016] PM: noirq resume of devices complete after 0.982 msecs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.685525] PM: early resume of devices complete after 0.838 msecs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.753642] PM: resume of devices complete after 68.106 msecs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;4&amp;gt;[14201.755954] Restarting tasks ... done.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;6&amp;gt;[14201.872498] PM: Syncing filesystems ... done.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1234567&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;中括号里的 [14201.684016] 代表内核开始启动后的时间，单位为秒。
通过内核日志我们可以做一些事情，比如衡量内核启动时间，在系统启动完毕后的内核日志里找到 &lt;code&gt;Freeing init memory&lt;/code&gt; 那一行前面的时间就是。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9 查看 Android 设备系统属性&lt;a href=&quot;#49-查看-android-设备系统属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;查看 Android 设备系统属性的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell getprop [options]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;除了可以查看 Android 设备系统属性之外，还可以设置系统属性，设置系统属性的基本命令格式是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell setprop &amp;lt;key&amp;gt; &amp;lt;value&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.1 查看设备型号&lt;a href=&quot;#491-查看设备型号&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell getprop ro.product.model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Nexus 5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.2 查看设备电池状况&lt;a href=&quot;#492-查看设备电池状况&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys battery&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Current Battery Service state:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;AC powered: false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;USB powered: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Wireless powered: false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;status: 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;health: 2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;present: true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;level: 44&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;scale: 100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;voltage: 3872&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;temperature: 280&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;technology: Li-poly&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123456789101112&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中 scale 代表最大电量，level 代表当前电量。上面的输出表示还剩下 44% 的电量。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.3 查看设备屏幕分辨率&lt;a href=&quot;#493-查看设备屏幕分辨率&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm size&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Physical size: 1080x1920&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;该设备屏幕分辨率为 1080px * 1920px。
如果使用命令修改过，那输出可能是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Physical size: 1080x1920&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Override size: 480x1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表明设备的屏幕分辨率原本是 1080px * 1920px，当前被修改为 480px * 1024px。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.4 查看设备屏幕密度&lt;a href=&quot;#494-查看设备屏幕密度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm density&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Physical density: 420&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;该设备屏幕密度为 420dpi。
如果使用命令修改过，那输出可能是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Physical density: 480&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Override density: 160&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表明设备的屏幕密度原来是 480dpi，当前被修改为 160dpi。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.5 查看设备显示屏参数&lt;a href=&quot;#495-查看设备显示屏参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys window displays&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Display: mDisplayId=0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;deferred=false layoutNeeded=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1234&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中 mDisplayId 为 显示屏编号，init 是初始分辨率和屏幕密度，app 的高度比 init 里的要小，表示屏幕底部有虚拟按键，高度为 1920 - 1794 = 126px 合 42dp。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.6 查看设备 android_id&lt;a href=&quot;#496-查看设备-android_id&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings get secure android_id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;51b6be48bac8c569&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.7 查看设备IMEI&lt;a href=&quot;#497-查看设备imei&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 Android 4.4 及以下版本可通过如下命令获取 IMEI：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell dumpsys iphonesubinfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Phone Subscriber Info:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Phone Type = GSM&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Device ID = 860955027785041&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中的 Device ID 就是 IMEI。
而在 Android 5.0 及以上版本里这个命令输出为空，得通过其它方式获取了（需要 root 权限）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;service call iphonesubinfo 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;把里面的有效内容提取出来就是 IMEI 了，比如这里的是 860955027785041。
参考：&lt;a href=&quot;https://stackoverflow.com/questions/27002663/adb-shell-dumpsys-iphonesubinfo-not-working-since-android-5-0-lollipop&quot; target=&quot;_blank&quot;&gt;adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.8 查看设备 Android 系统版本&lt;a href=&quot;#498-查看设备-android-系统版本&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell getprop ro.build.version.release&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5.0.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.9 查看设备 IP 地址&lt;a href=&quot;#499-查看设备-ip-地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ifconfig | grep Mask&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;在有的设备上这个命令没有输出，如果设备连着 WiFi，可以使用如下命令来查看局域网 IP：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ifconfig wlan0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果以上命令仍然不能得到期望的信息，那可以试试以下命令（部分系统版本里可用）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell netcfg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.10 查看设备 Mac 地址&lt;a href=&quot;#4910-查看设备-mac-地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cat /sys/class/net/wlan0/address&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;f8:a9:d0:17:42:4d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这查看的是局域网 Mac 地址，移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 &lt;code&gt;adb shell netcfg&lt;/code&gt; 命令来查看。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.11 查看设备 CPU 信息&lt;a href=&quot;#4911-查看设备-cpu-信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cat /proc/cpuinfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.9.12 查看设备内存信息&lt;a href=&quot;#4912-查看设备内存信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cat /proc/meminfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.9.13 查看设备更多硬件与系统属性&lt;a href=&quot;#4913-查看设备更多硬件与系统属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;设备的更多硬件与系统属性可以通过如下命令查看：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cat /system/build.prop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这会输出很多信息，包括前面几个小节提到的「型号」和「Android 系统版本」等。
输出里还包括一些其它有用的信息，它们也可通过 &lt;code&gt;adb shell getprop &amp;lt;属性名&amp;gt;&lt;/code&gt; 命令单独查看，列举一部分属性如下：&lt;/p&gt;




















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;属性名&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;ro.build.version.sdk&lt;/td&gt;&lt;td&gt;SDK 版本&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.build.version.release&lt;/td&gt;&lt;td&gt;Android 系统版本&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.build.version.security_patch&lt;/td&gt;&lt;td&gt;Android 安全补丁程序级别&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.product.model&lt;/td&gt;&lt;td&gt;型号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.product.brand&lt;/td&gt;&lt;td&gt;品牌&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.product.name&lt;/td&gt;&lt;td&gt;设备名&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.product.board&lt;/td&gt;&lt;td&gt;处理器型号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.product.cpu.abilist&lt;/td&gt;&lt;td&gt;CPU 支持的 abi 列表[节注一]&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;persist.sys.isUsbOtgEnabled&lt;/td&gt;&lt;td&gt;是否支持 OTG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;dalvik.vm.heapsize&lt;/td&gt;&lt;td&gt;每个应用程序的内存上限&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ro.sf.lcd_density&lt;/td&gt;&lt;td&gt;屏幕密度&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;节注一：
一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名，如果用 &lt;code&gt;ro.product.cpu.abilist&lt;/code&gt; 属性名查找不到，可以这样试试：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell cat /system/build.prop | grep ro.product.cpu.abi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;示例输出：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ro.product.cpu.abi=armeabi-v7a&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ro.product.cpu.abi2=armeabi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;4.10 修改设置&lt;a href=&quot;#410-修改设置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注： 修改设置之后，运行恢复命令有可能显示仍然不太正常，可以运行 &lt;code&gt;adb reboot&lt;/code&gt; 重启设备，或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.1 修改分辨率&lt;a href=&quot;#4101-修改分辨率&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm size 480x1024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示将分辨率修改为 480px * 1024px。
恢复原分辨率命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm size reset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.2 修改屏幕密度&lt;a href=&quot;#4102-修改屏幕密度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm density 160&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示将屏幕密度修改为 160dpi。
恢复原屏幕密度命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm density reset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.3 修改显示区域&lt;a href=&quot;#4103-修改显示区域&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm overscan 0,0,0,200&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;四个数字分别表示距离左、上、右、下边缘的留白像素，以上命令表示将屏幕底部 200px 留白。
恢复原显示区域命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell wm overscan reset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.4 修改关闭 USB 调试模式&lt;a href=&quot;#4104-修改关闭-usb-调试模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global adb_enabled 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;用命令恢复不了了，毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。
去设备上手动恢复吧：「设置」-「开发者选项」-「Android 调试」。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.5 修改允许/禁止访问非 SDK API&lt;a href=&quot;#4105-修改允许禁止访问非-sdk-api&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;允许访问非 SDK API：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global hidden_api_policy_pre_p_apps 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global hidden_api_policy_p_apps 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;禁止访问非 SDK API：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings delete global hidden_api_policy_pre_p_apps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings delete global hidden_api_policy_p_apps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;不需要设备获得 Root 权限。
命令最后的数字的含义：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;值&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;禁止检测非 SDK 接口的调用。该情况下，日志记录功能被禁用，并且令 strict mode API，即 detectNonSdkApiUsage() 无效。不推荐。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;仅警告——允许访问所有非 SDK 接口，但保留日志中的警告信息，可继续使用 strick mode API。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;禁止调用深灰名单和黑名单中的接口。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;禁止调用黑名单中的接口，但允许调用深灰名单中的接口。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.10.6 修改状态栏和导航栏的显示隐藏&lt;a href=&quot;#4106-修改状态栏和导航栏的显示隐藏&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global policy_control &amp;lt;key-values&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;&amp;lt;key-values&amp;gt;&lt;/code&gt; 可由如下几种键及其对应的值组成，格式为 &lt;code&gt;&amp;lt;key1&amp;gt;=&amp;lt;value1&amp;gt;:&amp;lt;key2&amp;gt;=&amp;lt;value2&amp;gt;&lt;/code&gt;。&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;immersive.full&lt;/td&gt;&lt;td&gt;同时隐藏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;immersive.status&lt;/td&gt;&lt;td&gt;隐藏状态栏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;immersive.navigation&lt;/td&gt;&lt;td&gt;隐藏导航栏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;immersive.preconfirms&lt;/td&gt;&lt;td&gt;?&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;这些键对应的值可则如下值用逗号组合：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;value&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;apps&lt;/td&gt;&lt;td&gt;所有应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;*&lt;/td&gt;&lt;td&gt;所有界面&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;package-name&lt;/td&gt;&lt;td&gt;指定应用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-package-name&lt;/td&gt;&lt;td&gt;排除指定应用&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;例如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global policy_control immersive.full=*&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示设置在所有界面下都同时隐藏状态栏和导航栏。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示设置在包名为 &lt;code&gt;com.package1&lt;/code&gt; 和 &lt;code&gt;com.package2&lt;/code&gt; 的应用里隐藏状态栏，在除了包名为 &lt;code&gt;com.package3&lt;/code&gt; 的所有应用里隐藏导航栏。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.11 实用功能&lt;a href=&quot;#411-实用功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.11.1 屏幕截图&lt;a href=&quot;#4111-屏幕截图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;截图保存到电脑：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb exec-out screencap -p &amp;gt; sc.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果 adb 版本较老，无法使用 &lt;code&gt;exec-out&lt;/code&gt; 命令，这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法：
先截图保存到设备里：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell screencap -p /sdcard/sc.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后将 png 文件导出到电脑：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb pull /sdcard/sc.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;可以使用 &lt;code&gt;adb shell screencap -h&lt;/code&gt; 查看 &lt;code&gt;screencap&lt;/code&gt; 命令的帮助信息，下面是两个有意义的参数及含义：&lt;/p&gt;
















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-p&lt;/td&gt;&lt;td&gt;指定保存文件为 png 格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-d display-id&lt;/td&gt;&lt;td&gt;指定截图的显示屏编号（有多显示屏的情况下）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;实测如果指定文件名以 .png 结尾时可以省略 -p 参数；否则需要使用 -p 参数。如果不指定文件名，截图文件的内容将直接输出到 stdout。
另外一种一行命令截图并保存到电脑的方法：
Linux 和 Windows&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell screencap -p | sed &quot;s/\r$//&quot; &amp;gt; sc.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Mac OS X&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell screencap -p | gsed &quot;s/\r$//&quot; &amp;gt; sc.png&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这个方法需要用到 &lt;code&gt;gnu sed&lt;/code&gt; 命令，在 Linux 下直接就有，在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令，可以下载 &lt;a href=&quot;http://gnuwin32.sourceforge.net/packages/sed.htm&quot; target=&quot;_blank&quot;&gt;sed for Windows&lt;/a&gt; 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。
而在 Mac 下使用系统自带的 sed 命令会报错：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sed: RE error: illegal byte sequence&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;需要安装 gnu-sed，然后使用 gsed 命令：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;brew install gnu-sed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.2 录制屏幕&lt;a href=&quot;#4112-录制屏幕&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;录制屏幕以 mp4 格式保存到 /sdcard：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell screenrecord /sdcard/filename.mp4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;需要停止时按 Ctrl-C，默认录制时间和最长录制时间都是 180 秒。
如果需要导出到电脑：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb pull /sdcard/filename.mp4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;可以使用 &lt;code&gt;adb shell screenrecord --help&lt;/code&gt; 查看 &lt;code&gt;screenrecord&lt;/code&gt; 命令的帮助信息，下面是常见参数及含义：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;–size WIDTHxHEIGHT&lt;/td&gt;&lt;td&gt;视频的尺寸，比如 1280x720，默认是屏幕分辨率。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–bit-rate RATE&lt;/td&gt;&lt;td&gt;视频的比特率，默认是 4Mbps。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–time-limit TIME&lt;/td&gt;&lt;td&gt;录制时长，单位秒。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;–verbose&lt;/td&gt;&lt;td&gt;输出更多信息。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.3 查看连接过的 WiFi 密码&lt;a href=&quot;#4113-查看连接过的-wifi-密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注：需要 root 权限。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat /data/misc/wifi/*.conf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.4 设置系统日期和时间&lt;a href=&quot;#4114-设置系统日期和时间&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注：需要 root 权限。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;date -s 20160823.131500&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.5 重启手机&lt;a href=&quot;#4115-重启手机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.6 检测设备是否已 root&lt;a href=&quot;#4116-检测设备是否已-root&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;su&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;此时命令行提示符是 &lt;code&gt;$&lt;/code&gt; 则表示没有 root 权限，是 &lt;code&gt;#&lt;/code&gt; 则表示已 root。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.7 使用 Monkey 进行压力测试&lt;a href=&quot;#4117-使用-monkey-进行压力测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作，可以对正在开发中的程序进行随机压力测试。
简单用法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell monkey -p &amp;lt;packagename&amp;gt; -v 500&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;表示向 &lt;code&gt;&amp;lt;packagename&amp;gt;&lt;/code&gt; 指定的应用程序发送 500 个伪随机事件。
Monkey 的详细用法参考 &lt;a href=&quot;https://developer.android.com/studio/test/monkey&quot; target=&quot;_blank&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.11.8 开启/关闭 WiFi&lt;a href=&quot;#4118-开启关闭-wifi&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;注：需要 root 权限。
开启 WiFi：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell svc wifi enable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;关闭 WiFi：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell svc wifi disable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;若执行成功，输出为空；若未取得 root 权限执行此命令，将执行失败，输出 Killed。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.12 刷机相关命令&lt;a href=&quot;#412-刷机相关命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.12.1 重启到 Recovery 模式&lt;a href=&quot;#4121-重启到-recovery-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb reboot recovery&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.12.2 从 Recovery 重启到 Android&lt;a href=&quot;#4122-从-recovery-重启到-android&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.12.3 重启到 Fastboot 模式&lt;a href=&quot;#4123-重启到-fastboot-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb reboot bootloader&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.12.4 通过 sideload 更新系统&lt;a href=&quot;#4124-通过-sideload-更新系统&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果我们下载了 Android 设备对应的系统更新包到电脑上，那么也可以通过 adb 来完成更新。
以 Recovery 模式下更新为例：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;重启到 Recovery 模式。&lt;/p&gt;
&lt;p&gt;adb reboot recovery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在设备的 Recovery 界面上操作进入 &lt;code&gt;Apply update-Apply from ADB&lt;/code&gt;。注：不同 的 Recovery 菜单可能与此有差异，有的是一级菜单就有 &lt;code&gt;Apply update from ADB&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 adb 上传和更新系统。&lt;/p&gt;
&lt;p&gt;adb sideload &amp;lt;path-to-update.zip&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4.13 安全相关命令&lt;a href=&quot;#413-安全相关命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.13.1 启用/禁用 SELinux&lt;a href=&quot;#4131-启用禁用-selinux&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;启用 SELinux&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell setenforce 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;禁用 SELinux&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell setenforce 0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.13.2 启用/禁用 dm_verity&lt;a href=&quot;#4132-启用禁用-dm_verity&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;启用 dm_verity&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb enable-verity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;禁用 dm_verity&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb root&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb disable-verity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.14 更多 adb shell 命令&lt;a href=&quot;#414-更多-adb-shell-命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Android 系统是基于 Linux 内核的，所以 Linux 里的很多命令在 Android 里也有相同或类似的实现，在 &lt;code&gt;adb shell&lt;/code&gt; 里可以调用。本文档前面的部分内容已经用到了 &lt;code&gt;adb shell&lt;/code&gt; 命令。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.14.1 查看进程状态&lt;a href=&quot;#4141-查看进程状态&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell ps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出信息各列含义：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;列名&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;USER&lt;/td&gt;&lt;td&gt;所属用户&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PID&lt;/td&gt;&lt;td&gt;进程 ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PPID&lt;/td&gt;&lt;td&gt;父进程 ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NAME&lt;/td&gt;&lt;td&gt;进程名&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.14.2 查看处理器实时状态&lt;a href=&quot;#4142-查看处理器实时状态&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;adb shell top&lt;/code&gt; 后面可以跟一些可选参数进行过滤查看不同的列表，可用参数及含义如下：&lt;/p&gt;
































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;-m&lt;/td&gt;&lt;td&gt;最多显示多少个进程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-n&lt;/td&gt;&lt;td&gt;刷新多少次后退出&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-d&lt;/td&gt;&lt;td&gt;刷新时间间隔(单位秒，默认值5)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-s&lt;/td&gt;&lt;td&gt;按某列排序(可用col值：cpu, vss, rss, thr)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-t&lt;/td&gt;&lt;td&gt;显示线程信息&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;-h&lt;/td&gt;&lt;td&gt;显示帮助文档&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;输出信息各列含义：&lt;/p&gt;
















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;列名&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;PID&lt;/td&gt;&lt;td&gt;进程 ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;优先级&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CPU%&lt;/td&gt;&lt;td&gt;当前瞬间占用 CPU 百分比&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;S&lt;/td&gt;&lt;td&gt;进程状态（R=运行，S=睡眠，T=跟踪/停止，Z=僵尸进程）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;#THR&lt;/td&gt;&lt;td&gt;线程数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VSS&lt;/td&gt;&lt;td&gt;Virtual Set Size 虚拟耗用内存（包含共享库占用的内存）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RSS&lt;/td&gt;&lt;td&gt;Resident Set Size 实际使用物理内存（包含共享库占用的内存）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PCY&lt;/td&gt;&lt;td&gt;调度策略优先级，SP_BACKGROUND/SPFOREGROUND&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UID&lt;/td&gt;&lt;td&gt;进程所有者的用户 ID&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NAME&lt;/td&gt;&lt;td&gt;进程名&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.14.3 查看进程 UID&lt;a href=&quot;#4143-查看进程-uid&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;有两种方案：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;adb shell dumpsys package &amp;lt;packagename&amp;gt; | grep userId=&lt;/code&gt; 如：&lt;/p&gt;
&lt;p&gt;adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
userId=10394&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 ps 命令找到对应进程的 pid 之后 &lt;code&gt;adb shell cat /proc/&amp;lt;pid&amp;gt;/status | grep Uid&lt;/code&gt;如：&lt;/p&gt;
&lt;p&gt;adb shell
gemini:/ &lt;span&gt;&lt;span&gt;ps∣greporg.mazhuang.guanggoou0a39428635770179581278736SySepoll0000000000Sorg.mazhuang.guanggoogemini:/ps | grep org.mazhuang.guanggoo
u0_a394 28635 770 1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
gemini:/&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;∣&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;oo&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;39428635770179581278736&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;000000000&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;or&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ma&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;an&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;oo&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;mini&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; cat /proc/28635/status | grep Uid
Uid: 10394 10394 10394 10394
gemini:/ $&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;五、参考&lt;a href=&quot;#五参考&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://adbshell.com/&quot; target=&quot;_blank&quot;&gt;ADB Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mzlogin/awesome-adb&quot; target=&quot;_blank&quot;&gt;Awesome Adb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.android.com/studio/command-line/adb&quot; target=&quot;_blank&quot;&gt;Android Debug Bridge&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>宝藏网址</title><link>https://ernest-su.github.io/nice-website/</link><guid isPermaLink="true">https://ernest-su.github.io/nice-website/</guid><description>note.js 安装版本切换工具</description><pubDate>Wed, 03 Feb 2021 03:12:37 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;工具类&lt;a href=&quot;#工具类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;note.js 安装版本切换工具&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jasongin/nvs/&quot; target=&quot;_blank&quot;&gt;https://github.com/jasongin/nvs/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;缓动函数速查表&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://easings.net/cn&quot; target=&quot;_blank&quot;&gt;https://easings.net/cn&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;资源类&lt;a href=&quot;#资源类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;它不仅提供免费的高清视频素材，还有插画，音乐，PR 模版等，相当全面&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://mixkit.co/&quot; target=&quot;_blank&quot;&gt;https://mixkit.co/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;8000个已分类好的扁平化图标(PNG/SVG/WEBFONT)&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.shejidaren.com/8000-flat-icons.html&quot; target=&quot;_blank&quot;&gt;https://www.shejidaren.com/8000-flat-icons.html&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>openwrt多拨笔记</title><link>https://ernest-su.github.io/openwrt_mwan3/</link><guid isPermaLink="true">https://ernest-su.github.io/openwrt_mwan3/</guid><description>公司对每个ip限速300k，平时下载文件甚至打开网页都很慢，之前斐讯0元购撸了个k2路由器，刷了openwrt，配了多拨，但是后来重新刷路由器固件后多拨配置丢了，年久未搞，配了很久都单线多拨失败。今日经过百度多篇文章，最终根据文章的图文操作，弄清楚多拨会用到哪些配置文件，特此记录</description><pubDate>Thu, 01 Aug 2019 14:12:37 GMT</pubDate><content:encoded>&lt;p&gt;公司对每个ip限速300k，平时下载文件甚至打开网页都很慢，之前斐讯0元购撸了个k2路由器，刷了openwrt，配了多拨，但是后来重新刷路由器固件后多拨配置丢了，年久未搞，配了很久都单线多拨失败。今日经过百度多篇文章，最终根据文章的图文操作，弄清楚多拨会用到哪些配置文件，特此记录下来，往后搞单线多拨只需按照笔记无脑敲命令就行了，甚至连luci都不需要。&lt;/p&gt;
&lt;p&gt;首先更新openwrt的软件源&lt;/p&gt;
&lt;p&gt;opkg update&lt;/p&gt;
&lt;p&gt;然后按照必要的文件&lt;/p&gt;
&lt;p&gt;opkg install luci kmod-macvlan luci-app-mwan3&lt;/p&gt;
&lt;p&gt;在/etc/rc.local中exit上一行加入一下配置&lt;/p&gt;
&lt;p&gt;sleep 6
ip link add link eth0.2 name vth1 type macvlan
ifconfig vth1 up&lt;/p&gt;
&lt;p&gt;ip link add link eth0.2 name vth2 type macvlan
ifconfig vth2 up&lt;/p&gt;
&lt;p&gt;ip link add link eth0.2 name vth3 type macvlan
ifconfig vth3 up&lt;/p&gt;
&lt;p&gt;ip link add link eth0.2 name vth4 type macvlan
ifconfig vth4 up&lt;/p&gt;
&lt;p&gt;ip link add link eth0.2 name vth5 type macvlan
ifconfig vth5 up&lt;/p&gt;
&lt;p&gt;ip link add link eth0.2 name vth6 type macvlan
ifconfig vth6 up&lt;/p&gt;
&lt;p&gt;在/etc/config/network中，把原有的config interface各项去掉， 修改成一下版本：
//这个wan修改一下&lt;/p&gt;
&lt;p&gt;config interface ‘wan’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘eth0.2’&lt;br /&gt;
option metric ‘20’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan1’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth1’&lt;br /&gt;
option metric ‘21’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan2’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth2’&lt;br /&gt;
option metric ‘22’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan3’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth3’&lt;br /&gt;
option metric ‘23’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan4’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth4’&lt;br /&gt;
option metric ‘24’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan5’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth5’&lt;br /&gt;
option metric ‘25’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan6’&lt;br /&gt;
option proto ‘dhcp’&lt;br /&gt;
option ifname ‘vth6’&lt;br /&gt;
option metric ‘26’&lt;/p&gt;
&lt;p&gt;在 /etc/config/firewall 中&lt;/p&gt;
&lt;p&gt;config zone&lt;br /&gt;
option name ‘wan’&lt;br /&gt;
option input ‘REJECT’&lt;br /&gt;
option output ‘ACCEPT’&lt;br /&gt;
option forward ‘REJECT’&lt;br /&gt;
option masq ‘1’&lt;br /&gt;
option mtu_fix ‘1’&lt;br /&gt;
option network ‘wan wan6 vwan1 vwan2 vwan3 vwan4 vwan5 vwan6’&lt;/p&gt;
&lt;p&gt;在 /etc/config/mwan3 中&lt;/p&gt;
&lt;p&gt;config interface ‘vwan1’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan2’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan3’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan4’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan5’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config interface ‘vwan6’
option enabled ‘1’
option initial_state ‘online’
option family ‘ipv4’
option track_method ‘ping’
option reliability ‘1’
option count ‘1’
option size ‘56’
option max_ttl ‘60’
option check_quality ‘0’
option timeout ‘2’
option interval ‘5’
option failure_interval ‘5’
option recovery_interval ‘5’
option down ‘3’
option up ‘3’
list track_ip ‘8.8.8.8’&lt;/p&gt;
&lt;p&gt;config member ‘mwan’
option interface ‘wan’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan1’
option interface ‘vwan1’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan2’
option interface ‘vwan2’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan3’
option interface ‘vwan3’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan4’
option interface ‘vwan4’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan5’
option interface ‘vwan5’&lt;/p&gt;
&lt;p&gt;config member ‘mvwan6’
option interface ‘vwan6’&lt;/p&gt;
&lt;p&gt;config policy ‘balanced’
option last_resort ‘default’
list use_member ‘mwan’
list use_member ‘mvwan1’
list use_member ‘mvwan2’
list use_member ‘mvwan3’
list use_member ‘mvwan4’
list use_member ‘mvwan5’
list use_member ‘mvwan6’&lt;/p&gt;
&lt;p&gt;最后重启一下路由器&lt;/p&gt;
&lt;p&gt;reboot&lt;/p&gt;
&lt;p&gt;​&lt;br /&gt;
使用大文件测速专用下载测试一下&lt;/p&gt;
&lt;p&gt;100g   &lt;a href=&quot;http://repos.mia.lax-noc.com/speedtests/100gb.bin&quot; target=&quot;_blank&quot;&gt;http://repos.mia.lax-noc.com/speedtests/100gb.bin&lt;/a&gt;
10t       &lt;a href=&quot;http://repos.mia.lax-noc.com/speedtests/10tb.bin&quot; target=&quot;_blank&quot;&gt;http://repos.mia.lax-noc.com/speedtests/10tb.bin&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Git 在团队中的最佳实践--如何正确使用Git Flow</title><link>https://ernest-su.github.io/git-flow-best-practice/</link><guid isPermaLink="true">https://ernest-su.github.io/git-flow-best-practice/</guid><description>Git的优点很多，但是这里只列出我认为非常突出的几点。</description><pubDate>Fri, 29 Mar 2019 07:56:58 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;Git的优点&lt;a href=&quot;#git的优点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Git的优点很多，但是这里只列出我认为非常突出的几点。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;由于是分布式，所有本地库包含了远程库的所有内容。&lt;/li&gt;
&lt;li&gt;优秀的分支模型，打分支以及合并分支，机器方便。&lt;/li&gt;
&lt;li&gt;快速，在这个时间就是金钱的时代，Git由于代码都在本地，打分支和合并分支机器快速，使用个SVN的能深刻体会到这种优势。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;感兴趣的，可以去看一下Git本身的设计，内在的架构体现了很多的优势，不愧是出资天才程序员Linus (Linux之父) 之手&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;版本管理的挑战&lt;a href=&quot;#版本管理的挑战&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;虽然有这么优秀的版本管理工具，但是我们面对版本管理的时候，依然有非常大得挑战，我们都知道大家工作在同一个仓库上，那么彼此的代码协作必然带来很多问题和挑战，如下：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;如何开始一个Feature的开发，而不影响别的Feature？&lt;/li&gt;
&lt;li&gt;由于很容易创建新分支，分支多了如何管理，时间久了，如何知道每个分支是干什么的？&lt;/li&gt;
&lt;li&gt;哪些分支已经合并回了主干？&lt;/li&gt;
&lt;li&gt;如何进行Release的管理？开始一个Release的时候如何冻结Feature, 如何在Prepare Release的时候，开发人员可以继续开发新的功能？&lt;/li&gt;
&lt;li&gt;线上代码出Bug了，如何快速修复？而且修复的代码要包含到开发人员的分支以及下一个Release?&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;大部分开发人员现在使用Git就只是用三个甚至两个分支，一个是Master, 一个是Develop, 还有一个是基于Develop打得各种分支。这个在小项目规模的时候还勉强可以支撑，因为很多人做项目就只有一个Release, 但是人员一多，而且项目周期一长就会出现各种问题。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Git Flow&lt;a href=&quot;#git-flow&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;就像代码需要代码规范一样，代码管理同样需要一个清晰的流程和规范&lt;/p&gt;&lt;p&gt;Vincent Driessen 同学为了解决这个问题提出了 &lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot; target=&quot;_blank&quot;&gt;A Successful Git Branching Model&lt;/a&gt;&lt;/p&gt;&lt;p&gt;下面是Git Flow的流程图&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-flow-nvie.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;上面的图你理解不了？ 没关系，这不是你的错，我觉得这张图本身有点问题，这张图应该左转90度，大家应该就很用以理解了。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;Git Flow常用的分支&lt;a href=&quot;#git-flow常用的分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Production 分支&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;也就是我们经常使用的Master分支，这个分支最近发布到生产环境的代码，最近发布的Release， 这个分支只能从其他分支合并，不能在这个分支直接修改&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Develop 分支&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个分支是我们是我们的主开发分支，包含所有要发布到下一个Release的代码，这个主要合并与其他分支，比如Feature分支&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Feature 分支&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这个分支主要是用来开发一个新的功能，一旦开发完成，我们合并回Develop分支进入下一个Release&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Release分支&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当你需要一个发布一个新Release的时候，我们基于Develop分支创建一个Release分支，完成Release后，我们合并到Master和Develop分支&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Hotfix分支&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;当我们在Production发现新的Bug时候，我们需要创建一个Hotfix, 完成Hotfix后，我们合并回Master和Develop分支，所以Hotfix的改动会进入下一个Release&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git Flow如何工作&lt;a href=&quot;#git-flow如何工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;初始分支&lt;a href=&quot;#初始分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;所有在Master分支上的Commit应该Tag&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-workflow-release-cycle-1historical.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;Feature 分支&lt;a href=&quot;#feature-分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;分支名 feature/*&lt;/p&gt;&lt;p&gt;Feature分支做完后，必须合并回Develop分支, 合并完分支后一般会删点这个Feature分支，但是我们也可以保留&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-workflow-release-cycle-2feature.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;Release分支&lt;a href=&quot;#release分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;分支名 release/*&lt;/p&gt;&lt;p&gt;Release分支基于Develop分支创建，打完Release分之后，我们可以在这个Release分支上测试，修改Bug等。同时，其它开发人员可以基于开发新的Feature (记住：一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)&lt;/p&gt;&lt;p&gt;发布Release分支时，合并Release到Master和Develop， 同时在Master分支上打个Tag记住Release版本号，然后可以删除Release分支了。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-workflow-release-cycle-3release.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;维护分支 Hotfix&lt;a href=&quot;#维护分支-hotfix&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;分支名 hotfix/*&lt;/p&gt;&lt;p&gt;hotfix分支基于Master分支创建，开发完后需要合并回Master和Develop分支，同时在Master上打一个tag&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-workflow-release-cycle-4maintenance.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git Flow代码示例&lt;a href=&quot;#git-flow代码示例&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;a. 创建develop分支&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push -u origin develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;b. 开始新Feature开发&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -b some-feature develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Optionally, push branch to origin:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push -u origin some-feature&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 做一些改动&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git add some-file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git commit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;c. 完成Feature&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git pull origin develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge --no-ff some-feature&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -d some-feature&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# If you pushed branch to origin:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin --delete some-feature&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;d. 开始Relase&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -b release-0.1.0 develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Optional: Bump version number, commit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Prepare release, commit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;e. 完成Release&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge --no-ff release-0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge --no-ff release-0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -d release-0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# If you pushed branch to origin:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push origin --delete release-0.1.0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git tag -a v0.1.0 master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push --tags&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;f. 开始Hotfix&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout -b hotfix-0.1.1 master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;g. 完成Hotfix&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge --no-ff hotfix-0.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git checkout develop&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git merge --no-ff hotfix-0.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git branch -d hotfix-0.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git tag -a v0.1.1 master&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git push --tags&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git flow工具&lt;a href=&quot;#git-flow工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;实际上，当你理解了上面的流程后，你完全不用使用工具，但是实际上我们大部分人很多命令就是记不住呀，流程就是记不住呀，肿么办呢？&lt;/p&gt;&lt;p&gt;总有聪明的人创造好的工具给大家用, 那就是Git flow script.&lt;/p&gt;&lt;section&gt;&lt;h4&gt;安装&lt;a href=&quot;#安装&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;OS X&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;brew install git-flow&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;apt-get install git-flow&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Windows&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;wget -q -O - —no-check-certificate &lt;a href=&quot;https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh&quot; target=&quot;_blank&quot;&gt;https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh&lt;/a&gt; | bash&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;使用&lt;a href=&quot;#使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;初始化:&lt;/strong&gt; git flow init&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始新Feature:&lt;/strong&gt; git flow feature start MYFEATURE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish一个Feature(也就是push到远程):&lt;/strong&gt; git flow feature publish MYFEATURE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取Publish的Feature:&lt;/strong&gt; git flow feature pull origin MYFEATURE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完成一个Feature:&lt;/strong&gt; git flow feature finish MYFEATURE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始一个Release:&lt;/strong&gt; git flow release start RELEASE [BASE]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Publish一个Release:&lt;/strong&gt; git flow release publish RELEASE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布Release:&lt;/strong&gt; git flow release finish RELEASE
别忘了git push —tags&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开始一个Hotfix:&lt;/strong&gt; git flow hotfix start VERSION [BASENAME]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;发布一个Hotfix:&lt;/strong&gt; git flow hotfix finish VERSION&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_git-flow-commands.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Git Flow GUI&lt;a href=&quot;#git-flow-gui&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;上面讲了这么多，我知道还有人记不住，那么又有人做出了GUI 工具，你只需要点击下一步就行，工具帮你干这些事！！！&lt;/p&gt;&lt;section&gt;&lt;h4&gt;SourceTree&lt;a href=&quot;#sourcetree&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;当你用Git-flow初始化后，基本上你只需要点击git flow菜单选择start feature, release或者hotfix, 做完后再次选择git flow菜单，点击Done Action. 我勒个去，我实在想不到还有比这更简单的了。&lt;/p&gt;&lt;p&gt;目前SourceTree支持Mac, Windows, Linux.&lt;/p&gt;&lt;p&gt;这么好的工具请问多少钱呢？ &lt;strong&gt;免费!!!!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_source-tree-git-flow-init.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/o_sourcetree-hero-mac-log.png&quot; alt=&quot;img&quot; /&gt;&lt;figcaption&gt;img&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;转载自csdn博客，&lt;a href=&quot;https://www.cnblogs.com/wish123/p/9785101.html&quot; target=&quot;_blank&quot;&gt;查看原文&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>计划进度-熟练使用docker</title><link>https://ernest-su.github.io/plan-docker/</link><guid isPermaLink="true">https://ernest-su.github.io/plan-docker/</guid><description>2019.03.14 尝试使用docker搭建youphptube</description><pubDate>Thu, 14 Mar 2019 11:00:34 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;计划进度- 熟练使用docker&lt;a href=&quot;#计划进度--熟练使用docker&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;2019.03.14  尝试使用docker搭建&lt;a href=&quot;https://github.com/leejoneshane/docker-youphptube&quot; target=&quot;_blank&quot;&gt;youphptube&lt;/a&gt;&lt;/p&gt;&lt;section&gt;&lt;h2&gt;笔记&lt;a href=&quot;#笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;docker-compose&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;更多&lt;a href=&quot;#更多&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>计划进度-熟练使用vue</title><link>https://ernest-su.github.io/plan-vue/</link><guid isPermaLink="true">https://ernest-su.github.io/plan-vue/</guid><description>2019.03.12 开始阅读vuejs 2.0完全入门记录</description><pubDate>Tue, 12 Mar 2019 09:39:34 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;计划进度- 熟练使用vue&lt;a href=&quot;#计划进度--熟练使用vue&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;2019.03.12  开始阅读&lt;a href=&quot;https://ernest-su.gitbook.io/learning-vuejs-2-zh-cn/&quot; target=&quot;_blank&quot;&gt;vue-js 2.0完全入门记录&lt;/a&gt;&lt;/p&gt;&lt;section&gt;&lt;h2&gt;笔记&lt;a href=&quot;#笔记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;更多&lt;a href=&quot;#更多&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>我的计划</title><link>https://ernest-su.github.io/plans/</link><guid isPermaLink="true">https://ernest-su.github.io/plans/</guid><description>不知不觉已经2019了。成为社会人也已经有三年有余。成长了很多，但是觉得还不够。在时间管理，目标计划方面，还有很大的改进空间。经常在心里立下FLAG，但是没多久FLAG就倒了。因此本篇用于记录我的目标和计划。那些已经实现的、已经失败的、正在计划的……</description><pubDate>Tue, 12 Mar 2019 09:21:02 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;花有重开日，人无再少年&lt;a href=&quot;#花有重开日人无再少年&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;不知不觉已经2019了。成为社会人也已经有三年有余。成长了很多，但是觉得还不够。在时间管理，目标计划方面，还有很大的改进空间。经常在心里立下FLAG，但是没多久FLAG就倒了。因此本篇用于记录我的目标和计划。那些已经实现的、已经失败的、正在计划的……&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;已经实现的 SUCCESS✅&lt;a href=&quot;#已经实现的-success&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;OBJECT&lt;/th&gt;&lt;th&gt;CREATE TIME&lt;/th&gt;&lt;th&gt;START TIME&lt;/th&gt;&lt;th&gt;END TIME&lt;/th&gt;&lt;th&gt;CURRENT STATUS&lt;/th&gt;&lt;th&gt;LINK&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;已经失败的 FAILURE❌&lt;a href=&quot;#已经失败的-failure&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;




















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;OBJECT&lt;/th&gt;&lt;th&gt;CREATE TIME&lt;/th&gt;&lt;th&gt;START TIME&lt;/th&gt;&lt;th&gt;END TIME&lt;/th&gt;&lt;th&gt;CURRENT STATUS&lt;/th&gt;&lt;th&gt;LINK&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;正在计划的 PLANNING🕛&lt;a href=&quot;#正在计划的-planning&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;












































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;OBJECT&lt;/th&gt;&lt;th&gt;CREATE TIME&lt;/th&gt;&lt;th&gt;START TIME&lt;/th&gt;&lt;th&gt;END TIME&lt;/th&gt;&lt;th&gt;CURRENT STATUS&lt;/th&gt;&lt;th&gt;LINK&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;熟练使用Adobe XD&lt;/td&gt;&lt;td&gt;2019.03.10&lt;/td&gt;&lt;td&gt;2019.3.13&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;开始阅读&lt;a href=&quot;https://ernest-su.gitbook.io/learning-vuejs-2-zh-cn/&quot; target=&quot;_blank&quot;&gt;vue-js 2.0完全入门记录&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;/plan-vue&quot;&gt;ℹ&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;熟练使用 vue&lt;/td&gt;&lt;td&gt;2019.03.12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;/plan-vue&quot;&gt;ℹ&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;熟练使用docker&lt;/td&gt;&lt;td&gt;2019.03.10&lt;/td&gt;&lt;td&gt;2019.03.14&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;学习搭建&lt;strong&gt;docker-youphptube&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;/plan-docker&quot;&gt;ℹ&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;熟练使用flutter&lt;/td&gt;&lt;td&gt;2019.03.12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;/plan-flutter&quot;&gt;ℹ&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;</content:encoded></item><item><title>一句话笔记：相见恨晚的软件</title><link>https://ernest-su.github.io/soft_collections/</link><guid isPermaLink="true">https://ernest-su.github.io/soft_collections/</guid><description>Javassist/beanshell：Java动态编程</description><pubDate>Tue, 12 Mar 2019 09:21:02 GMT</pubDate><content:encoded>&lt;p&gt;Javassist/beanshell：Java动态编程&lt;/p&gt;
&lt;p&gt;Everything：本地搜索&lt;/p&gt;
&lt;p&gt;procexp：进程、窗口信息查看&lt;/p&gt;
&lt;p&gt;typora markdown编辑器&lt;/p&gt;
&lt;p&gt;SpaceSniffer:磁盘空间占用查看&lt;/p&gt;
&lt;p&gt;jadx-gui:直接反编译apk成gradle工程&lt;/p&gt;
&lt;p&gt;Cmder：Windows下命令行利器&lt;/p&gt;
&lt;p&gt;MyWebServer：windows下简单的web服务器&lt;/p&gt;
&lt;p&gt;pxCook: 图片标注利器，可生成代码&lt;/p&gt;</content:encoded></item><item><title>kindle paperwhite缺陷：WIFI问题</title><link>https://ernest-su.github.io/amazon-kindle-paper-white-bug/</link><guid isPermaLink="true">https://ernest-su.github.io/amazon-kindle-paper-white-bug/</guid><description>上午京东买了958的KPW3，结果WIFI一直连不上。于是百度解决办法，也不行。问在线客服，并没有本质上解决问题，而且技术支持一点也不懂技术。下面是对话记录。</description><pubDate>Thu, 06 Apr 2017 10:46:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;上午京东买了958的KPW3，结果WIFI一直连不上。于是百度解决办法，也不行。问在线客服，并没有本质上解决问题，而且技术支持一点也不懂技术。下面是对话记录。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;我: 怎么看是paperwhite是第几代，连接不上wifi
您现在已连接到亚马逊的 高云涛。
高云涛: 您好，欢迎使用亚马逊在线服务，我是亚马逊kindle客服：高云涛，很高兴为您服务，请问有什么可以帮到您的？
麻烦您提供一下设备的序列号我帮您查询下
在这里查询序列号&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从主页（点击小房子回到主页）点击右上角三个点菜单键。&lt;/li&gt;
&lt;li&gt;点击【设置】，然后再次点击【右上角三点菜单键】。&lt;/li&gt;
&lt;li&gt;点击【设备信息】.查看序列号提供一下
我: ******(保护隐私，此处隐藏)
高云涛: 目前设备还没有注册
是kpw3代
我: 连接不上wifi
高云涛: 您连接的wifi是家庭路由器吗
我: 我的手机都能连接上。 是公司的路由器
密码确定是正确的。
百度后尝试建立WIFI_NO_NET_PROBE 文件，也不行
高云涛: kindle对wifi的信道有要求的
我: 改不了wifi信道，就用不了了？
高云涛: 重启一下路由器试试
我: 总不能每次都重启路由器吧
高云涛: 重启一次，能连接上就行
不用总重启
或是您打开手机的流量热点
我: 升级固件也不能吗？是固件的问题还是硬件的缺陷？
高云涛: 连接热点注册试试
目前您还没有注册，看不到固件是哪版的
我: 5.8.2.1
高云涛: 太低了
我: 升级了固件能够解决这个问题吗？
高云涛: 系统包下载连接
&lt;a href=&quot;http://pan.baidu.com/s/1mijs8pM&quot; target=&quot;_blank&quot;&gt;http://pan.baidu.com/s/1mijs8pM&lt;/a&gt;
• 下载系统包后，将软件更新文件传输至Kindle设备：
a.	打开Kindle，并使用USB连接线将其连接至电脑。
b.	将新的更新文件从电脑拖入Kindle驱动器中。
注意： 不要将更新文件拖入Kindle驱动器中的任何文件夹中。
•开始软件更新：
a.	在【主页】中，点击【菜单】图标，然后点击【设置】。
b.	再次点击【菜单】图标，然后点击【更新您的Kindle】。 如果已安装最新更新，或者更新文件传输失败，此选项将显示为灰色。
c.	点击【确定】执行更新。 此时您将看到【您的Kindle正在更新】。
更新完成后，Kindle将立即自动重启。
我: 我从官网下载着。
高云涛: 先更新后，在试试
最好也换网
我: 重启路由器也不行
高云涛: 换手机流量热点
我: KPW3支持的信道是多少
高云涛: 1.6.11
我: 不在这三个信道上的话，只能一遍遍的重启路由器？
高云涛: 您现在先不用考虑那些
您现在打开手机流量热点
先连接试试
我: 注册上了
高云涛: 请问您还有其他疑问吗？
我: 有，不在这三个信道上的话，只能一遍遍的重启路由器？
高云涛: 可以自己设置
我: 不是自己的路由器不能设置啊。。。
升级固件也不能吗？是固件的问题还是硬件的缺陷？
高云涛: 这个问题，建议您和公司协商一下
可以连接热点，设备是没有问题的
是wifi的设备问题
不是通过设备更新，就能单纯解决
不是同一个问题
我: 不是吧，手机都没问题。
高云涛: 之前已经告知您了，kindle对wifi信道有要求
不是手机可以连接的，kindle就一定可以连接
我: 这个没有在说明书上有啊
高云涛: 没有
这个是您公司的网问题，不是您设备的问题
重启路由器，就是简单的拔下电源，然后10秒后充电
高云涛: 没有
这个是您公司的网问题，不是您设备的问题
重启路由器，就是简单的拔下电源，然后10秒后充电
请问您还有其他疑问吗？
我: 没解决问题&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title>GitHub上star超过2k的安卓MVP架构指南</title><link>https://ernest-su.github.io/android-architecture-guideline-for-mvp/</link><guid isPermaLink="true">https://ernest-su.github.io/android-architecture-guideline-for-mvp/</guid><description>近日在搜MVP模式作为安卓项目架构时候，发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。通读全文发现作者用实际项目将MVP架构要怎么分职责讲得十分通俗易懂。为了方便大家查阅，把原文翻译了一下。作者还有一篇文章讲安卓项目和代码风格指南的。欢迎查看相关翻译。</description><pubDate>Tue, 28 Mar 2017 11:06:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;近日在搜MVP模式作为安卓项目架构时候，发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。通读全文发现作者用实际项目将MVP架构要怎么分职责讲得十分通俗易懂。为了方便大家查阅，把原文翻译了一下。作者还有一篇文章讲安卓项目和代码风格指南的。欢迎查看&lt;a href=&quot;http://www.suqishuo.cn/android-project-and-code-guidelines/&quot; target=&quot;_blank&quot;&gt;相关翻译&lt;/a&gt;。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h1&gt;架构指南&lt;a href=&quot;#架构指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;我们的安卓APP架构基于 &lt;a href=&quot;https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter&quot; target=&quot;_blank&quot;&gt;MVP&lt;/a&gt; (Model View Presenter) 模式。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;View (UI 层)&lt;/strong&gt;:这是 Activities, Fragments 和其他标准安卓控件所在层。它的职责是呈现从Presenter收到的数据给用户。它也处理用户的交互和输入（点击监听等）以及在需要时触发Presenter中对应的动作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Presenter&lt;/strong&gt;: Presenter 订阅由 &lt;code&gt;DataManager&lt;/code&gt; 提供的 RxJava Observables。他们负责处理订阅的生命周期，分析/修改&lt;code&gt;DataManager&lt;/code&gt;返回的数据，调用View中的合适方法以便展示数据。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model (Data 层)&lt;/strong&gt;: 它们的职责是取回，保存，缓存，以及通知数据。它可以与本地数据库以及其他的数据仓库通信，使用restful API或者其他第三方SDK等方式。它分为两部分：一组帮助工具类以及一个  &lt;code&gt;DataManager&lt;/code&gt; 。工具类的数量因项目而异，每一个工具类有特定的功能，比如与API通信或在 &lt;code&gt;SharedPreferences&lt;/code&gt; 中保存数据.  &lt;code&gt;DataManager&lt;/code&gt;  把不同工具类的输出使用rx操作符进行组合变换，所以它可以： 1) 提供有意义的数据给 Presenter，2) 把经常一起出现的动作组合在一起。这一层也包含实际的实体类，定义数据结构是怎样的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;img src=&quot;/images/mvp_architecture_diagram.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;从右到左看示意图:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Helpers (Model)&lt;/strong&gt;: 一组类的集合，每个类有特定的职责，他们的功能可以从与API或数据库通信，到实现一些特定的业务逻辑等。每个项目会有不同的工具类，但最常见的几个是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DatabaseHelper&lt;/strong&gt;: 它处理插入，更新，以及获取来自本地SQLite数据库的数据。它的方法返回 Rx Observables ，发射(译者注：Rx术语)简单java对象 (models)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PreferencesHelper&lt;/strong&gt;: 它保存以及获取来自 &lt;code&gt;SharedPreferences&lt;/code&gt; 的数据，他可以返回 Observables 或者直接返回简单java对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retrofit services&lt;/strong&gt; : &lt;a href=&quot;http://square.github.io/retrofit&quot; target=&quot;_blank&quot;&gt;Retrofit&lt;/a&gt; 接口 使用Restful API 通信，每个不同的API拥有自己的 Retrofit 服务. 它们返回 Rx Observables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Manager (Model)&lt;/strong&gt;: 这是MVP架构的关键部分。它持有每一个工具类的引用，使用这些工具类满足来自Presenter的请求。 它的方法广泛的使用 Rx 操作符来组合，转换或过滤来自工具类的输出，以便生成Presenter想要的输出。它返回发射数据模型（data models）的 observables。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Presenters&lt;/strong&gt;: 订阅由  &lt;code&gt;DataManager&lt;/code&gt;  提供的observables，处理这些数据以便调用View中合适的方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Activities, Fragments, ViewGroups (View)&lt;/strong&gt;: 实现了一组Presenter可以调用的方法的标准安卓组件。它们也处理用户的交互如点击等，然后调用Presenter中合适的方法来采取相应的行动。这些控件也实现框架相关的任务，如管理安卓生命周期，渲染视图（Views）等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Event Bus&lt;/strong&gt;: 它使得View控件得到发生在Model的特定事件通知。通常  &lt;code&gt;DataManager&lt;/code&gt; 发出事件，然后这些事件可以被Activities 和 Fragments 订阅。  event bus  &lt;strong&gt;仅仅&lt;/strong&gt; 用于非常特别的动作——这些事件不是仅与一个界面相关的，要通知多方，如：用户已经退出登录。
&lt;a href=&quot;https://github.com/ribot/android-guidelines/blob/master/architecture_guidelines/android_architecture.md&quot; target=&quot;_blank&quot;&gt;原文链接&lt;/a&gt;
&lt;a href=&quot;http://www.suqishuo.cn/android-architecture-guideline-for-mvp/&quot; target=&quot;_blank&quot;&gt;译文链接&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;</content:encoded></item><item><title>GitHub上star超过2k的安卓项目和代码风格指南（绝对干货）</title><link>https://ernest-su.github.io/android-project-and-code-guidelines/</link><guid isPermaLink="true">https://ernest-su.github.io/android-project-and-code-guidelines/</guid><description>近日在搜MVP模式作为安卓项目架构时候，发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。作者同项目的这篇文章讲安卓项目和代码风格指南，也非常有参考价值。为了方便大家查阅，把原文翻译了一下。点击查看作者介绍安卓MVP架构指南的翻译文章。</description><pubDate>Tue, 28 Mar 2017 11:06:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;近日在搜MVP模式作为安卓项目架构时候，发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。作者同项目的这篇文章讲安卓项目和代码风格指南，也非常有参考价值。为了方便大家查阅，把原文翻译了一下。点击查看作者介绍安卓MVP架构指南的&lt;a href=&quot;http://www.suqishuo.cn/android-architecture-guideline-for-mvp/&quot; target=&quot;_blank&quot;&gt;翻译文章&lt;/a&gt;。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h1&gt;1. 项目指南&lt;a href=&quot;#1-项目指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;1.1 项目结构&lt;a href=&quot;#11-项目结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;新项目应该遵循安卓Gradle项目结构，定义在这里 ：&lt;a href=&quot;http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Project-Structure&quot; target=&quot;_blank&quot;&gt;安卓Gradle插件用户指南&lt;/a&gt;。项目&lt;a href=&quot;https://github.com/ribot/android-boilerplate&quot; target=&quot;_blank&quot;&gt;ribot Boilerplate&lt;/a&gt; 是一个很好的参考。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;1.2 文件命名&lt;a href=&quot;#12-文件命名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.2.1 类文件&lt;a href=&quot;#121-类文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;类名书写方式是 &lt;a href=&quot;http://en.wikipedia.org/wiki/CamelCase&quot; target=&quot;_blank&quot;&gt;大写的驼峰命名&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;继承于安卓组件的类，名称应该以继承的组件命名，比如：&lt;code&gt;SignInActivity&lt;/code&gt;, &lt;code&gt;SignInFragment&lt;/code&gt;, &lt;code&gt;ImageUploaderService&lt;/code&gt;, &lt;code&gt;ChangePasswordDialog&lt;/code&gt;.&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2.2 资源文件&lt;a href=&quot;#122-资源文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;资源文件书写方式：小写_下划线。如：ic_launcher.png&lt;/p&gt;&lt;section&gt;&lt;h4&gt;1.2.2.1 Drawable 文件&lt;a href=&quot;#1221-drawable-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;drawable类型资源命名：&lt;/p&gt;

















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;资源类别&lt;/th&gt;&lt;th&gt;前缀&lt;/th&gt;&lt;th&gt;例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Action bar&lt;/td&gt;&lt;td&gt;&lt;code&gt;ab_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ab_stacked.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Button&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_send_pressed.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dialog&lt;/td&gt;&lt;td&gt;&lt;code&gt;dialog_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;dialog_top.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Divider&lt;/td&gt;&lt;td&gt;&lt;code&gt;divider_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;divider_horizontal.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Icon&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_star.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Menu&lt;/td&gt;&lt;td&gt;&lt;code&gt;menu_	&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;menu_submenu_bg.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Notification&lt;/td&gt;&lt;td&gt;&lt;code&gt;notification_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;notification_bg.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tabs&lt;/td&gt;&lt;td&gt;&lt;code&gt;tab_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;tab_pressed.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;图标（icons）命名方式 (取自 &lt;a href=&quot;http://developer.android.com/design/style/iconography.html&quot; target=&quot;_blank&quot;&gt;安卓图标官方指南&lt;/a&gt;):&lt;/p&gt;







































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;资源类别&lt;/th&gt;&lt;th&gt;前缀&lt;/th&gt;&lt;th&gt;例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_star.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Launcher icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_launcher&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_launcher_calendar.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Menu icons and Action Bar icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_menu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_menu_archive.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Status bar icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_stat_notify&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_stat_notify_msg.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tab icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_tab&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_tab_recent.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dialog icons&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_dialog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ic_dialog_info.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;selector 状态命名方式:&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;后缀&lt;/th&gt;&lt;th&gt;例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Normal (正常)&lt;/td&gt;&lt;td&gt;&lt;code&gt;_normal&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_order_normal.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Pressed（按下）&lt;/td&gt;&lt;td&gt;&lt;code&gt;_pressed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_order_pressed.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Focused （获得焦点）&lt;/td&gt;&lt;td&gt;&lt;code&gt;_focused&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_order_focused.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Disabled    （不可用）&lt;/td&gt;&lt;td&gt;&lt;code&gt;_disabled&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_order_disabled.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Selected    （选中）&lt;/td&gt;&lt;td&gt;&lt;code&gt;_selected&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;btn_order_selected.9.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.2.2.2 布局文件&lt;a href=&quot;#1222-布局文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;布局文件应该跟对应的安卓组件名称匹配，但是把最顶级的组件名称放在前面。比如，当我们创建一个用于 &lt;code&gt;SignInActivity&lt;/code&gt;的布局，那布局文件名称应该是&lt;code&gt;activity_sign_in.xml&lt;/code&gt;.&lt;/p&gt;


































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;组件&lt;/th&gt;&lt;th&gt;类名&lt;/th&gt;&lt;th&gt;布局文件名&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Activity&lt;/td&gt;&lt;td&gt;&lt;code&gt;UserProfileActivity&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;activity_user_profile.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fragment&lt;/td&gt;&lt;td&gt;&lt;code&gt;SignUpFragment&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;fragment_sign_up.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Dialog&lt;/td&gt;&lt;td&gt;&lt;code&gt;ChangePasswordDialog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;dialog_change_password.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AdapterView item&lt;/td&gt;&lt;td&gt;---&lt;/td&gt;&lt;td&gt;&lt;code&gt;item_person.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Partial layout&lt;/td&gt;&lt;td&gt;---&lt;/td&gt;&lt;td&gt;&lt;code&gt;partial_stats_bar.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;一个稍微不同的地方是当我们创建用于&lt;code&gt;Adapter&lt;/code&gt;渲染的布局,如填充一个 &lt;code&gt;ListView&lt;/code&gt;， 在这种情况下，布局文件命名应该是用 &lt;code&gt;item_&lt;/code&gt;开始。
注意有些地方这些规则没法应用，如，当我们创建一个布局文件，用于渲染另一个布局的一部分，这样的情况下，我们应该使用&lt;code&gt;partial_&lt;/code&gt;前缀。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.2.2.3 菜单文件&lt;a href=&quot;#1223-菜单文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;跟布局文件相似，按钮文件应该跟对应的组件匹配。比如：当我们定义一个菜单，用于 &lt;code&gt;UserActivity&lt;/code&gt;,那么文件名应该是 &lt;code&gt;activity_user.xml&lt;/code&gt;&lt;/p&gt;&lt;p&gt;文件名不含有&lt;code&gt;menu&lt;/code&gt;是个良好的习惯做法，因为这些文件已经位于 &lt;code&gt;menu&lt;/code&gt; 目录了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1.2.2.4 取值文件(Values files)&lt;a href=&quot;#1224-取值文件values-files&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在values文件夹的资源文件应该是复数形式（plural），比如，&lt;code&gt;strings.xml&lt;/code&gt;, &lt;code&gt;styles.xml&lt;/code&gt;, &lt;code&gt;colors.xml&lt;/code&gt;, &lt;code&gt;dimens.xml&lt;/code&gt;, &lt;code&gt;attrs.xml&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;2 代码指南&lt;a href=&quot;#2-代码指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;2.1 Java语言规范&lt;a href=&quot;#21-java语言规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1.1 不要忽略了异常&lt;a href=&quot;#211-不要忽略了异常&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;你万不该这样做:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setServerPort&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; value) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serverPort &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;parseInt&lt;/span&gt;&lt;span&gt;(value);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;NumberFormatException&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;) { }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;虽然你可能觉得你的代码永远不会抛出这个异常或者这异常不重要，不需要处理它，像上面那样忽略异常会在你的代码中留下雷区，将来其他人会踩到。你必须在你的代码中以某种原则的方式处理每个异常。具体的处理视情况而定。._ - (&lt;a href=&quot;https://source.android.com/source/code-style.html&quot; target=&quot;_blank&quot;&gt;安卓官方代码指南&lt;/a&gt;)&lt;/p&gt;&lt;p&gt;指南中关于不要忽略异常的说明在 &lt;a href=&quot;https://source.android.com/source/code-style.html#dont-ignore-exceptions&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.1.2 不要捕获一般的异常。&lt;a href=&quot;#212-不要捕获一般的异常&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;你不应该这样做:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;someComplicatedIOFunction&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 可能抛出 IOException&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;someComplicatedParsingFunction&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 可能抛出 ParsingException&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;someComplicatedSecurityFunction&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 可能抛出 SecurityException&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//啊哈，统一处理掉&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;) {                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;//我将捕获所有的异常&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;handleError&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;                      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 使用一个通用的处理手段!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;查看不这样做的原因以及要怎么做： &lt;a href=&quot;https://source.android.com/source/code-style.html#dont-catch-generic-exception&quot; target=&quot;_blank&quot;&gt;猛戳安卓官方指南之不要捕获一般的异常&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.1.3 不要用finalizer&lt;a href=&quot;#213-不要用finalizer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;我们不使用finalizer。它什么时候被调用是没有保证的，甚至它不被调用。大部分情况下，你可以使用良好的异常处理来满足需要在finalizer中做的工作。如果你确实需要它，定义一个 &lt;code&gt;close()&lt;/code&gt; 方法（或类似的）然后在文档中明确的指出什么时候这个方法需要被调用。可以查看 &lt;code&gt;InputStream&lt;/code&gt; 做为例子.这种情况下，在finalizer中打印一个简短的log信息是恰当的但不是必须的，因为我们不希望log泛滥 ._ - (&lt;a href=&quot;https://source.android.com/source/code-style.html#dont-use-finalizers&quot; target=&quot;_blank&quot;&gt;猛戳安卓官方指南之不要用finalizer&lt;/a&gt;)&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.1.4 完全的import语句&lt;a href=&quot;#214-完全的import语句&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;反例: &lt;code&gt;import foo.*;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;正解: &lt;code&gt;import foo.Bar;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;点击 &lt;a href=&quot;https://source.android.com/source/code-style.html#fully-qualify-imports&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt; 查看更多说明&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2.2 Java风格规范&lt;a href=&quot;#22-java风格规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.2.1 全局变量定义及命名&lt;a href=&quot;#221-全局变量定义及命名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;全局变量应该定义在&lt;strong&gt;文件的头部&lt;/strong&gt;,遵循下面的命名规则。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;私有的非静态全局变量以&lt;code&gt;m&lt;/code&gt;开头&lt;/li&gt;
&lt;li&gt;私有的静态全局变量以&lt;code&gt;s&lt;/code&gt;开头&lt;/li&gt;
&lt;li&gt;其他的全局变量以小写单词开头&lt;/li&gt;
&lt;li&gt;常量使用全部大写，单词间用下划线间隔（ALL_CAPS_WITH_UNDERSCORES）.&lt;/li&gt;
&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;译者注：这个规则取自Android Open Source Project代码贡献规范。在程序员的圈子里对于要不要前缀这个问题已经吵翻天了。我在使用greendao的时候使用前缀的话，自动生成的getter/setter会是getMxxx/setMxxx这样难看的方法。很多人也觉得这个命名规则没有意义。&lt;a href=&quot;http://stackoverflow.com/questions/2092098/why-do-most-fields-class-members-in-android-tutorial-start-with-m&quot; target=&quot;_blank&quot;&gt;stackOverFlow&lt;/a&gt; 还有 &lt;a href=&quot;http://stackoverflow.com/questions/4237469/why-do-variable-names-often-start-with-the-letter-m&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt; ，以及一本教你怎么写出整洁代码的书中如是说：
“我觉得如今这些前缀没有意义，尤其是在你的APP中!你的类和方法应该尽量的小，而且你应该使用代码高亮的编辑环境，使得成员变量易于分辨。再者，人们快速适应忽略了前缀或后缀来看名字的有意义部分。我们阅读代码越多，看到前后缀越少。渐渐地，前缀就变成了旧代码看不到的线索和标记。——代码整洁之道(Clean.Code).Robert.C.Martin”&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; SOME_CONSTANT &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; publicField&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;span&gt; sSingleton&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; mPackagePrivate&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; mPrivate&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; mProtected&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.3把首字母缩写当做一个单词来看&lt;a href=&quot;#223把首字母缩写当做一个单词来看&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;好的例子&lt;/th&gt;&lt;th&gt;不好的例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;XmlHttpRequest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;XMLHTTPRequest&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;getCustomerId&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;getCustomerID&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;String url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;String URL&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;long id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;long ID&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.4 使用空格缩进&lt;a href=&quot;#224-使用空格缩进&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用四个空格做代码块缩进:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;&lt;span&gt; (x &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;++;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;换行时使用8个空格缩进:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Instrument&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;someLongExpression&lt;/span&gt;&lt;span&gt;&lt;span&gt;(that&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; wouldNotFit&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; on&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; one&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; line)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.5 使用标准的大括号风格&lt;a href=&quot;#225-使用标准的大括号风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;大括号的开始跟代码同一行&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (something) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (somethingElse) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;// ...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;条件语句使用大括号包住，除非条件体只有一行。
如果条件及只有一行条件体，而且没被换行，大括号是不必的。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (condition) &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这是&lt;strong&gt;不好的&lt;/strong&gt;:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (condition)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;// 不好的，没有大括号包围!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.6 注解&lt;a href=&quot;#226-注解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;section&gt;&lt;h4&gt;2.2.6.1 注解实践规范&lt;a href=&quot;#2261-注解实践规范&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;根据安卓代码风格指南，一些Java内置的注解标准的实践规范有：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@Override&lt;/code&gt;:  无论一个方法是重载父类还是实现某个接口的都&lt;strong&gt;必须使用&lt;/strong&gt;@Override 注解。比如，当你使用 @inheritdocs Javadoc 标签,然后 从一个类(不是一个接口)中导出，你也必须声明那个方法 @Overrides 父类的方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;@SuppressWarnings&lt;/code&gt;: @SuppressWarnings 注解应该仅当不可能消除一个警告的时候才使用。如果一个警告 通过这个 “不可能消除” 的测试,  @SuppressWarnings 注解必不可少, 以便保证所有的警告在代码中反映实际的问题。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;关于注解的更多指南可以查看&lt;a href=&quot;http://source.android.com/source/code-style.html#use-standard-java-annotations&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2.2.6.2 注解风格&lt;a href=&quot;#2262-注解风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;类，方法及构造器&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当注解被应用到一个类，方法或者构造函数时候，注解在代码注释之后，&lt;strong&gt;一行一个&lt;/strong&gt;注解&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/* 这是这个类的注解 */&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;AnnotationA&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;AnnotationB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyAnnotatedClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;全局变量&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;全局变量的注解应该在&lt;strong&gt;同一行&lt;/strong&gt;列出。除非这一行超过了最大字数了。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Nullable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Mock&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DataManager&lt;/span&gt;&lt;span&gt; mDataManager&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.7 限制变量范围&lt;a href=&quot;#227-限制变量范围&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;变量的使用范围应该限制到最小(Effective Java 条目 29)。这样做，你可以为你的代码增加可读性和可维护性，减少可能的错误。每个变量应该在最内层的使用到的它代码块中定义&lt;/p&gt;&lt;p&gt;局部变量应该在第一次用到他们的时候定义。几乎每个局部变量都应该初始化。如果你没有足够的信息去初始化一个变量，你应该延迟声明这个变量，直到你有足够的初始化信息。._ - (&lt;a href=&quot;https://source.android.com/source/code-style.html#limit-variable-scope&quot; target=&quot;_blank&quot;&gt;安卓代码风格指南&lt;/a&gt;)&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.8 排序import语句&lt;a href=&quot;#228-排序import语句&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果你使用IDE,如Android Studio，你不必担心这些规则，这些IDE已经遵循这些规则。如果你不用IDE，往下看这些规则:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;import 安卓框架的&lt;/li&gt;
&lt;li&gt;Import 来自第三方的(com, junit, net, org)&lt;/li&gt;
&lt;li&gt;java 以及  javax&lt;/li&gt;
&lt;li&gt;同一个项目的 imports&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;为了保持跟IDE的设置一致，这些imports应该是这样的：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;首字母分组排序，大写的字母在小写的字母前面（如Z在a前面）。&lt;/li&gt;
&lt;li&gt;每个主要分组 (android, com, junit, net, org, java, javax)间应该有一行空行。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更多信息查看&lt;a href=&quot;https://source.android.com/source/code-style.html#limit-variable-scope&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.9 日志(Loging)指南&lt;a href=&quot;#229-日志loging指南&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;Log&lt;/code&gt;  类提供的日志方法来打印错误信息或对开发者分辨问题有用的其他信息：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Log.v(String tag, String msg)&lt;/code&gt; (verbose)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Log.d(String tag, String msg)&lt;/code&gt; (debug)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Log.i(String tag, String msg)&lt;/code&gt; (information)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Log.w(String tag, String msg)&lt;/code&gt; (warning)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Log.e(String tag, String msg)&lt;/code&gt; (error)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;通常来说，我们使用一个类的名称作为一个TAG，在文件的开头定义成一个 &lt;code&gt;static final&lt;/code&gt; 变量，如：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; TAG &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;MyClass&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getSimpleName&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;myMethod&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span&gt;(TAG, &lt;/span&gt;&lt;span&gt;&quot;My error message&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;VERBOSE 和 DEBUG 日志 &lt;strong&gt;必须&lt;/strong&gt;在release版本中禁用。同时也建议禁用INFORMATION, WARNING 和 ERROR 日志，但是你可能觉得它们在release版本中定位问题很有用而保持启用。如果你决定让他们保持启用，你要保证这些日志信息不会泄漏email地址，用户id之类的隐私信息。
仅限debug版本显示Log的配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;BuildConfig&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;DEBUG&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;Log&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;(TAG, &lt;/span&gt;&lt;span&gt;&quot;The value of x is &quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; x);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.10 类成员排序&lt;a href=&quot;#2210-类成员排序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这虽然没有简单正确的方案，但是使用一个 &lt;strong&gt;逻辑的&lt;/strong&gt; 及 ** 一致的 ** 顺序可以提高代码的可读性和可学习性。下面是推荐的顺序：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;常量&lt;/li&gt;
&lt;li&gt;全局变量&lt;/li&gt;
&lt;li&gt;构造函数&lt;/li&gt;
&lt;li&gt;重载的函数和回调 (public 或 private)&lt;/li&gt;
&lt;li&gt;Public 方法&lt;/li&gt;
&lt;li&gt;Private 方法&lt;/li&gt;
&lt;li&gt;内部类或内部接口&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;例子:&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MainActivity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Activity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; mTitle&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TextView&lt;/span&gt;&lt;span&gt; mTextViewTitle&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setTitle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mTitle &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; title;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setUpView&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AnInnerClass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果你的类继承一个&lt;strong&gt;安卓组件&lt;/strong&gt;如Activity或Fragment，对重载的方法进行排序以便&lt;strong&gt;跟组件的生命周期匹配&lt;/strong&gt;是一个最佳实践。比如，当你的Activity实现&lt;code&gt;onCreate()&lt;/code&gt;, &lt;code&gt;onDestroy()&lt;/code&gt;, &lt;code&gt;onPause()&lt;/code&gt; 和 &lt;code&gt;onResume()&lt;/code&gt;，正确的顺序是：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MainActivity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Activity&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;//顺序跟Activity的生命周期匹配&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onResume&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onPause&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onDestroy&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.11 方法的参数顺序&lt;a href=&quot;#2211-方法的参数顺序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在安卓编码时候，定义一个方法拥有一个&lt;code&gt;Context&lt;/code&gt;参数是非常常见的，如果你写一个这样的方法，&lt;strong&gt;Context&lt;/strong&gt;应该是第一个参数。&lt;/p&gt;&lt;p&gt;相反的例子是&lt;strong&gt;回调&lt;/strong&gt;接口，它应该是&lt;strong&gt;最后&lt;/strong&gt;一个参数
例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// Context 总是在第一个位&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loadUser&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Context&lt;/span&gt;&lt;span&gt;&lt;span&gt; context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&lt;span&gt; userId)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 回调总是在最后一位&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;loadUserAsync&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Context&lt;/span&gt;&lt;span&gt;&lt;span&gt; context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&lt;span&gt; userId&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;UserCallback&lt;/span&gt;&lt;span&gt;&lt;span&gt; callback)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.13 字符串常量，命名和取值&lt;a href=&quot;#2213-字符串常量命名和取值&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;很多安卓SDK的元素如&lt;code&gt;SharedPreferences&lt;/code&gt;, &lt;code&gt;Bundle&lt;/code&gt;, 或 &lt;code&gt;Intent&lt;/code&gt;使用键值对实现，所以即使是一个小应用，使用一堆字符串常量也是很常见的。&lt;/p&gt;&lt;p&gt;当使用这些组件，你&lt;strong&gt;必须&lt;/strong&gt;定义这些键是 &lt;code&gt;static final&lt;/code&gt; 变量，并且它们应该像下面这样使用前缀&lt;/p&gt;




























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;元素&lt;/th&gt;&lt;th&gt;变量名前缀&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;SharedPreferences&lt;/td&gt;&lt;td&gt;&lt;code&gt;PREF_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bundle&lt;/td&gt;&lt;td&gt;&lt;code&gt;BUNDLE_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fragment Arguments&lt;/td&gt;&lt;td&gt;&lt;code&gt;ARGUMENT_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intent Extra&lt;/td&gt;&lt;td&gt;&lt;code&gt;EXTRA_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Intent Action&lt;/td&gt;&lt;td&gt;&lt;code&gt;ACTION_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;注意Fragment的参数——&lt;code&gt;Fragment.getArguments()&lt;/code&gt;也是一个Bundle。然而，因为这是Bundle非常常见的用法，我们为它定义一个不同的前缀。&lt;/p&gt;&lt;p&gt;例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//注意这些变量的值应该和名称一致来避免问题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; PREF_EMAIL &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;PREF_EMAIL&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; BUNDLE_AGE &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;BUNDLE_AGE&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; ARGUMENT_USER_ID &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;ARGUMENT_USER_ID&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//Intent相关的使用完全包名作为值&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; EXTRA_SURNAME &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;com.myapp.extras.EXTRA_SURNAME&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; ACTION_OPEN_USER &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;com.myapp.action.ACTION_OPEN_USER&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.14  Fragment和Activity的参数&lt;a href=&quot;#2214--fragment和activity的参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当数据通过&lt;code&gt;Intent&lt;/code&gt; 或&lt;code&gt;Bundle&lt;/code&gt;传递到一个&lt;code&gt;Activity &lt;/code&gt;或 &lt;code&gt;Fragment&lt;/code&gt;，这些不同值的键&lt;strong&gt;必须&lt;/strong&gt; 遵循上面描述的规则。&lt;/p&gt;&lt;p&gt;当一个 &lt;code&gt;Activity&lt;/code&gt; 或 &lt;code&gt;Fragment&lt;/code&gt;  想要参数，它应该提供一个&lt;code&gt;public static&lt;/code&gt;方法来简化对应的&lt;code&gt;Intent&lt;/code&gt; 或 &lt;code&gt;Fragment&lt;/code&gt;创建
在Activity中这个方法通常叫 &lt;code&gt;getStartIntent()&lt;/code&gt;:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Intent&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getStartIntent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Context&lt;/span&gt;&lt;span&gt;&lt;span&gt; context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; user) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Intent&lt;/span&gt;&lt;span&gt; intent &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Intent&lt;/span&gt;&lt;span&gt;&lt;span&gt;(context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ThisActivity&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;intent&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;putParcelableExtra&lt;/span&gt;&lt;span&gt;(EXTRA_USER, user);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; intent&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;对于Fragment它的名称是&lt;code&gt;newInstance()&lt;/code&gt;，处理使用合适的参数创建Fragment。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;UserFragment&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newInstance&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;User&lt;/span&gt;&lt;span&gt; user) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;UserFragment&lt;/span&gt;&lt;span&gt; fragment &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; UserFragment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;Bundle&lt;/span&gt;&lt;span&gt; args &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Bundle&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;putParcelable&lt;/span&gt;&lt;span&gt;(ARGUMENT_USER, user);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;fragment&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setArguments&lt;/span&gt;&lt;span&gt;(args)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt;&lt;span&gt; fragment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意1&lt;/strong&gt;: 这些方法应该在类的 &lt;code&gt;onCreate()&lt;/code&gt;前面&lt;/p&gt;&lt;p&gt;&lt;strong&gt;注意2&lt;/strong&gt;: 如果我们提供上面说的方法，这些extras对应的键和参数应该是&lt;code&gt;private&lt;/code&gt; 的，因为他们不需要暴露到类以外。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.15 代码行长度限制&lt;a href=&quot;#2215-代码行长度限制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;代码行不应该超过&lt;strong&gt;100 个字符&lt;/strong&gt;。如果代码行超过这个限制长度，通常有两种方式来降低长度：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;提取一个局部变量或方法（推荐方式）.&lt;/li&gt;
&lt;li&gt;把单行换行成多行。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;有两种&lt;strong&gt;例外&lt;/strong&gt;可以让一行超过100字符：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;这行不可分割，如长URL。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;package&lt;/code&gt; 和 &lt;code&gt;import&lt;/code&gt; 语句.&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h4&gt;2.2.15.1 换行策略&lt;a href=&quot;#22151-换行策略&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;没有精确的公式解释怎么换行，很多不同的方案是有效的。然而，这里有几个规则可以应用到常见情况。
&lt;strong&gt;在操作符前断开&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当一行被操作符断开，断开处应该在操作符&lt;strong&gt;之前&lt;/strong&gt;，例子如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; longName &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; anotherVeryLongVariable &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; anEvenLongerOne &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; thisRidiculousLongOne&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; theFinalOne&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;赋值符号（=）例外&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在操作符前断开有一个例外，那就是赋值符号  &lt;code&gt;=&lt;/code&gt;，应该在赋值符号&lt;strong&gt;后面&lt;/strong&gt;断开。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; longName &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;anotherVeryLongVariable &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; anEvenLongerOne &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; thisRidiculousLongOne &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; theFinalOne&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方法链的情况&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当多个方法被链接在同一行的时候——如使用Builder时，每一个方法的调用应该在独立一行，在 &lt;code&gt;.&lt;/code&gt;之前断开。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Picasso&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;(context).&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://ribot.co.uk/images/sexyjoe.jpg&quot;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;into&lt;/span&gt;&lt;span&gt;(imageView);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Picasso&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;with&lt;/span&gt;&lt;span&gt;(context)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;http://ribot.co.uk/images/sexyjoe.jpg&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;into&lt;/span&gt;&lt;span&gt;(imageView);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;长参数的情况&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当一个方法有很多参数或它的参数非常长，我们应该在每个逗号 &lt;code&gt;,&lt;/code&gt;后面断开&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;loadPicture&lt;/span&gt;&lt;span&gt;&lt;span&gt;(context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;http://ribot.co.uk/images/sexyjoe.jpg&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; mImageViewProfilePicture&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; clickListener&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;Title of the picture&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;loadPicture&lt;/span&gt;&lt;span&gt;&lt;span&gt;(context&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;http://ribot.co.uk/images/sexyjoe.jpg&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mImageViewProfilePicture&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;clickListener&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;Title of the picture&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2.16 RxJava 链式风格&lt;a href=&quot;#2216-rxjava-链式风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Rx链式操作符要求换行。每一个操作符必须在新的一行，断行应该在&lt;code&gt;.&lt;/code&gt;之前&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Observable&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;syncLocations&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mDatabaseHelper&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getAllLocations&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;concatMap&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Func1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Observable&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Observable&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Location&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                     &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mRetrofitService&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getLocation&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;retry&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Func2&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Throwable&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt;&amp;gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                 &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Boolean&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Integer&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;numRetries&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Throwable&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;throwable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                     &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; throwable &lt;/span&gt;&lt;span&gt;instanceof&lt;/span&gt;&lt;span&gt; RetrofitError;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                 &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2.3 XML 风格规定&lt;a href=&quot;#23-xml-风格规定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.3.1 使用自关闭的标签&lt;a href=&quot;#231-使用自关闭的标签&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当一个XML元素没有任何内容时，你&lt;strong&gt;必须&lt;/strong&gt;使用自关闭标签。
这是好例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;TextView&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;android:id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@+id/text_view_profile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;android:layout_width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;android:layout_height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这是&lt;strong&gt;不好的&lt;/strong&gt;例子 :&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;!-- 不要这样做! --&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;TextView&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@+id/text_view_profile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:layout_width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:layout_height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;TextView&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3.2 资源命名&lt;a href=&quot;#232-资源命名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;资源 ID 和名称使用小写加下划线方式 &lt;strong&gt;lowercase_underscore&lt;/strong&gt;.&lt;/p&gt;&lt;section&gt;&lt;h4&gt;2.3.2.1 ID 命名&lt;a href=&quot;#2321-id-命名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;ID应该使用小写加下划线命名，加上元素名称为前缀，如：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;元素&lt;/th&gt;&lt;th&gt;前缀&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;TextView&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;text_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ImageView&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;image_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Button&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;button_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Menu&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;menu_&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Image view 例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ImageView&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@+id/image_profile&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:layout_width&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;android:layout_height&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;wrap_content&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Menu 例子:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;menu&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;android:id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@+id/menu_done&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;android:title&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Done&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;menu&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2.3.2.2 字符串&lt;a href=&quot;#2322-字符串&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;字符串名称以它们所属的部分为前缀命名，比如&lt;code&gt;registration_email_hint&lt;/code&gt; 或 &lt;code&gt;registration_name_hint&lt;/code&gt;。如果一个字符串&lt;strong&gt;不属于&lt;/strong&gt;任何部分，那么你应该遵循下面的规则：&lt;/p&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;前缀&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;error_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;An error message&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;msg_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A regular information message&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;title_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;A title, i.e. a dialog title&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;action_&lt;/code&gt;&lt;/td&gt;&lt;td&gt;An action such as “Save” or “Create”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2.3.2.3 Styles 和 Themes&lt;a href=&quot;#2323-styles-和-themes&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;不像其他的资源，style命名方式是大写的驼峰是命名&lt;strong&gt;UpperCamelCase&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3.3 属性顺序&lt;a href=&quot;#233-属性顺序&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;作为通用的规则，你应该把相似的属性放在一起分组，一个对常见属性良好的排序方式是&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;View Id&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;布局的宽和高&lt;/li&gt;
&lt;li&gt;其他的布局属性，按字母排序&lt;/li&gt;
&lt;li&gt;剩下的属性，按字母排序&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2.4 测试风格规定&lt;a href=&quot;#24-测试风格规定&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.4.1单元测试&lt;a href=&quot;#241单元测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;测试类应该跟需要测试的类名字对应，以&lt;code&gt;Test&lt;/code&gt;做后缀。比如我们创建一个测试类包含对&lt;code&gt;DatabaseHelper&lt;/code&gt;的测试，我们应该把它命名为 &lt;code&gt;DatabaseHelperTest&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;测试方法用&lt;code&gt;@Test&lt;/code&gt;注解，通常以要测试的方法名为命名开始，以测试的前置条件及/或期望结果做后缀。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;模板: &lt;code&gt;@Test void methodNamePreconditionExpectedBehaviour()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;例子: &lt;code&gt;@Test void signInWithEmptyEmailFails()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;如果没有它们测试也能够清楚的表达，前置条件和/或期望结果不总是必须的。&lt;/p&gt;&lt;p&gt;有时候一个类可能包含一大堆方法，同时每个方法要求多个测试，在这种情况，推荐把测试类分割成几个。比如，如果 &lt;code&gt;DataManager&lt;/code&gt;包含一大堆方法，我们可能想把它分到 &lt;code&gt;DataManagerSignInTest&lt;/code&gt;, &lt;code&gt;DataManagerLoadUsersTest&lt;/code&gt;等等。通常你能够知道哪些测试应该在一起，因为它们有共同的&lt;a href=&quot;https://en.wikipedia.org/wiki/Test_fixture&quot; target=&quot;_blank&quot;&gt;test fixtures&lt;/a&gt;.&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.4.2 Espresso 测试&lt;a href=&quot;#242-espresso-测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每一个 Espresso 测试类目标通常是一个Activity，所以它的名称应该跟目标Activity的名称匹配，以&lt;code&gt;Test&lt;/code&gt;结束，如 &lt;code&gt;SignInActivityTest&lt;/code&gt;&lt;/p&gt;&lt;p&gt;当使用 Espresso API ，把链式方法调用放新行是一个最佳实践。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;onView&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;withId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;R&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;perform&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scrollTo&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;matches&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;isDisplayed&lt;/span&gt;&lt;span&gt;()))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ribot/android-guidelines/blob/master/project_and_code_guidelines.md&quot; target=&quot;_blank&quot;&gt;原文链接&lt;/a&gt;
&lt;a href=&quot;http://www.suqishuo.cn/android-project-and-code-guidelines/&quot; target=&quot;_blank&quot;&gt;译文链接&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Evernote带来的计划任务神器Android-Job</title><link>https://ernest-su.github.io/android-job-from-evernote/</link><guid isPermaLink="true">https://ernest-su.github.io/android-job-from-evernote/</guid><description>在新版本安卓版本(API23以上)中，谷歌把`android.net.conn.CONNECTIVITYCHANGE` 这个广播废弃了。总的来说，应用不应该依赖这个广播来执行相关任务，而应该使用 `JobScheduler` 或者 ` GCMNetworkManager`。计划任</description><pubDate>Thu, 23 Mar 2017 07:56:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;在新版本安卓版本(API23以上)中，谷歌把&lt;code&gt;android.net.conn.CONNECTIVITY_CHANGE&lt;/code&gt; 这个广播废弃了。总的来说，应用不应该依赖这个广播来执行相关任务，而应该使用 &lt;code&gt;JobScheduler&lt;/code&gt; 或者 &lt;code&gt; GCMNetworkManager&lt;/code&gt;。计划任务的执行方案还可以用 &lt;code&gt;AlarmManager&lt;/code&gt;。 对于国内的开发者来说，这是一个悲剧。Android 现在提供这三种不同的API来执行计划任务.这三种API都有各自的优缺点 。 &lt;code&gt;android.net.conn.CONNECTIVITY_CHANGE&lt;/code&gt; 在高版本的系统中不可用了，&lt;code&gt;JobScheduler&lt;/code&gt; 在低版本的系统中又不可用，&lt;code&gt; GCMNetworkManager&lt;/code&gt; 是什么？在国内不存在。而且这些API之间的不同语义和用法对开发者是一种额外的负担。这种负担体现在我们不仅仅要懂得什么时候使用合适的API,而且要为不同的环境执行同样任务提供不同分支的代码。APP需要在运行时候用合适的条件判断到底要使用哪种方式执行计划任务。幸运的是，开源的世界有伟大的公司为我们提供了灵活的轮子。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Evernote 开源的 &lt;code&gt;Android-Job&lt;/code&gt;  为我们带来兼容这三种API的方案，高效，简单，灵活。&lt;code&gt;Android-Job&lt;/code&gt; 在运行判断使用哪种API，它提供  &lt;code&gt;AlarmManager&lt;/code&gt;, &lt;code&gt;JobScheduler&lt;/code&gt;和 &lt;code&gt;GcmNetworkManager&lt;/code&gt;功能的超集，比如说，我们可以定义计划任务在网络连通且在充电时候执行。&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;为兼容而生&lt;a href=&quot;#为兼容而生&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;上面提到的三种方案，兼容维护非常麻烦。为了彰显&lt;code&gt;Android-Job&lt;/code&gt;的价值，我们有必要对这三种方案做一个分析。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;AlarmManager&lt;a href=&quot;#alarmmanager&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;AlarmManager&lt;/code&gt; 的API&lt;a href=&quot;https://plus.google.com/+AndroidDevelopers/posts/GdNrQciPwqo&quot; target=&quot;_blank&quot;&gt;一直在改变&lt;/a&gt; ，所以我们需要非常注意我们APP目标运行系统是哪个版本。&lt;/p&gt;&lt;p&gt;** 优点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;所有设备上可用&lt;/li&gt;
&lt;li&gt;发送广播来启动一个服务执行计划很容易&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;** 缺点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;API在不同系统版本表现不一致&lt;/li&gt;
&lt;li&gt;太多样板代码&lt;/li&gt;
&lt;li&gt;忽略了设备的状态
&lt;figure&gt;&lt;img src=&quot;/images/alarmManager.png&quot; alt=&quot;alarmManager&quot; /&gt;&lt;figcaption&gt;alarmManager&lt;/figcaption&gt;&lt;/figure&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;JobScheduler&lt;a href=&quot;#jobscheduler&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://developer.android.com/reference/android/app/job/JobScheduler.html&quot; target=&quot;_blank&quot;&gt;JobScheduler &lt;/a&gt;只在Lollipop以上版本可用。&lt;/p&gt;&lt;p&gt;** 优点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;流式API简洁易用&lt;/li&gt;
&lt;li&gt;检查设备状态&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;**  缺点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;只在API 21+ 可用 （有些功能要求API24+）&lt;/li&gt;
&lt;li&gt;平台bug&lt;/li&gt;
&lt;li&gt;也是太多样板代码&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;GcmNetworkManager&lt;a href=&quot;#gcmnetworkmanager&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://developers.google.com/cloud-messaging/network-manager&quot; target=&quot;_blank&quot;&gt;GcmNetworkManager &lt;/a&gt;只有在安装有Google Play的设备上可用，而且，没有被墙。&lt;/p&gt;&lt;p&gt;** 优点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;跟&lt;code&gt;JobScheduler&lt;/code&gt;相似的API&lt;/li&gt;
&lt;li&gt;要求minSdkVersion 9&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;** 缺点 **&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;是 GooglePlay ServicesSDK 的一部分&lt;/li&gt;
&lt;li&gt;不能脱离 Play Services 运行&lt;/li&gt;
&lt;li&gt;API 有很多陷阱&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;例子&lt;a href=&quot;#例子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Android-Job项目作者在一篇PPT中详细的说明了这三种方案以及Android-Job的用法。由于篇幅有限且排版原因，强烈建议点击链接去看看。例子简单易懂，在这里给出PPT对应的PDF文件。还在犹豫是否要使用 Android-Job ，看了这个PDF，相信你心里就有肯定的答案了 &lt;a href=&quot;https://speakerd.s3.amazonaws.com/presentations/c9e9289df7df48bab2bf52db0a087248/Schedule_background_jobs_at_the_right_time_-_MTC.pdf&quot; target=&quot;_blank&quot;&gt;PDF传送门&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;使用Android-Job(翻译自项目说明)&lt;a href=&quot;#使用android-job翻译自项目说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;请保证点击以下链接检查你使用的是否是最新版本&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.evernote%22%20AND%20a%3A%22android-job%22&quot; target=&quot;_blank&quot;&gt;Android-Job最新版链接 &lt;/a&gt;
添加以下的Gradle配置到安卓项目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 在app 项目的 build.gradle 文件:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dependencies {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compile &lt;/span&gt;&lt;span&gt;&apos;com.evernote:android-job:1.1.7&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;如果没有在 Gradle build tools 中关闭 manifest merger，那就不用更多步骤来配置这个工具库了。否则需要手动添加权限生命和services，参考这个&lt;a href=&quot;https://github.com/evernote/android-job/blob/master/library/src/main/AndroidManifest.xml&quot; target=&quot;_blank&quot;&gt;AndroidManifest&lt;/a&gt;&lt;/p&gt;&lt;section&gt;&lt;h3&gt;用法&lt;a href=&quot;#用法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;JobManager&lt;/code&gt; 类作为入口。我们自定义的Jobs 需要继承  &lt;code&gt;Job&lt;/code&gt; 类。使用对应的Builder类创建一个  &lt;code&gt;JobRequest&lt;/code&gt; 然后使用 &lt;code&gt;JobManager&lt;/code&gt; 创建这个计划请求。&lt;/p&gt;&lt;p&gt;使用 &lt;code&gt;JobManager&lt;/code&gt; 之前必须向初始化这个单例。我们需要提供一个 &lt;code&gt;Context&lt;/code&gt; 然后添加一个 &lt;code&gt;JobCreator&lt;/code&gt; 实现类.  &lt;code&gt;JobCreator&lt;/code&gt; 把一个job tag 映射到一个特定的job 类。推荐在 &lt;code&gt;Application&lt;/code&gt; 的 &lt;code&gt;onCreate()&lt;/code&gt; 方法中 初始化 &lt;code&gt;JobManager&lt;/code&gt; 。如果没有 &lt;code&gt;Application&lt;/code&gt; 类的访问权限，这是&lt;a href=&quot;FAQ.md#i-cannot-override-the-application-class-how-can-i-add-my-jobcreator&quot;&gt;可选的方案&lt;/a&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Application&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;JobManager&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;addJobCreator&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DemoJobCreator&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DemoJobCreator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;implements&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;JobCreator&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;switch&lt;/span&gt;&lt;span&gt; (tag) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;default:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后我们可以开始计划要执行的任务。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; TAG &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;job_demo_tag&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;NonNull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onRunJob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Params&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// run your job here&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;SUCCESS&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduleJob&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; JobRequest.&lt;/span&gt;&lt;span&gt;Builder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setExecutionWindow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;30_000L&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;40_000L&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;进阶用法&lt;a href=&quot;#进阶用法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;JobRequest.Builder&lt;/code&gt; 类有很多额外的配置选项，例如，我们可以声明条件：需要网络连接。为了使任务周期性执行，用 bundle 传递额外的参数，使得任务在重启后或在特定的时间恢复。
每一个Job 有一个唯一的 ID 。这个 ID 帮助我们辨别 job ，以便将来更新条件或者取消 job。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduleAdvancedJob&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;PersistableBundleCompat&lt;/span&gt;&lt;span&gt; extras &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PersistableBundleCompat&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;extras&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;putString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;key&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Hello world&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; jobId &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; JobRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Builder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setExecutionWindow&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;30_000L&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;40_000L&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setBackoffCriteria&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5_000L&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;JobRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BackoffPolicy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;EXPONENTIAL&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequiresCharging&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequiresDeviceIdle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequiredNetworkType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JobRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;NetworkType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CONNECTED&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setExtras&lt;/span&gt;&lt;span&gt;(extras)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setRequirementsEnforced&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setPersisted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setUpdateCurrent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;schedulePeriodicJob&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; jobId &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; JobRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Builder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TAG&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setPeriodic&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;TimeUnit&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MINUTES&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMillis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;TimeUnit&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;MINUTES&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toMillis&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setPersisted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;scheduleExactJob&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; jobId &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt;&lt;span&gt; JobRequest&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Builder&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;DemoSyncJob&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setExact&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;20_000L&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setPersisted&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;schedule&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cancelJob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; jobId) {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;JobManager&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;instance&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;cancel&lt;/span&gt;&lt;span&gt;(jobId);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果非周期性的  &lt;code&gt;Job&lt;/code&gt; 执行失败,我们可以设定恢复标准重新计划这个 job&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RescheduleDemoJob&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Job&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;NonNull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onRunJob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Params&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 一些异常情况发生，稍后重试这个Job&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Result&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;RESCHEDULE&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onReschedule&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;newJobId&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 恢复的Job有一个新的 ID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;提醒:&lt;/strong&gt;  谷歌在安卓 Marshmallow  版本引入自动备份功能，所有的 job 信息保存在一个文件名为 &lt;code&gt;evernote_jobs.xml&lt;/code&gt;的 shared preference ，   以及文件名为&lt;code&gt;evernote_jobs.db&lt;/code&gt; 的数据库中. 我们应该排除这些文件，避免他们被自动备份。
我们可以定义一个resource XML 文件 (比如, &lt;code&gt;res/xml/backup_config.xml&lt;/code&gt;) 内容如下:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1.0&quot;&lt;/span&gt;&lt;span&gt; encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;full-backup-content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;exclude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;sharedpref&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;evernote_jobs.xml&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;exclude&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;database&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;evernote_jobs.db&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;full-backup-content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后在应用的 &lt;code&gt;AndroidManifest.xml&lt;/code&gt;指向这个文件:&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;application&lt;/span&gt;&lt;span&gt; ...  &lt;/span&gt;&lt;span&gt;android:fullBackupContent&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;@xml/backup_config&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;代码混淆&lt;a href=&quot;#代码混淆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这个库没有使用反射，但是它依赖两个 &lt;code&gt;Service&lt;/code&gt; 以及两个 &lt;code&gt;BroadcastReceiver&lt;/code&gt; 为了避免任何可能出现的问题，不应该混淆这四个类。这个库打包了它自己的混淆配置，所以我们不需要做任何额外的配置。以防万一，也可以在我们项目的混淆配置中添加&lt;a href=&quot;library/proguard.txt&quot;&gt;这些规则&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;FAQ&lt;a href=&quot;#faq&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;FAQ.md&quot;&gt;点击这里&lt;/a&gt;查看更多的疑问解答。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;参考资料&lt;a href=&quot;#参考资料&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://blog.evernote.com/tech/2015/10/26/unified-job-library-android/&quot; target=&quot;_blank&quot;&gt;evernote的Blog&lt;/a&gt;
&lt;a href=&quot;https://speakerdeck.com/vrallev/scheduling-background-job-on-android-at-the-right-time&quot; target=&quot;_blank&quot;&gt;作者Ralf的PPT&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Linux 命令手册安卓版</title><link>https://ernest-su.github.io/linux-command-mannual/</link><guid isPermaLink="true">https://ernest-su.github.io/linux-command-mannual/</guid><description>前两天逛GitHub时候发现了一个命令行手册项目jaywcjlove/linuxcommand 手册网站，觉得非常实用。GitHub的Pages很方便，但是国内访问有时候比较慢。虽然网上类似的在线手册很多了，但是我觉得一个手册应该是随手可用，而且即使在没有网时候，也可随时翻阅的。</description><pubDate>Wed, 22 Mar 2017 11:30:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;前两天逛GitHub时候发现了一个命令行手册项目&lt;a href=&quot;https://github.com/jaywcjlove/linux-command.git&quot; target=&quot;_blank&quot;&gt;jaywcjlove/linux-command&lt;/a&gt; &lt;a href=&quot;https://jaywcjlove.github.io/linux-command/&quot; target=&quot;_blank&quot;&gt;手册网站&lt;/a&gt;，觉得非常实用。GitHub的Pages很方便，但是国内访问有时候比较慢。虽然网上类似的在线手册很多了，但是我觉得一个手册应该是随手可用，而且即使在没有网时候，也可随时翻阅的。于是打算用一天半天把手册做成个离线版简易手册APP。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h1&gt;准备工作&lt;a href=&quot;#准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;翻了一下GitHub上项目的README，发现作者很贴心的把爬虫抓到的数据保存成MarkDown格式了。不得不说一下，MarkDown是程序员最喜欢的文档格式之一。把项目clone到本地，手册的数据来源就准备好了。再次 感谢作者的辛勤付出。&lt;/p&gt;&lt;section&gt;&lt;h2&gt;MarkDown解析&lt;a href=&quot;#markdown解析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;安卓没有原生支持MarkDown的控件，在GitHub上用markdown为关键字搜了一下，&lt;a href=&quot;https://github.com/sirthias/pegdown&quot; target=&quot;_blank&quot;&gt;pegdown&lt;/a&gt; 这个MarkDownn解析库是最多star的。遗憾的是，尽管目前仍然是最流行的MarkDown解析库之一，作者在三个多月前声明这个项目停止维护了。不过作者推荐了&lt;a href=&quot;https://github.com/vsch&quot; target=&quot;_blank&quot;&gt;@vsch&lt;/a&gt;的&lt;a href=&quot;https://github.com/vsch/flexmark-java&quot; target=&quot;_blank&quot;&gt;flex-mark-java&lt;/a&gt;,另一个性能优越的markdown解析库。&lt;/p&gt;&lt;p&gt;&lt;code&gt;flexmark-java&lt;/code&gt;解析架构基于&lt;a href=&quot;https://github.com/atlassian/commonmark-java&quot; target=&quot;_blank&quot;&gt;commonmark-java&lt;/a&gt;,另一款解析库(开源的世界就是这么任性啊),想到罗永浩的那句生命不息，折腾不止，决定先用&lt;code&gt;commonmark-java&lt;/code&gt;解析，后面再切换到&lt;code&gt;flexmark-java&lt;/code&gt;。尽管是最简单的引用，并没有怎么折腾。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;搜索功能&lt;a href=&quot;#搜索功能&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;手册的数据，解析都准备好了，还有一个手册必不可少的功能——搜索。以前做项目的时候都是用EditText+Button来实现搜索功能的。虽然一直知道安卓有个原生的searchView，但是项目做视觉设计的小伙伴设计出来的视觉不给searchView用武之地。自从进TV应用开发的坑后，也好久没有开发手机APP了。基于这两个原因，决定在这个小应用中学习一下searchView的使用。
计划实现的是带搜索建议的searchView,这样可以尽量的简化在手机上的输入。searchView的配置很简单，但是搜索建议需要有一定的学习。
安卓现在推荐的是ActionBar中搜索，除了要增加一点actionView的配置，其他的跟searchView大同小异。正所谓磨刀不误砍柴工，何况之前没有系统的学习过searchView，于是开始找百度，找博客补习功课。
以searchView搜索看了几篇配置博文后，发现一个博客把谷歌的searchView介绍做了一个专题的介绍，于是把这几篇文章细读了一遍。在读这几篇译文的时候想起很多大牛的教导，要读就读一手的文档，最好是出自代码作者之手的，再次一点就是读一手文档的翻译。除了这两种文章干货较多，其他类型的文章往往介绍得不够全面。
&lt;a href=&quot;http://developer.android.com/guide/topics/search/search-dialog.html&quot; target=&quot;_blank&quot;&gt;英文原文（需要翻墙）&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/hudashi/article/details/7052815&quot; target=&quot;_blank&quot;&gt;译文第一篇：[Searchable(一)]&lt;/a&gt;(剩下的几篇链接就不贴了，在文末有上下篇的链接跳转)&lt;/p&gt;&lt;p&gt;依照译文的介绍，我对搜索功能有了大概的方向。主要做了以下几点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;把前面获取到的MD文件放到assets目录下，用&lt;code&gt;AssetsManager&lt;/code&gt;进行管理，这样就可以不用数据库了。展示命令详情的时候，也可以直接读取到命令对应文件流，再方便不过了。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;searchView&lt;/code&gt;的搜索建议需要有一个&lt;code&gt;ContentProvider&lt;/code&gt;来提供搜索建议的数据源，没有数据库怎么用ContentProvider? 答案是&lt;code&gt;MatrixCursor&lt;/code&gt;。&lt;code&gt;MatrixCursor&lt;/code&gt;可以做到模拟数据库的作用，也提供方法方便插入数据等。&lt;/li&gt;
&lt;li&gt;有了实现&lt;code&gt;ContentProvider&lt;/code&gt;的思路,只需把&lt;code&gt;AssetsManager&lt;/code&gt;获取到的命令文件名作为数据，提供给&lt;code&gt;searchView&lt;/code&gt;来查询就可以了。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;总结&lt;a href=&quot;#总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;手册的实现并没有什么难度，在补充了相关的知识后，只需要不到半天的时间就可以搞定了。项目虽小，但是还是给我不少收获的。之前看到有一篇文章，名字叫《提问的智慧》。搜索其实就是向机器提问的一种方式，科学的搜索关键词，合适的网站搜索事半功倍。搜索还是首选 &lt;a href=&quot;http://www.google.com&quot; target=&quot;_blank&quot;&gt;Google.com&lt;/a&gt; 和 &lt;a href=&quot;http://stackoverflow.com&quot; target=&quot;_blank&quot;&gt;stackoverflow.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;项目地址：
&lt;a href=&quot;https://github.com/Ernest-su/LinuxCmd&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;
&lt;a href=&quot;https://git.coding.net/ernest/LinuxCmd.git&quot; target=&quot;_blank&quot;&gt;coding.net&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Lottie,我们幕后新的开源动效工具</title><link>https://ernest-su.github.io/lottie-behind-the-scenes-of-our-new-open-source-animation-tool/</link><guid isPermaLink="true">https://ernest-su.github.io/lottie-behind-the-scenes-of-our-new-open-source-animation-tool/</guid><description>airbnb开源了一套适用于Android和iOS动效库。虽然尚在快速迭代中，但是已经忍不住在项目中小范围试用。无奈新开源的项目文档比较少。在airbnb设计部门的网站上看到一篇介绍Lottie的文章，试着翻一下。本文是第一次翻译英文文档，翻译不当或不专业的地方欢迎指教。</description><pubDate>Mon, 20 Mar 2017 04:30:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;airbnb开源了一套适用于Android和iOS动效库。虽然尚在快速迭代中，但是已经忍不住在项目中小范围试用。无奈新开源的项目文档比较少。在airbnb设计部门的网站上看到一篇介绍Lottie的文章，试着翻一下。本文是第一次翻译英文文档，翻译不当或不专业的地方欢迎指教。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在过去，为Android，IOS,React Native应用创建复杂的动效，是一个困难又费时的过程。您要么为每种屏幕分辨率添加笨重的图像文件，要么写上千行难以扩展维护的代码。正因为如此，尽管动效是一个沟通的想法和创造引人注目的用户体验的强大工具，大多数应用程序并不使用动效。一年前，我们开始改变这种情况。&lt;/p&gt;
&lt;p&gt;今天，我们很高兴介绍我们的解决方案。Lottie是一个可用于iOS，Android和React Native 的库，实时渲染 After Effects动效，并允许开发者在原生应用程序中使用动效像使用图片等静态资源一样简单。Lottie使用一个开源的After Effects插件(Bodymovin)导出的JSON文件形式的动效数据，这个插件捆绑了一个JavaScript播放器，可以在网络上渲染动画。从2015二月开始，Bodymovin的作者Hernan Torrisi，每月通过给插件增加新功能，改进现有功能，为我们的Lottie项目建立了一个坚实的基础。我们的团队（Brandon Withrow负责iOS，Gabriel Peal负责Android，Leland Richardson负责React Native，我负责体验设计）在Torrisi的杰出工作基础上开始Lottie开发之旅。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://airbnb.design/wp-content/uploads/2017/02/icons.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Lottie使得程序猿无痛实现丰富的动效。如上图所示的Nick Butcher跳跃动效，Bartek Lipinski的汉堡式菜单，Miroslaw Stanek的推特心等等，如果用代码从头开始实现四多么困难和费时。有了Lottie，诸如深入了解框架，预估动画时间，手动创建贝赛尔曲线，重新制作GIF参考动效将成为过去式。现在程序猿可以准确地使用设计师设计的动效，确切地说动效是如何制造的，我们实现的就是怎样。为了展示这一点，我们已经重新创建上面的动画，并在我们的示例应用程序提供After Effects和JSON文件。&lt;/p&gt;
&lt;p&gt;我们的目标是尽我们所能支持尽可能多的After Effects 的功能，而不仅仅是简单的图标动画。我们还创建了一些其他示例来显示Lottie库的灵活性、丰富性和进阶功能集。在示例应用程序中，还有各种不同类型动画的源文件，包括基本线条艺术、基于字符的动效以及多角度的logo动效。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://airbnb.design/wp-content/uploads/2017/01/screens_1.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们已经在屏幕的各个角落开始使用我们设计的Lottie动效，包括下图所示的应用程序的通知，全帧动画插图，回访评价页面等。我们计划通过有趣且有用的方式大幅度扩大动画使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://airbnb.design/wp-content/uploads/2017/01/screens_2.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;灵活高效的解决方案&lt;a href=&quot;#灵活高效的解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Airbnb是支持数以百万计的房东和房客的全球化公司，所以有一个灵活的动画格式，且可以在多种平台上使用，对我们而言非常重要。现在已经有与Lottie相似的动效库，如Marcus Eckert的Squall和Facebook的Keyframes。但我们的目标稍有不同。Facebook挑选了一小部分After Effects的功能提供支持，因为他们主要集中在交互，但我们想支持尽可能多。至于Squall，Airbnb的设计师用它和Lottie组合使用，因为它有一个神奇的After Effects预览APP，所以成为我们工作中必不可少的一部分。然而，它只支持iOS，但是我们的工程团队需要一个跨平台的解决方案。&lt;/p&gt;&lt;p&gt;Lottie有几个功能内置了它的API，使其更加灵活和高效。它支持从网络上加载JSON文件，这对A / B测试非常有用。它也有一个可选的缓存机制，所以经常使用的动画，如愿望列表的心型图标可以每次加载缓存的副本。Lottie也可以使用动效的进度功能实现用手势调整动画的进度，以及通过改变一个简单的值从而改变动画的速度。iOS版本甚至支持在运行时向动画添加额外的本地UI，可用于复杂的动画转换。&lt;/p&gt;&lt;p&gt;我们工作到目前为止，除了所有的After Effects功能和API的补充，也有很多未来的想法。这些包括映射View到Lottie动画，使用Lottie控制的View的转换，提供Battle Axe的 &lt;a href=&quot;http://www.battleaxe.co/rubberhose/&quot; target=&quot;_blank&quot;&gt;RubberHose&lt;/a&gt;，梯度，类型和图像的支持（译者注：最新版已经支持图像）。最难的部分是下一步先挑选哪些功能实现。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://airbnb.design/wp-content/uploads/2017/01/hardware.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;构建社区&lt;a href=&quot;#构建社区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;发布开源的东西不仅仅是把它放在那里供大家使用。它是连接人们和创造社区的桥梁。随着我们通过GitHub发布Lottie给设计师和程序猿而走得更近，我们希望确保与动画分支连接。（As we got closer to releasing Lottie to designers and engineers via GitHub, we wanted to be sure to connect with the animation folks as well.）&lt;/p&gt;&lt;p&gt;我们的灵感来自&lt;a href=&quot;http://9-squares.tumblr.com/&quot; target=&quot;_blank&quot;&gt;9 Squares&lt;/a&gt;,&lt;a href=&quot;https://motioncorpse.tumblr.com/&quot; target=&quot;_blank&quot;&gt; Motion Corpse&lt;/a&gt;, 以及 Animography 创造的社区。这三个社区都汇集了来自世界各地的人，如果没有这些社区他们将不能在公共动画项目上合作。这些项目需要数月的工作以及组织各自的团队跟人们进行讨论，但这些毋容置疑作为一个整体为动画社区提供了巨大的价值。Motion Corpse 和Animography 公开分享After Effects 源文件，提供关于人们如何创作的不同见解。&lt;/p&gt;&lt;p&gt;追随他们的协作的领先脚步，我们达成协议，这三个团队贡献动画到我们的示例应用程序中。如下图所示，我们已经包括了由J.R. Canest创建一个动画（来自Motion Corpse），一个来自Al Boardman squares的动效 ，和一个使用animography Mobilo动画字体的动效键盘，包含20多个艺术家设计的字母。我们希望整合这些动画社区，强大的工程社区将擦除独特的火花。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://airbnb.design/wp-content/uploads/2017/01/community.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;&lt;p&gt;我们很乐意听到你如何使用Lottie-不管你是一名设计师，动画设计师还是程序猿。随时联系我们直接与你们的思想，&lt;a href=&quot;#&quot;&gt;lottie@airbnb.com&lt;/a&gt;反馈和见解。我们很高兴看到世界各地的社区以我们从未想过的方式开始使用Lottie。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;译者注：airbnb已上线一个Lottie动效采集分享网站
&lt;a href=&quot;http://www.lottiefiles.com&quot; target=&quot;_blank&quot;&gt;lottiefiles.com&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;下载 &lt;a href=&quot;https://github.com/bodymovin/bodymovin&quot; target=&quot;_blank&quot;&gt;Bodymovin&lt;/a&gt;, Lottie&lt;a href=&quot;https://github.com/airbnb/lottie-ios&quot; target=&quot;_blank&quot;&gt;iOS&lt;/a&gt;, &lt;a href=&quot;https://github.com/airbnb/lottie-android&quot; target=&quot;_blank&quot;&gt;Android&lt;/a&gt; 以及 &lt;a href=&quot;https://github.com/airbnb/lottie-react-native&quot; target=&quot;_blank&quot;&gt;React Native&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;这篇文章由  Brandon Withrow,  Gabriel Peal 以及 Salih Abdul-Karim 共同完成&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://airbnb.design/introducing-lottie/&quot; target=&quot;_blank&quot;&gt;英文版原文链接&lt;/a&gt;
&lt;a href=&quot;http://www.suqishuo.cn/introducing-lottie/lottie-behind-the-scenes-of-our-new-open-source-animation-tool&quot; target=&quot;_blank&quot;&gt;译文原文链接&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>greenDAO项目实战-ToOne-ToMany实现一对一，一对多关联映射</title><link>https://ernest-su.github.io/greendao-project-practice-toone-tomany/</link><guid isPermaLink="true">https://ernest-su.github.io/greendao-project-practice-toone-tomany/</guid><description>在上一篇文章greenDAO项目实战中，我们对GreenDao有了初步的认识。今天我们熟悉一下GreenDao中使用`ToOne`和`ToMany`实现一对一，一对多关联映射。本文在上篇的基础上进行。</description><pubDate>Mon, 20 Mar 2017 03:14:27 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;在上一篇文章&lt;a href=&quot;http://www.suqishuo.cn/greendao-project-practice/&quot; target=&quot;_blank&quot;&gt;greenDAO项目实战&lt;/a&gt;中，我们对GreenDao有了初步的认识。今天我们熟悉一下GreenDao中使用&lt;code&gt;ToOne&lt;/code&gt;和&lt;code&gt;ToMany&lt;/code&gt;实现一对一，一对多关联映射。本文在上篇的基础上进行。&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;添加Category类&lt;a href=&quot;#添加category类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我们现在对上一篇的Note进行扩展，添加类别。我们假设一个Note属于一个类别Category，一个类别Category可以拥有多个Note.&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Entity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Id&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ToMany&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;referencedJoinProperty&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;categoryId&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; notes&lt;/span&gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;修改Note类，Category信息&lt;a href=&quot;#修改note类category信息&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Entity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Id&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;autoincrement&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;NotNull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; comment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt; date&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Convert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;converter&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NoteTypeConverter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;columnType&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; categoryId&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ToOne&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;joinProperty&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;categoryId&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt; category&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//省略了其他的geter,setter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;注解分析&lt;a href=&quot;#注解分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;上面的Category类代码中：
&lt;code&gt;@ToMany(referencedJoinProperty = &quot;categoryId&quot;)&lt;/code&gt;这个注解表明，一个&lt;code&gt;Category&lt;/code&gt;可以拥有多个&lt;code&gt;Note&lt;/code&gt;（一对多）.&lt;code&gt;referencedJoinProperty= &quot;categoryId&quot;&lt;/code&gt;表示使用&lt;code&gt;Note&lt;/code&gt;类中的&lt;code&gt;categoryId&lt;/code&gt;字段进行关联。注意这个字段应该是Long类型.在Category中用&lt;code&gt; List&amp;lt;Note&amp;gt; notes&lt;/code&gt;表示拥有的Note.&lt;/p&gt;&lt;p&gt;上面的Note类代码中：
&lt;code&gt;@ToOne(joinProperty = &quot;categoryId&quot;)&lt;/code&gt;这个注解表明，一个&lt;code&gt;Note&lt;/code&gt;属于一个&lt;code&gt;Category&lt;/code&gt;。注意我们添加了&lt;code&gt;private Long categoryId&lt;/code&gt;这字段，然后在&lt;code&gt;@ToOne&lt;/code&gt;注解中使用&lt;code&gt;joinProperty = &quot;categoryId&quot;&lt;/code&gt;把&lt;code&gt;Category&lt;/code&gt;用&lt;code&gt;categoryId&lt;/code&gt;关联起来。&lt;/p&gt;&lt;p&gt;经过在一的端（Category）使用&lt;code&gt;@ToMany&lt;/code&gt;，在多的端（Note）使用&lt;code&gt;@ToOne&lt;/code&gt;,我们就把一对多和多对一关联关系建立起来了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;使用&lt;a href=&quot;#使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;       &lt;/span&gt;&lt;span&gt;//添加一个类别:技术分享.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt; category &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;技术分享&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;categoryDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(category);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//添加一个类别:心灵鸡汤.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;category &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Category&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2L&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;心灵鸡汤&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;categoryDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(category);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//添加一条技术分享note记录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt; note &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note内容文本，技术分享&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setComment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note的comment&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setCategoryId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt;//设置分类为技术分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(note);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//再添加一条技术分享note记录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;note &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note内容文本，也是技术分享&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setComment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note的comment&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setCategoryId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt;//设置分类为技术分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(note);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//接着添加一条属于心灵鸡汤Note记录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;note &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note内容文本，心灵鸡汤&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setComment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note的comment&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setCategoryId&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;2L&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;span&gt;//设置分类为心灵鸡汤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(note);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//查询所有的分类为技术分享（id=1）的note数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; notes &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;categoryDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getNotes&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(notes);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//通过Note反查Category&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;getCategory&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;getName&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//顺便演示一下通过对文本内容的模糊查询匹配返回包含&quot;心灵鸡汤&quot;文本的Note。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;notes &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;queryBuilder&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;where&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;like&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;%心灵鸡汤%&quot;&lt;/span&gt;&lt;span&gt;)).&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;out&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;println&lt;/span&gt;&lt;span&gt;(notes);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;</content:encoded></item><item><title>微信公众号没有你想的那么简单</title><link>https://ernest-su.github.io/wechat-subscription-not-that-simple/</link><guid isPermaLink="true">https://ernest-su.github.io/wechat-subscription-not-that-simple/</guid><description>老婆在一个艺术培训中心上班，最近她的领导说想要开一个公众号。由于他们对这一块一窍不通，于是咨询起我这个专业人士来。说实话我只是个人捣鼓过微信公众号开发，没有运营或者开发商业微信公众号。但是对于其中的原理还是大概了解的。这不说不要紧，经过跟老婆的一番讨论，发现无论是开发还是运营一个</description><pubDate>Sat, 18 Mar 2017 07:56:58 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h1&gt;前言&lt;a href=&quot;#前言&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;老婆在一个艺术培训中心上班，最近她的领导说想要开一个公众号。由于他们对这一块一窍不通，于是咨询起我这个专业人士来。说实话我只是个人捣鼓过微信公众号开发，没有运营或者开发商业微信公众号。但是对于其中的原理还是大概了解的。这不说不要紧，经过跟老婆的一番讨论，发现无论是开发还是运营一个微信公众号，都没有想象中那么简单。&lt;/p&gt;&lt;p&gt;这篇文章不讨论大企业的微信公众号，我们讨论一下像他们这种小微型企业的需求以及他们可能遇到的坑。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;需求分析&lt;a href=&quot;#需求分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;首先我们明确一下大概的背景和需求。公司有两三个领导，员工不多，几个人负责教务管理，属于培训中心的后勤保障。剩下的就是几十个老师定期上课培训。培训课有中国舞，芭蕾舞，书法画画，围棋等等。每个培训班人数从几个到十几个不等。那使用这套系统的人就有以下几类：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;培训中心的领导&lt;/li&gt;
&lt;li&gt;教务员工&lt;/li&gt;
&lt;li&gt;培训老师&lt;/li&gt;
&lt;li&gt;家长学生&lt;/li&gt;
&lt;li&gt;目前没有孩子参加培训，将来可能参加的潜家长&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;系统的使用人群种类不算多，人数顶多也就是上千。我们大概梳理一下可能的需求。&lt;/p&gt;&lt;p&gt;对于领导：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;查看中心运营情况。包括财务收支，招生情况，课程开设情况等&lt;/li&gt;
&lt;li&gt;管理审批。主要是培训老师的管理，员工管理，以及财务和开设课程管理&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;对于员工：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;查看管理招生情况，课程开设情况等。跟领导的需求差不多，只不过有些数据只有领导有权限查看操作。&lt;/li&gt;
&lt;li&gt;上传下达。主要是录入信息向领导汇报财务收支，招生情况，课程运营情况等。向老师和家长通知开停课通知，收费缴费及活动通知等。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;对于家长：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;中心信息查询。包括中心的办学情况，课程开设情况，老师简介等。&lt;/li&gt;
&lt;li&gt;课程查询。包括课程费用，上课时间，剩余课时等。&lt;/li&gt;
&lt;li&gt;费用查询。包括缴费记录，剩余费用，续费等。&lt;/li&gt;
&lt;li&gt;通知查询。主要是通过微信推送通知信息。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;附上跟老婆讨论时候画的一张思维导图，反映了目前大部分需求。
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;/images/%E5%9F%B9%E8%AE%AD%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F.png&quot; alt=&quot;培训管理系统需求&quot; /&gt;&lt;figcaption&gt;培训管理系统需求&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;方案选择&lt;a href=&quot;#方案选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;摆在他们面前的有两种方案。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;购买专门为这个行业定制的一整套系统。&lt;/li&gt;
&lt;li&gt;请一个开发团队针对他们的需求进行开发。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;两种方案各有优劣，我们用表格的方式对比一下。&lt;/p&gt;

















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;购买行业已有系统&lt;/th&gt;&lt;th&gt;找团队定制开发&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;价格&lt;/td&gt;&lt;td&gt;参差不齐,根据系统功能和公司销售策略而定&lt;/td&gt;&lt;td&gt;根据需求定，可议价性高&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;后期费用&lt;/td&gt;&lt;td&gt;主要是后期的维护服务费，相关硬件设备（IC卡，打卡机等）购置费&lt;/td&gt;&lt;td&gt;主要是保证系统正常运行的主机，带宽，域名费用等。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;功能&lt;/td&gt;&lt;td&gt;功能丰富，能满足大部分需要，但可定制化不高，很多功能用不上&lt;/td&gt;&lt;td&gt;由需求方提出，一般没有累赘的功能。但需求不够明确容易漏掉某些需要的功能&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;维护&lt;/td&gt;&lt;td&gt;一般由开发公司维护，每个月收取维护服务费&lt;/td&gt;&lt;td&gt;开发完成后有一段维护期，到期后不负责维护或要根据情况收取维护费用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;系统稳定性&lt;/td&gt;&lt;td&gt;取决于开发公司，一般有专人维护，能够保证系统正常运行.由于系统不止一家同行业公司使用，系统出现重大问题概率不高&lt;/td&gt;&lt;td&gt;取决于开发质量。在系统试运行期间可能问题较多&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;数据安全性&lt;/td&gt;&lt;td&gt;取决于开发公司。如果终止合同，使用其他公司产品，或者开发公司倒闭，数据得不到保障&lt;/td&gt;&lt;td&gt;数据保存在云服务器上，可按需备份。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;数据可用性&lt;/td&gt;&lt;td&gt;只能在系统内使用，不可定制，进一步分析利用。部分系统可导出到文件&lt;/td&gt;&lt;td&gt;可根据需要对数据进行进一步定制，分析，利用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;扩展性&lt;/td&gt;&lt;td&gt;取决于开发公司。有的开发公司提供有限的有偿的二次开发。可扩展性不高&lt;/td&gt;&lt;td&gt;可按需由原开发者或找新的开发者开发定制&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;结论&lt;a href=&quot;#结论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;经过上面的对比，我们可以看出无论是购买行业已有系统还是找团队定制开发，都不是像去超市购买商品那样一次性搞定。从方案选择就有很多因素需要长远考虑。&lt;/p&gt;&lt;p&gt;总的来说，购买行业已有系统前期要付出的精力会少很多，但是对系统的依赖较大，一旦选择了，对系统就产生了高度的依赖，很难切换到其他的产品。这种依赖会随着时间和数据的积累越来越难摆脱。终止合同或更换系统对已有数据几乎是毁灭性的从头再来。&lt;/p&gt;&lt;p&gt;而找团队定制开发很大程度取决于需求够不够明确，以及开发团队的质量。对于技术没有大概了解的，不容易看出潜在的风险。这风险包括由于开发团队一般不熟悉这个行业，对需求的理解会有所偏差，开发出来的系统是否符合现有需求以及将来的扩展需要，系统的质量也要一段时间的使用才能得知。&lt;/p&gt;&lt;p&gt;其实无论是开一个微信公众号还是开发一个APP，或者是上一套系统，都会面临着同样的问题。这也就很好理解为什么那么多公司迟迟没有用上现代化的系统，甚至仍然停留在纸和笔或者word，excel来处理各种事务了。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>greenDAO项目实战</title><link>https://ernest-su.github.io/greendao-project-practice/</link><guid isPermaLink="true">https://ernest-su.github.io/greendao-project-practice/</guid><description>在安卓移动APP开发过程中，一般使用安卓默认的sqlite数据库做数据持久化存储。虽然android提供了ContentProvider等框架支持，但是写SQL语句依然是一件不少程序猿的头疼的事。无论是简单的SQL语句，还是复杂的多表查询，都是影响开发效率的苦力活。幸运的是，我们</description><pubDate>Thu, 16 Mar 2017 09:13:27 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;在安卓移动APP开发过程中，一般使用安卓默认的sqlite数据库做数据持久化存储。虽然android提供了ContentProvider等框架支持，但是写SQL语句依然是一件不少程序猿的头疼的事。无论是简单的SQL语句，还是复杂的多表查询，都是影响开发效率的苦力活。幸运的是，我们有类似于Hibernate/MyBatis的ORM框架用于安卓开发中。今天我们介绍gitHub上热门的一个专注于Android开发的ORM框架——greenDAO.&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;greenDAO简介&lt;a href=&quot;#greendao简介&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;greenDAO是一个轻量&amp;amp;快速的安卓ORM框架,把对象和Sqlite数据库关联映射起来。它专门为Android做了高度的优化，高性能，消耗极少的内存。
&lt;strong&gt;greenDAO首页, 开发文档以及技术支持链接: &lt;a href=&quot;http://greenrobot.org/greendao/&quot; target=&quot;_blank&quot;&gt;http://greenrobot.org/greendao/&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;&lt;figure&gt;&lt;img src=&quot;http://greenrobot.org/wordpress/wp-content/uploads/greenDAO-orm-320.png&quot; alt=&quot;greendao图解&quot; /&gt;&lt;figcaption&gt;greendao图解&lt;/figcaption&gt;&lt;/figure&gt;
&lt;strong&gt;GreenDAO特色功能&lt;/strong&gt;：&lt;p&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;稳健：GreenDAO从2011开始，就被无数著名的应用程序使用&lt;/li&gt;
&lt;li&gt;超级简单：简洁直截了当的API，支持注释（V3以上版本）&lt;/li&gt;
&lt;li&gt;小巧：框架小于150K,并且只是普通的java jar（没有CPU相关的本地部分）减少构建时间避免超出 65k方法数限制&lt;/li&gt;
&lt;li&gt;快速：可能是全球最快的Android平台ORM框架，得益于gradle插件，框架能够自动智能执行代码生成&lt;/li&gt;
&lt;li&gt;安全且人性化的查询API：QueryBuilder使用属性常量，避免拼写错误（这是SQL语句拼接查询常见的错误）&lt;/li&gt;
&lt;li&gt;强大的连接：跨实体的查询，甚至嵌套复杂的多表链接和多条件关系查询&lt;/li&gt;
&lt;li&gt;灵活的属性类型：在实体中使用自定义的类或枚举表示数据&lt;/li&gt;
&lt;li&gt;加密：支持SQLCipher加密数据库&lt;/li&gt;
&lt;li&gt;活跃的社区:超过7000 GitHub stars&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;在项目中使用GreenDAO&lt;a href=&quot;#在项目中使用greendao&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;greenDAO 在 Maven 仓库可用. 请保证点击以下链接检查你使用的是否是最新版本&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.greenrobot%22%20AND%20a%3A%22greendao%22&quot; target=&quot;_blank&quot;&gt;greenDAO最新版链接 &lt;/a&gt;| &lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.greenrobot%22%20AND%20a%3A%22greendao-generator%22&quot; target=&quot;_blank&quot;&gt;greenDAO-generator最新版链接&lt;/a&gt;&lt;/p&gt;&lt;p&gt;添加以下的Gradle配置到安卓项目：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 在项目根目录的 build.gradle 文件:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;buildscript {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;repositories {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;jcenter&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mavenCentral&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;-- 添加这个仓库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;dependencies {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;classpath &lt;/span&gt;&lt;span&gt;&apos;com.android.tools.build:gradle:2.3.0&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;classpath &lt;/span&gt;&lt;span&gt;&apos;org.greenrobot:greendao-gradle-plugin:3.2.1&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;-- 添加greendao用到的gradle插件，用于生成GreenDao用到的代码（注意使用最新版本）&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;// 在app 项目的 build.gradle 文件:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apply &lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;com.android.application&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;apply &lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;org.greenrobot.greendao&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;-- &lt;/span&gt;&lt;span&gt;应用greendao的gradle插件&lt;/span&gt;&lt;span&gt;(用于生成GreenDao用到的代码)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//(可选)配置数据库版本，生成的Dao包路径(无特殊要求除了schemaVersion，daoPackage和targetGenDir一般不用配置，使用默认的)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;greendao {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;schemaVersion &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;daoPackage &lt;/span&gt;&lt;span&gt;&apos;com.example.greendao&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;targetGenDir &lt;/span&gt;&lt;span&gt;&apos;src/main/java&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//------------&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dependencies {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;compile &lt;/span&gt;&lt;span&gt;&apos;org.greenrobot:greendao:3.2.0&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;-- 添加greenDao框架依赖&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//如果需要数据库加密，要引入一下sqlcipher加密库&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;//compile &apos;net.zetetic:android-database-sqlcipher:3.5.4&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; 这些配置使得GreenDao插件在Gradle构建过程中触发，当项目构建时.插件生成 DaoMaster, DaoSession 以及实体类对应的DAO.这些类是GreenDao框架的核心类&lt;/p&gt;&lt;section&gt;&lt;h3&gt;声明实体类&lt;a href=&quot;#声明实体类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;首先，我们声明一个实体类Note,一个自定义的枚举类型NoteType。&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;LIST&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;PICTURE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Entity&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Id&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;autoincrement&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;NotNull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; text&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; comment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt; date&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Convert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;converter&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NoteTypeConverter&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;columnType&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Generated&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1272611929&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; id;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Generated&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;hash&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1686394253&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, @&lt;/span&gt;&lt;/span&gt;&lt;span&gt;NotNull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;util&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; id;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; comment;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; date;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; type;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;NotNull&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getText&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; text;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/** 非空值声明，保证这个只在保存到数据之前是非空的**/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(@&lt;/span&gt;&lt;span&gt;NotNull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; text;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;//省略了其他的geter,setter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;上面的实体类代码中：&lt;/p&gt;&lt;p&gt;&lt;code&gt;@Entity&lt;/code&gt;注解表明这是一个GreenDao映射到数据的实体类，括号内的配置是可选的。&lt;/p&gt;&lt;p&gt;&lt;code&gt;@Id&lt;/code&gt;注解表明这是主键,&lt;code&gt;autoincrement = true&lt;/code&gt;表示自增，&lt;strong&gt;注意&lt;/strong&gt;GreenDao主键需要是Long类型，不能是long或者int之类的其他类型。（这也是安卓推荐的主键类型）&lt;/p&gt;&lt;p&gt;&lt;code&gt;@NotNull&lt;/code&gt; 注解表明这是一个非空值，在它的setter参数也注明了非空，保证这个只在保存到数据之前是非空的。&lt;/p&gt;&lt;p&gt;&lt;code&gt;@Convert(converter = NoteTypeConverter.class, columnType = String.class)&lt;/code&gt;这个注解实现自定义类型到数据库支持的类型的转换。&lt;code&gt;converter = NoteTypeConverter.class&lt;/code&gt;指定转换器是NoteTypeConverter这个类（下面马上介绍），&lt;code&gt;columnType = String.class&lt;/code&gt;指定数据库对应的列类型是文本类型。通过Convert我们可以用自然的方式表达各种属性。&lt;/p&gt;&lt;p&gt;&lt;code&gt;@Transient&lt;/code&gt;上面的例子没有标出。这个注解表明此字段不存储到数据库中，用于不用持久化的字段&lt;/p&gt;&lt;p&gt;值得说明的是，实体类的构造函数和getter/setter是greendao在项目build的时候自动生成的，是不是很方便呢？&lt;/p&gt;&lt;p&gt;接下来我们再看看转换器的写法。转换器听起来很高级有没有？但是写起来出乎意料的简单。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteTypeConverter&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;implements&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PropertyConverter&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToEntityProperty&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;databaseValue&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;valueOf&lt;/span&gt;&lt;span&gt;(databaseValue);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;String&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;convertToDatabaseValue&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entityProperty&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entityProperty&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;每个转换器都实现了&lt;code&gt;PropertyConverter&amp;lt;P, D&amp;gt;&lt;/code&gt; 这个接口。P是实体类中自定义的类型，D是数据库支持的类型。&lt;/p&gt;&lt;p&gt;接口方法&lt;code&gt;convertToEntityProperty&lt;/code&gt;接受一个数据库支持类型的参数，返回实体类中自定义的类型。&lt;/p&gt;&lt;p&gt;接口方法&lt;code&gt;convertToDatabaseValue&lt;/code&gt;接受一个实体类中自定义的类型的参数，返回数据库支持类型。&lt;/p&gt;&lt;p&gt;通过实现这两个方法，我们就完成了实体类的自定义类型到数据库支持类型的映射。在本例中，&lt;code&gt;NoteType&lt;/code&gt;这个自定义的枚举类型得以用文本方式存储到数据库。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;在Application中配置DaoSession&lt;a href=&quot;#在application中配置daosession&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;blockquote&gt;&lt;p&gt;接着，我们在App中配置DaoSession，作为数据统一操作的对象，注意DaoSession所在的包如果未配置，默认跟声明的实体类包名相同&lt;/p&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;App&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;extends&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Application&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/**是否加密标志。通过这个例子展示给我们greendao从用SQLCipher加密数据库到标准的sqlite切换时多么简单.打开数据库加密需要引入SQLCipher相关的库*/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;static&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;final&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;span&gt; ENCRYPTED &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;/**全局公用的DaoSession**/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DaoSession&lt;/span&gt;&lt;span&gt; daoSession&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;Override&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;super&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;onCreate&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//DevOpenHelper简单的在数据库需要升级的时候重建数据表，在实际项目中，如果我们需要保存旧版本的数据，需要自己实现一个OpenHelper,把旧版本数据迁移到新版本中。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;DevOpenHelper&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;helper&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DevOpenHelper&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;, ENCRYPTED &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;notes-db-encrypted&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;notes-db&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Database&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ENCRYPTED &lt;/span&gt;&lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;helper&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getEncryptedWritableDb&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;super-secret&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;helper&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getWritableDb&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;daoSession &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DaoMaster&lt;/span&gt;&lt;span&gt;(db).&lt;/span&gt;&lt;span&gt;newSession&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DaoSession&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;getDaoSession&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; daoSession;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;** 提醒 **
记得在&lt;code&gt;AndroidManifest.xml&lt;/code&gt;中配置App.&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;application&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;android:name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;.App&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;application&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;到这里，我们从实体类的声明，数据库操作入口都已经建立好了。没有写一行SQL，是不是有一种畅快淋漓的感觉？下面我们用几个代码片段展示一下如何通过greendao进行数据的增删改查。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;查询所有的note列表&lt;a href=&quot;#查询所有的note列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 获得note对应的DAO。Dao在build的时候自动生成&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;DaoSession&lt;/span&gt;&lt;span&gt; daoSession &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ((App) &lt;/span&gt;&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span&gt;getDaoSession&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//我们通过这个noteDao进行增删改查的操作&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;NoteDao&lt;/span&gt;&lt;span&gt; noteDao &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;daoSession&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getNoteDao&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;//查询所有的note数据&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; notes &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;loadAll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;// 查询所有的note数据, 根据note的文本内容根据a-z升序排序.这里的NoteDao.Properties.Text是greendao自动生成的，上面提到的属性常量。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;notes &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;queryBuilder&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;orderAsc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Properties&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;根据id来查询一个note记录,修改后再保存到数据库里&lt;a href=&quot;#根据id来查询一个note记录修改后再保存到数据库里&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1L&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt; note &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(id);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是修改后的内容文本&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setComment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是修改后的comment&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;save&lt;/span&gt;&lt;span&gt;(note);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;删除所有note记录&lt;a href=&quot;#删除所有note记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleteAll&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;根据id删除一条note记录&lt;a href=&quot;#根据id删除一条note记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Long&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;deleteByKey&lt;/span&gt;&lt;span&gt;(id);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;添加一条note记录&lt;a href=&quot;#添加一条note记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt; note &lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Note&lt;/span&gt;&lt;span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setText&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note 内容文本&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setComment&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;这是note的comment&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setDate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Date&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;note&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;setType&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NoteType&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;TEXT&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;noteDao&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;insert&lt;/span&gt;&lt;span&gt;(note);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;后记&lt;a href=&quot;#后记&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;greenDao的简单介绍就到这里。后续介绍GreenDao的进阶使用，包括&lt;code&gt;@ToOne&lt;/code&gt; 一对一， &lt;code&gt;@ToMany&lt;/code&gt; 一对多等使用介绍。同时介绍如何在现有项目中迁移到GreenDao，包括用统一的数据库管理类来对GreenDao进行轻度封装等。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>如何快速搭建模拟接口服务</title><link>https://ernest-su.github.io/how-to-build-api-mock-service/</link><guid isPermaLink="true">https://ernest-su.github.io/how-to-build-api-mock-service/</guid><description>相信大家在移动APP开发中，无论是做安卓还是iOS开发，都会遇到一个很尴尬的问题,接口没有开发好。而请求网络接口数据是开发中开发流程的第一步，因此方便快捷的模拟接口返回数据给APP，有助于提高开发效率。</description><pubDate>Fri, 03 Mar 2017 09:30:55 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;相信大家在移动APP开发中，无论是做安卓还是iOS开发，都会遇到一个很尴尬的问题,接口没有开发好。而请求网络接口数据是开发中开发流程的第一步，因此方便快捷的模拟接口返回数据给APP，有助于提高开发效率。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;下面介绍2个工具来搭建模拟接口服务器。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;moco&lt;/li&gt;
&lt;li&gt;ngrok&lt;/li&gt;
&lt;/ul&gt;
&lt;section&gt;&lt;h1&gt;moco&lt;a href=&quot;#moco&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;blockquote&gt;&lt;p&gt;在过去，我们通常部署一个war包到应用服务器，如Jetty或Tomcat等。我们都知道，开发一个war包然后部署到应用程序服务器太无聊，即使我们使用内嵌服务器，只要我们改变一点点，war包就要重新部署。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;moco是一款开源的专注于模拟接口数据的开源工具。它有以下优势：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 使用简单：提供下载一个jar文件外加简单的json配置就可运行的方式&lt;/li&gt;
&lt;li&gt; 配置灵活：可以用独立jar包加载json方式配置，也可以写java代码配置&lt;/li&gt;
&lt;li&gt; 高度可配置：可以对url，参数,请求方法，返回内容等进行配置&lt;/li&gt;
&lt;li&gt; 扩展强大：HTTPS，Socket，JUnit 集成，Maven 插件，Gradle 插件，Shell，Scala，满足你不同爱好&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h2&gt;例子&lt;a href=&quot;#例子&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.11.0/moco-runner-0.11.0-standalone.jar&quot; target=&quot;_blank&quot;&gt;moco独立运行程序&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;新建moco配置文件如下(foo.json):&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;response&quot;&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;&quot;text&quot;&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;&quot;Hello, Moco&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;使用配置文件运行moco独立运行文件.&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;java&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-jar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;moco-runner-&amp;lt;version&amp;gt;-standalone.jar&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;12306&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;foo.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;现在，打开浏览器访问 &lt;a href=&quot;http://localhost:12306&quot; target=&quot;_blank&quot;&gt;http://localhost:12306&lt;/a&gt; ，你会看见配置的返回内容”Hello, Moco”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;更多使用方法，请参考&lt;a href=&quot;https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md#content&quot; target=&quot;_blank&quot;&gt;moco的github说明文档&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;ngrok&lt;a href=&quot;#ngrok&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;如果是个人开发，一个简单灵活的接口服务器就已经搭建成功了。APP只要把上文的&lt;code&gt;localhost&lt;/code&gt;换成运行moco电脑的IP就能请求到模拟的数据。但是，手机和电脑需要同一个局域网。如果是团队开发，或者手机和电脑不在同一个局域网怎么办？ngrok就是用来解决这个问题的。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ngrok提供了一个能够在公网安全访问内网Web主机的工具，能捕获所有HTTP请求的内容，也支持TCP端口映射，支持Linux、Windows、Mac OS X 等平台。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;
ngrok V1.X的版本是可以免费支持将一个固定的二级域名指向本机的，不过作者已经把 V2.X的版本商业化,我们使用一个国内免费提供的服务。网址 &lt;a href=&quot;http://qydev.com&quot; target=&quot;_blank&quot;&gt;http://qydev.com&lt;/a&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载windows/linux/mac版本的客户端，解压到你喜欢的目录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在命令行下进入到解压目录下&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行 ngrok -config=ngrok.cfg -subdomain xxx 12306 //(xxx 是你自定义的域名前缀,12306是moco的端口)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果开启成功 你就可以使用 xxx.tunnel.qydev.com 来访问你本机的 &lt;code&gt;127.0.0.1:12306&lt;/code&gt;的服务啦&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;小技巧&lt;a href=&quot;#小技巧&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;打开 &lt;a href=&quot;http://127.0.0.1:4040&quot; target=&quot;_blank&quot;&gt;http://127.0.0.1:4040&lt;/a&gt; 可以查看ngrok访问情况。&lt;/p&gt;&lt;p&gt;在linux下，ngrok 不能用 &amp;amp; 实现后台运行，我们可以使用使用screen这个命令，步骤如下：&lt;/p&gt;&lt;p&gt;安装screen apt-get install screen 运行 screen -S&lt;/p&gt;&lt;p&gt;任意名字（例如：ngork） 然后运行ngrok启动命令&lt;/p&gt;&lt;p&gt;最后按快捷键&lt;code&gt;ctrl+A+D&lt;/code&gt;即可保持ngrok后台运行&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>安卓开发相关框架文章收集（长期更新）</title><link>https://ernest-su.github.io/android-collections/</link><guid isPermaLink="true">https://ernest-su.github.io/android-collections/</guid><description>在做项目初期，如果知道有哪些框架/工具可用，对项目的开发会有很大的帮助。这篇帖子收集项目开发用过的，或者有类似需求不知道有对应工具，后来发现这些工具有相见恨晚感觉的。作为一个类似于备忘录的帖子，根据个人判断在需要的时候进行增删改查。介绍时候尽量用一两个关键词。收集的文章可能会因各</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;在做项目初期，如果知道有哪些框架/工具可用，对项目的开发会有很大的帮助。这篇帖子收集项目开发用过的，或者有类似需求不知道有对应工具，后来发现这些工具有相见恨晚感觉的。作为一个类似于备忘录的帖子，根据个人判断在需要的时候进行增删改查。介绍时候尽量用一两个关键词。收集的文章可能会因各种原因失效，请以标题自行在搜索引擎搜索。帖子目的不是做到大而全且更新频繁。如果读者有这样的需求，良心推荐&lt;a href=&quot;http://gank.io&quot; target=&quot;_blank&quot;&gt;干货集中营&lt;/a&gt;,每日分享 &lt;strong&gt;妹子图&lt;/strong&gt; 和 ** 技术干货**，还有供大家中午休息的休闲视频&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;最近更新于 2017-03-24 &lt;a href=&quot;http://www.suqishuo.cn/android-collections/&quot; target=&quot;_blank&quot;&gt;原文才持续更新哦&lt;/a&gt;&lt;/p&gt;
&lt;section&gt;&lt;h1&gt;工具类&lt;a href=&quot;#工具类&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;DiffUtil&lt;a href=&quot;#diffutil&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;DiffUtil是一个查找集合变化的工具类，是搭配RecyclerView一起使用的。DiffUtil的作用，就是找出集合中每一个Item发生的变化，然后对每个变化给予对应的刷新。
&lt;a href=&quot;http://www.cnblogs.com/Fndroid/p/5789470.html&quot; target=&quot;_blank&quot;&gt;Android开发学习之路-DiffUtil使用教程&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;logger&lt;a href=&quot;#logger&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;简单，美观，功能强大的安卓打印工具。
&lt;a href=&quot;https://github.com/orhanobut/logger&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;moco模拟服务器返回数据&lt;a href=&quot;#moco模拟服务器返回数据&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;灵活配置参数，请求方法，URL，支持挂载文件，自带独立微型服务器，可以用json，java等语言配置。
&lt;a href=&quot;http://www.suqishuo.cn/how-to-build-api-mock-service/&quot; target=&quot;_blank&quot;&gt;介绍文章&lt;/a&gt;
&lt;a href=&quot;https://github.com/dreamhead/moco/&quot; target=&quot;_blank&quot;&gt;官网&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;快速开发&lt;a href=&quot;#快速开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;AS插件&lt;a href=&quot;#as插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;ButterKnife Zelezny：ButterKnife 生成器
SelectorChapek：selector 自动生成XML
GsonFormat：json字符串生成相应的实体类
&lt;a href=&quot;http://stormzhang.com/android/2015/05/26/android-tools/&quot; target=&quot;_blank&quot;&gt;介绍文章&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;bufferKnife&lt;a href=&quot;#bufferknife&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;JakeWharton大神出品。View,资源，事件注解方式初始化。
&lt;a href=&quot;http://jakewharton.github.io/butterknife/&quot; target=&quot;_blank&quot;&gt;官网&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;网络框架&lt;a href=&quot;#网络框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;Volley&lt;a href=&quot;#volley&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;2013年Google I/O大会上推出的一个新的网络通信框架，简化Http通信，提供异步回调。
个人更推荐使用retrofit`&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Retrofit&lt;a href=&quot;#retrofit&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp.配置简单灵活，接口返回对象，支持rxJava无缝对接
&lt;a href=&quot;https://github.com/square/retrofit&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Glide 图片加载&lt;a href=&quot;#glide-图片加载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;这个库被广泛的运用在google的开源项目中，包括2014年google I/O大会上发布的官方app.Glide和Picasso有90%的相似度&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Picasso图片加载&lt;a href=&quot;#picasso图片加载&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;推荐用Glide代替。查看对比文章 &lt;a href=&quot;http://www.cnblogs.com/sihaixuan/p/4853233.html&quot; target=&quot;_blank&quot;&gt;Picasso VS Glide&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;数据库优化&lt;a href=&quot;#数据库优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;GreenDAO&lt;a href=&quot;#greendao&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案，跟EvenBus师出同门。
&lt;a href=&quot;http://www.suqishuo.cn/greendao-project-practice.md&quot; target=&quot;_blank&quot;&gt;介绍文章1&lt;/a&gt;
&lt;a href=&quot;http://www.suqishuo.cn/greendao-project-practice-ToOne-ToMany.md&quot; target=&quot;_blank&quot;&gt;介绍文章2&lt;/a&gt;
&lt;a href=&quot;http://greenrobot.org/greendao/&quot; target=&quot;_blank&quot;&gt;官网&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;sqlbrite&lt;a href=&quot;#sqlbrite&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;square出品。一个轻量级SQLiteOpenHelper包装类，引入reactive 流式语法,完美解决数据库和UI的同步更新！
&lt;a href=&quot;https://github.com/square/sqlbrite&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;性能优化&lt;a href=&quot;#性能优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;Hugo 打印方法参数执行时间&lt;a href=&quot;#hugo-打印方法参数执行时间&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;JakeWharton大神出品。只要一行&lt;code&gt;@DebugLog&lt;/code&gt;注解打印方法的传参和返回值，甚至方法的执行时间,只在debug版本打印，对release版本无任何影响。
&lt;a href=&quot;https://github.com/JakeWharton/hugo.git&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;Scalpel&lt;a href=&quot;#scalpel&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;JakeWharton大神出品。查看界面层级，3D的效果。方便优化界面布局。
&lt;a href=&quot;https://github.com/JakeWharton/scalpel.git&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;leakcanary&lt;a href=&quot;#leakcanary&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;square出品。内存泄漏检测工具
&lt;a href=&quot;https://github.com/square/leakcanary&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;rxJava/rxAndroid&lt;a href=&quot;#rxjavarxandroid&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;rxJava/rxAndroid 精品文章&lt;a href=&quot;#rxjavarxandroid-精品文章&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;http://rxjava.yuxingxin.com/&quot; target=&quot;_blank&quot;&gt;RxJava Essentials 中文翻译版&lt;/a&gt;
&lt;a href=&quot;http://gank.io/post/560e15be2dca930e00da1083&quot; target=&quot;_blank&quot;&gt;给 Android 开发者的 RxJava 详解&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/lzyzsd/article/details/41833541&quot; target=&quot;_blank&quot;&gt;深入浅出RxJava（一：基础篇）&lt;/a&gt;
&lt;a href=&quot;http://www.cnblogs.com/zhaoyanjun/p/5624395.html&quot; target=&quot;_blank&quot;&gt;RxJava 和 RxAndroid 五（线程调度&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;rxJava 示例代码&lt;a href=&quot;#rxjava-示例代码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/rengwuxian/RxJavaSamples&quot; target=&quot;_blank&quot;&gt;rxJava 示例代码集&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;rxJava框架 rxBinding&lt;a href=&quot;#rxjava框架-rxbinding&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;架构&lt;a href=&quot;#架构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h2&gt;精品文章&lt;a href=&quot;#精品文章&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://theseyears.gitbooks.io/android-architecture-journey/content/rxbus.html&quot; target=&quot;_blank&quot;&gt;Android架构探索&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>红队渗透测试 攻防  学习 工具 分析 研究资料汇总</title><link>https://ernest-su.github.io/%E7%BA%A2%E9%98%9F%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95-%E6%94%BB%E9%98%B2--%E5%AD%A6%E4%B9%A0-%E5%B7%A5%E5%85%B7-%E5%88%86%E6%9E%90-%E7%A0%94%E7%A9%B6%E8%B5%84%E6%96%99%E6%B1%87%E6%80%BB/</link><guid isPermaLink="true">https://ernest-su.github.io/%E7%BA%A2%E9%98%9F%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95-%E6%94%BB%E9%98%B2--%E5%AD%A6%E4%B9%A0-%E5%B7%A5%E5%85%B7-%E5%88%86%E6%9E%90-%E7%A0%94%E7%A9%B6%E8%B5%84%E6%96%99%E6%B1%87%E6%80%BB/</guid><description>title: 红队渗透测试 攻防 学习 工具 分析 研究资料汇总 date: 2022425 17:30:55 categories: 安全</description><pubDate>Thu, 01 Jan 1970 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;p&gt;title: 红队渗透测试 攻防  学习 工具 分析 研究资料汇总
date: 2022-4-25 17:30:55
categories:
- 安全&lt;/p&gt;
&lt;p&gt;tags:
- 安全
- 攻防
- 资料&lt;/p&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h1&gt;相关资源列表&lt;a href=&quot;#相关资源列表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://mitre-attack.github.io/&quot; target=&quot;_blank&quot;&gt;https://mitre-attack.github.io/&lt;/a&gt; mitre 科技机构对攻击技术的总结 wiki
&lt;a href=&quot;https://huntingday.github.io&quot; target=&quot;_blank&quot;&gt;https://huntingday.github.io&lt;/a&gt; MITRE | ATT&amp;amp;CK 中文站[&lt;a href=&quot;https://www.ddosi.org/att/&quot; target=&quot;_blank&quot;&gt;https://www.ddosi.org/att/&lt;/a&gt;]
&lt;a href=&quot;https://arxiv.org&quot; target=&quot;_blank&quot;&gt;https://arxiv.org&lt;/a&gt; 康奈尔大学（Cornell University）开放文档
&lt;a href=&quot;http://www.owasp.org.cn/owasp-project/owasp-things&quot; target=&quot;_blank&quot;&gt;http://www.owasp.org.cn/owasp-project/owasp-things&lt;/a&gt; OWASP 项目
&lt;a href=&quot;http://www.irongeek.com/i.php?page=security/hackingillustrated&quot; target=&quot;_blank&quot;&gt;http://www.irongeek.com/i.php?page=security/hackingillustrated&lt;/a&gt; 国内外安全大会相关视频与文档
&lt;a href=&quot;https://github.com/knownsec/KCon&quot; target=&quot;_blank&quot;&gt;https://github.com/knownsec/KCon&lt;/a&gt; KCon 大会文章 PPT
&lt;a href=&quot;https://github.com/SecWiki/sec-chart&quot; target=&quot;_blank&quot;&gt;https://github.com/SecWiki/sec-chart&lt;/a&gt; 各种相关安全思维导图集合
&lt;a href=&quot;https://github.com/knownsec/RD_Checklist&quot; target=&quot;_blank&quot;&gt;https://github.com/knownsec/RD_Checklist&lt;/a&gt; 知道创宇技能列表
&lt;a href=&quot;https://github.com/ChrisLinn/greyhame-2017&quot; target=&quot;_blank&quot;&gt;https://github.com/ChrisLinn/greyhame-2017&lt;/a&gt; 灰袍技能书 2017 版本
&lt;a href=&quot;https://github.com/Hack-with-Github/Awesome-Hacking&quot; target=&quot;_blank&quot;&gt;https://github.com/Hack-with-Github/Awesome-Hacking&lt;/a&gt; GitHub 万星推荐：黑客成长技术清单
&lt;a href=&quot;https://github.com/k4m4/movies-for-hackers&quot; target=&quot;_blank&quot;&gt;https://github.com/k4m4/movies-for-hackers&lt;/a&gt; 安全相关电影
&lt;a href=&quot;https://github.com/jaredthecoder/awesome-vehicle-security&quot; target=&quot;_blank&quot;&gt;https://github.com/jaredthecoder/awesome-vehicle-security&lt;/a&gt; 一个用于了解车辆安全和汽车黑客的资源&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;清单&lt;a href=&quot;#清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.jianshu.com/p/852e0fbe2f4c&quot; target=&quot;_blank&quot;&gt;https://www.jianshu.com/p/852e0fbe2f4c&lt;/a&gt; 安全产品厂商分类
&lt;a href=&quot;https://www.reddit.com/r/Python/comments/a81mg3/the_entire_mit_intro_computer_science_class_using/&quot; target=&quot;_blank&quot;&gt;https://www.reddit.com/r/Python/comments/a81mg3/the_entire_mit_intro_computer_science_class_using/&lt;/a&gt; 麻省理工机器学习视频
&lt;a href=&quot;https://github.com/fxsjy/jieba&quot; target=&quot;_blank&quot;&gt;https://github.com/fxsjy/jieba&lt;/a&gt; py，结巴中文分词
&lt;a href=&quot;https://github.com/thunlp/THULAC-Python&quot; target=&quot;_blank&quot;&gt;https://github.com/thunlp/THULAC-Python&lt;/a&gt; py，清华中文分词
&lt;a href=&quot;https://github.com/lancopku/PKUSeg-python&quot; target=&quot;_blank&quot;&gt;https://github.com/lancopku/PKUSeg-python&lt;/a&gt; py3，北大中文分词
&lt;a href=&quot;https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes&quot; target=&quot;_blank&quot;&gt;https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes&lt;/a&gt; 吴恩达机器学习 python 笔记
&lt;a href=&quot;https://paperswithcode.com/sota&quot; target=&quot;_blank&quot;&gt;https://paperswithcode.com/sota&lt;/a&gt; 机器学习具体项目、演示、代码
&lt;a href=&quot;https://github.com/duoergun0729/nlp&quot; target=&quot;_blank&quot;&gt;https://github.com/duoergun0729/nlp&lt;/a&gt; 一本开源的 NLP（神经语言程序学）入门书籍
&lt;a href=&quot;https://www.freebuf.com/articles/web/195304.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/articles/web/195304.html&lt;/a&gt; 一句话木马的套路&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;攻防测试手册&lt;a href=&quot;#攻防测试手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://micropoor.blogspot.com/2019/01/php8.html&quot; target=&quot;_blank&quot;&gt;https://micropoor.blogspot.com/2019/01/php8.html&lt;/a&gt; PHP 安全新闻早 8 点课程系列高持续渗透–Microporor
&lt;a href=&quot;https://github.com/Micropoor/Micro8&quot; target=&quot;_blank&quot;&gt;https://github.com/Micropoor/Micro8&lt;/a&gt; Microporor 高级攻防 100 课
&lt;a href=&quot;https://github.com/maskhed/Papers&quot; target=&quot;_blank&quot;&gt;https://github.com/maskhed/Papers&lt;/a&gt; 包含 100 课等经典攻防教材、安全知识
&lt;a href=&quot;https://github.com/infosecn1nja/AD-Attack-Defense&quot; target=&quot;_blank&quot;&gt;https://github.com/infosecn1nja/AD-Attack-Defense&lt;/a&gt; 红蓝方攻防手册
&lt;a href=&quot;https://github.com/yeyintminthuhtut/Awesome-Red-Teaming&quot; target=&quot;_blank&quot;&gt;https://github.com/yeyintminthuhtut/Awesome-Red-Teaming&lt;/a&gt; 优秀红队资源列表
&lt;a href=&quot;https://github.com/foobarto/redteam-notebook&quot; target=&quot;_blank&quot;&gt;https://github.com/foobarto/redteam-notebook&lt;/a&gt; 红队标准渗透测试流程+常用命令
&lt;a href=&quot;https://github.com/tom0li/collection-document&quot; target=&quot;_blank&quot;&gt;https://github.com/tom0li/collection-document&lt;/a&gt; 文章收集：安全部、SDL、src、渗透测试、漏洞利用
&lt;a href=&quot;https://github.com/kbandla/APTnotes&quot; target=&quot;_blank&quot;&gt;https://github.com/kbandla/APTnotes&lt;/a&gt; 各种公开的文件和相关的 APT 笔记，还有软件样本
&lt;a href=&quot;https://wizardforcel.gitbooks.io/web-hacking-101/content&quot; target=&quot;_blank&quot;&gt;https://wizardforcel.gitbooks.io/web-hacking-101/content&lt;/a&gt; Web Hacking 101 中文版
&lt;a href=&quot;https://techvomit.net/web-application-penetration-testing-notes/&quot; target=&quot;_blank&quot;&gt;https://techvomit.net/web-application-penetration-testing-notes/&lt;/a&gt; web 渗透测试笔记
&lt;a href=&quot;https://github.com/qazbnm456/awesome-web-security&quot; target=&quot;_blank&quot;&gt;https://github.com/qazbnm456/awesome-web-security&lt;/a&gt; Web 安全资料和资源列表
&lt;a href=&quot;http://pentestmonkey.net/category/cheat-sheet&quot; target=&quot;_blank&quot;&gt;http://pentestmonkey.net/category/cheat-sheet&lt;/a&gt; 渗透测试常见条目
&lt;a href=&quot;https://github.com/demonsec666/Security-Toolkit&quot; target=&quot;_blank&quot;&gt;https://github.com/demonsec666/Security-Toolkit&lt;/a&gt; 渗透攻击链中常用工具及使用场景
&lt;a href=&quot;https://github.com/Kinimiwar/Penetration-Testing&quot; target=&quot;_blank&quot;&gt;https://github.com/Kinimiwar/Penetration-Testing&lt;/a&gt; 渗透测试方向优秀资源收集
&lt;a href=&quot;https://github.com/jshaw87/Cheatsheets&quot; target=&quot;_blank&quot;&gt;https://github.com/jshaw87/Cheatsheets&lt;/a&gt; 渗透测试/安全秘籍/笔记&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;内网安全文档&lt;a href=&quot;#内网安全文档&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://attack.mitre.org/wiki/Lateral_Movement&quot; target=&quot;_blank&quot;&gt;https://attack.mitre.org/wiki/Lateral_Movement&lt;/a&gt; mitre 机构对横向移动的总结
&lt;a href=&quot;https://payloads.online/archivers/2018-11-30/1&quot; target=&quot;_blank&quot;&gt;https://payloads.online/archivers/2018-11-30/1&lt;/a&gt; 彻底理解 Windows 认证 – 议题解读
&lt;a href=&quot;https://github.com/klionsec/klionsec.github.io&quot; target=&quot;_blank&quot;&gt;https://github.com/klionsec/klionsec.github.io&lt;/a&gt; 内网大牛的学习历程
&lt;a href=&quot;https://github.com/l3m0n/pentest_study&quot; target=&quot;_blank&quot;&gt;https://github.com/l3m0n/pentest_study&lt;/a&gt; 从零开始内网渗透学习
&lt;a href=&quot;https://github.com/Ridter/Intranet_Penetration_Tips&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/Intranet_Penetration_Tips&lt;/a&gt; 内网渗透 TIPS&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;学习手册相关资源&lt;a href=&quot;#学习手册相关资源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/HarmJ0y/CheatSheets&quot; target=&quot;_blank&quot;&gt;https://github.com/HarmJ0y/CheatSheets&lt;/a&gt; 多个项目的速查手册（Beacon / Cobalt Strike，PowerView，PowerUp，Empire 和 PowerSploit）
&lt;a href=&quot;https://wizardforcel.gitbooks.io/kali-linux-web-pentest-cookbook/content/&quot; target=&quot;_blank&quot;&gt;https://wizardforcel.gitbooks.io/kali-linux-web-pentest-cookbook/content/&lt;/a&gt; Kali Linux Web 渗透测试秘籍 中文版
&lt;a href=&quot;https://github.com/louchaooo/kali-tools-zh&quot; target=&quot;_blank&quot;&gt;https://github.com/louchaooo/kali-tools-zh&lt;/a&gt; kali 下工具使用介绍手册
&lt;a href=&quot;https://www.offensive-security.com/metasploit-unleashed/&quot; target=&quot;_blank&quot;&gt;https://www.offensive-security.com/metasploit-unleashed/&lt;/a&gt; kali 出的 metasploit 指导笔记
&lt;a href=&quot;http://www.hackingarticles.in/comprehensive-guide-on-hydra-a-brute-forcing-tool/&quot; target=&quot;_blank&quot;&gt;http://www.hackingarticles.in/comprehensive-guide-on-hydra-a-brute-forcing-tool/&lt;/a&gt; hydra 使用手册
&lt;a href=&quot;https://www.gitbook.com/book/t0data/burpsuite/details&quot; target=&quot;_blank&quot;&gt;https://www.gitbook.com/book/t0data/burpsuite/details&lt;/a&gt; burpsuite 实战指南
&lt;a href=&quot;https://zhuanlan.zhihu.com/p/26618074&quot; target=&quot;_blank&quot;&gt;https://zhuanlan.zhihu.com/p/26618074&lt;/a&gt; Nmap 扩展脚本使用方法
&lt;a href=&quot;https://somdev.me/21-things-xss/&quot; target=&quot;_blank&quot;&gt;https://somdev.me/21-things-xss/&lt;/a&gt; XSS 的 21 个扩展用途
&lt;a href=&quot;https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/&quot; target=&quot;_blank&quot;&gt;https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/&lt;/a&gt; sql 注入 sheet 表
&lt;a href=&quot;https://sqlwiki.netspi.com/&quot; target=&quot;_blank&quot;&gt;https://sqlwiki.netspi.com/&lt;/a&gt; 你要的 sql 注入知识点都能找到
&lt;a href=&quot;https://github.com/kevins1022/SQLInjectionWiki&quot; target=&quot;_blank&quot;&gt;https://github.com/kevins1022/SQLInjectionWiki&lt;/a&gt; 一个专注于聚合和记录各种 SQL 注入方法的 wiki
&lt;a href=&quot;https://github.com/hardenedlinux/linux-exploit-development-tutorial&quot; target=&quot;_blank&quot;&gt;https://github.com/hardenedlinux/linux-exploit-development-tutorial&lt;/a&gt; Linux exploit 开发入门
&lt;a href=&quot;https://wizardforcel.gitbooks.io/asani/content&quot; target=&quot;_blank&quot;&gt;https://wizardforcel.gitbooks.io/asani/content&lt;/a&gt; 浅入浅出 Android 安全 中文版
&lt;a href=&quot;https://wizardforcel.gitbooks.io/lpad/content&quot; target=&quot;_blank&quot;&gt;https://wizardforcel.gitbooks.io/lpad/content&lt;/a&gt; Android 渗透测试学习手册 中文版
&lt;a href=&quot;https://github.com/writeups/ios&quot; target=&quot;_blank&quot;&gt;https://github.com/writeups/ios&lt;/a&gt; ios 漏洞 writeup 笔记
&lt;a href=&quot;http://blog.safebuff.com/2016/07/03/SSRF-Tips/&quot; target=&quot;_blank&quot;&gt;http://blog.safebuff.com/2016/07/03/SSRF-Tips/&lt;/a&gt; ssrf 漏洞利用手册&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Checklist 和基础安全知识&lt;a href=&quot;#checklist-和基础安全知识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://book.yunzhan365.com/umta/rtnp/mobile/index.html&quot; target=&quot;_blank&quot;&gt;https://book.yunzhan365.com/umta/rtnp/mobile/index.html&lt;/a&gt; 网络安全科普小册子
&lt;a href=&quot;http://sec.cuc.edu.cn/huangwei/textbook/ns/&quot; target=&quot;_blank&quot;&gt;http://sec.cuc.edu.cn/huangwei/textbook/ns/&lt;/a&gt; 网络安全电子版教材。中传信安课程网站
&lt;a href=&quot;https://mitre.github.io/attack-navigator/enterprise/&quot; target=&quot;_blank&quot;&gt;https://mitre.github.io/attack-navigator/enterprise/&lt;/a&gt; mitre 机构 att&amp;amp;ck 入侵检测条目
&lt;a href=&quot;https://github.com/danielmiessler/SecLists&quot; target=&quot;_blank&quot;&gt;https://github.com/danielmiessler/SecLists&lt;/a&gt; 表类型包括用户名，密码，URL，敏感数据模式，模糊测试负载，Web shell 等
&lt;a href=&quot;https://github.com/GitGuardian/APISecurityBestPractices&quot; target=&quot;_blank&quot;&gt;https://github.com/GitGuardian/APISecurityBestPractices&lt;/a&gt; api 接口测试 checklist
&lt;a href=&quot;https://github.com/ym2011/SecurityManagement&quot; target=&quot;_blank&quot;&gt;https://github.com/ym2011/SecurityManagement&lt;/a&gt; 分享在建设安全管理体系、ISO27001、等级保护、安全评审过程中的点点滴滴
&lt;a href=&quot;https://mp.weixin.qq.com/s/O36e0gl4cs0ErQPsb5L68Q&quot; target=&quot;_blank&quot;&gt;https://mp.weixin.qq.com/s/O36e0gl4cs0ErQPsb5L68Q&lt;/a&gt; 区块链，以太坊智能合约审计 CheckList
&lt;a href=&quot;https://github.com/slowmist/eos-bp-nodes-security-checklist&quot; target=&quot;_blank&quot;&gt;https://github.com/slowmist/eos-bp-nodes-security-checklist&lt;/a&gt; 区块链，EOS bp nodes security checklist（EOS 超级节点安全执行指南）
&lt;a href=&quot;https://xz.aliyun.com/t/2089&quot; target=&quot;_blank&quot;&gt;https://xz.aliyun.com/t/2089&lt;/a&gt; 金融科技 SDL 安全设计 checklist
&lt;a href=&quot;https://github.com/juliocesarfort/public-pentesting-reports&quot; target=&quot;_blank&quot;&gt;https://github.com/juliocesarfort/public-pentesting-reports&lt;/a&gt; 由几家咨询公司和学术安全组织发布的公共渗透测试报告的列表。
&lt;a href=&quot;http://www.freebuf.com/articles/network/169632.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/network/169632.html&lt;/a&gt; 开源软件创建 SOC 的一份清单
&lt;a href=&quot;https://github.com/0xRadi/OWASP-Web-Checklist&quot; target=&quot;_blank&quot;&gt;https://github.com/0xRadi/OWASP-Web-Checklist&lt;/a&gt; owasp 网站检查条目
&lt;a href=&quot;https://www.securitypaper.org/&quot; target=&quot;_blank&quot;&gt;https://www.securitypaper.org/&lt;/a&gt; SDL 开发安全生命周期管理
&lt;a href=&quot;https://github.com/Jsitech/JShielder&quot; target=&quot;_blank&quot;&gt;https://github.com/Jsitech/JShielder&lt;/a&gt; linux 下服务器一键加固脚本
&lt;a href=&quot;https://github.com/wstart/DB_BaseLine&quot; target=&quot;_blank&quot;&gt;https://github.com/wstart/DB_BaseLine&lt;/a&gt; 数据库基线检查工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;产品设计文档&lt;a href=&quot;#产品设计文档&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.freebuf.com/sectool/135032.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/sectool/135032.html&lt;/a&gt; 构建一个高交互型的难以发现的蜜罐
&lt;a href=&quot;https://bloodzer0.github.io/ossa/&quot; target=&quot;_blank&quot;&gt;https://bloodzer0.github.io/ossa/&lt;/a&gt; 利用开源文件进行开源安全架构.主机、扫描器、端口、日志、防护设备等
&lt;a href=&quot;https://github.com/dvf/blockchain&quot; target=&quot;_blank&quot;&gt;https://github.com/dvf/blockchain&lt;/a&gt; 用 Python 从零开始创建区块链
&lt;a href=&quot;https://github.com/crazywa1ker/DarthSidious-Chinese&quot; target=&quot;_blank&quot;&gt;https://github.com/crazywa1ker/DarthSidious-Chinese&lt;/a&gt; 从 0 开始你的域渗透之旅，DarthSidious 中文版
&lt;a href=&quot;https://paper.seebug.org/772/&quot; target=&quot;_blank&quot;&gt;https://paper.seebug.org/772/&lt;/a&gt; 如何使用 KittyFuzzer 结合 ISF 中的工控协议组件对工控协议进行 Fuzz&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;学习靶场&lt;a href=&quot;#学习靶场&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.blackmoreops.com/2018/11/06/124-legal-hacking-websites-to-practice-and-learn/&quot; target=&quot;_blank&quot;&gt;https://www.blackmoreops.com/2018/11/06/124-legal-hacking-websites-to-practice-and-learn/&lt;/a&gt; 124 个合法的可以练习 Hacking 技术的网站
&lt;a href=&quot;https://www.zhihu.com/question/267204109&quot; target=&quot;_blank&quot;&gt;https://www.zhihu.com/question/267204109&lt;/a&gt; 学 web 安全去哪里找各种各样的靶场？
&lt;a href=&quot;https://www.vulnhub.com&quot; target=&quot;_blank&quot;&gt;https://www.vulnhub.com&lt;/a&gt; 许多 ctf 靶机汇总
&lt;a href=&quot;https://www.wechall.net&quot; target=&quot;_blank&quot;&gt;https://www.wechall.net&lt;/a&gt; 世界知名 ctf 汇总交流网站
&lt;a href=&quot;https://www.xssgame.com&quot; target=&quot;_blank&quot;&gt;https://www.xssgame.com&lt;/a&gt; 谷歌 XSS 挑战
&lt;a href=&quot;http://xss.tv&quot; target=&quot;_blank&quot;&gt;http://xss.tv&lt;/a&gt; 在线靶场挑战
&lt;a href=&quot;https://www.hackthebox.eu&quot; target=&quot;_blank&quot;&gt;https://www.hackthebox.eu&lt;/a&gt; 在线靶场挑战
&lt;a href=&quot;https://www.root-me.org&quot; target=&quot;_blank&quot;&gt;https://www.root-me.org&lt;/a&gt; 在线靶场挑战
&lt;a href=&quot;http://www.itsecgames.com&quot; target=&quot;_blank&quot;&gt;http://www.itsecgames.com&lt;/a&gt; bWAPP，包含 100 多种漏洞环境
&lt;a href=&quot;https://github.com/c0ny1/vulstudy&quot; target=&quot;_blank&quot;&gt;https://github.com/c0ny1/vulstudy&lt;/a&gt; 多种漏洞复现系统的 docker 汇总
&lt;a href=&quot;https://github.com/bkimminich/juice-shop&quot; target=&quot;_blank&quot;&gt;https://github.com/bkimminich/juice-shop&lt;/a&gt; 常见 web 安全实验靶场市场
&lt;a href=&quot;https://github.com/ethicalhack3r/DVWA&quot; target=&quot;_blank&quot;&gt;https://github.com/ethicalhack3r/DVWA&lt;/a&gt; web 安全实验靶场
&lt;a href=&quot;https://www.freebuf.com/articles/web/123779.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/articles/web/123779.html&lt;/a&gt; 新手指南：DVWA-1.9 全级别教程
&lt;a href=&quot;https://github.com/78778443/permeate&quot; target=&quot;_blank&quot;&gt;https://github.com/78778443/permeate&lt;/a&gt; php，常见漏洞靶场
&lt;a href=&quot;https://github.com/gh0stkey/DoraBox&quot; target=&quot;_blank&quot;&gt;https://github.com/gh0stkey/DoraBox&lt;/a&gt; php,常见漏洞靶场
&lt;a href=&quot;https://github.com/stamparm/DSVW&quot; target=&quot;_blank&quot;&gt;https://github.com/stamparm/DSVW&lt;/a&gt; py2,常见漏洞靶场
&lt;a href=&quot;https://github.com/amolnaik4/bodhi&quot; target=&quot;_blank&quot;&gt;https://github.com/amolnaik4/bodhi&lt;/a&gt; py,常见漏洞靶场
&lt;a href=&quot;https://github.com/Safflower/Solve-Me&quot; target=&quot;_blank&quot;&gt;https://github.com/Safflower/Solve-Me&lt;/a&gt; php，韩国一个偏代码审计的 ctf 靶场源码
&lt;a href=&quot;https://github.com/WebGoat/WebGoat&quot; target=&quot;_blank&quot;&gt;https://github.com/WebGoat/WebGoat&lt;/a&gt; 一键 jar 包，web 安全实验靶场
&lt;a href=&quot;https://github.com/Audi-1/sqli-labs&quot; target=&quot;_blank&quot;&gt;https://github.com/Audi-1/sqli-labs&lt;/a&gt; 基于 SQLite 的 sql 注入学习靶场
&lt;a href=&quot;https://github.com/lcamry/sqli-labs&quot; target=&quot;_blank&quot;&gt;https://github.com/lcamry/sqli-labs&lt;/a&gt; 通过 sqli-labs 演示 mysql 相关的注入手法
&lt;a href=&quot;https://github.com/c0ny1/upload-labs&quot; target=&quot;_blank&quot;&gt;https://github.com/c0ny1/upload-labs&lt;/a&gt; 一个帮你总结所有类型的上传漏洞的靶场
&lt;a href=&quot;https://github.com/LandGrey/upload-labs-writeup&quot; target=&quot;_blank&quot;&gt;https://github.com/LandGrey/upload-labs-writeup&lt;/a&gt; upload-labs 指导手册
&lt;a href=&quot;https://github.com/Go0s/LFIboomCTF&quot; target=&quot;_blank&quot;&gt;https://github.com/Go0s/LFIboomCTF&lt;/a&gt; 本地文件包含漏洞&amp;amp;&amp;amp;PHP 利用协议&amp;amp;&amp;amp;实践源码
&lt;a href=&quot;https://in.security/lin-security-practise-your-linux-privilege-escalation-foo/&quot; target=&quot;_blank&quot;&gt;https://in.security/lin-security-practise-your-linux-privilege-escalation-foo/&lt;/a&gt; 一个虚拟机文件用于 linux 提权练习
&lt;a href=&quot;https://github.com/OWASP/igoat&quot; target=&quot;_blank&quot;&gt;https://github.com/OWASP/igoat&lt;/a&gt; 适用于 ios 应用程序测试和安全性的学习工具
&lt;a href=&quot;https://github.com/prateek147/DVIA-v2&quot; target=&quot;_blank&quot;&gt;https://github.com/prateek147/DVIA-v2&lt;/a&gt; 适用于 ios 应用程序测试和安全性的学习工具
&lt;a href=&quot;https://github.com/rapid7/metasploitable3&quot; target=&quot;_blank&quot;&gt;https://github.com/rapid7/metasploitable3&lt;/a&gt; metasploit 练习系统
&lt;a href=&quot;https://github.com/rapid7/metasploit-vulnerability-emulator&quot; target=&quot;_blank&quot;&gt;https://github.com/rapid7/metasploit-vulnerability-emulator&lt;/a&gt; 基于 perl 的 metasploit 模拟环境，练习操作
&lt;a href=&quot;https://github.com/chryzsh/DarthSidious&quot; target=&quot;_blank&quot;&gt;https://github.com/chryzsh/DarthSidious&lt;/a&gt; AD 域环境的搭建、渗透、防护
&lt;a href=&quot;https://github.com/c0ny1/xxe-lab&quot; target=&quot;_blank&quot;&gt;https://github.com/c0ny1/xxe-lab&lt;/a&gt; 一个包含 php,java,python,C#等各种语言版本的 XXE 漏洞 Demo&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;漏洞复现&lt;a href=&quot;#漏洞复现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/vulhub/vulhub&quot; target=&quot;_blank&quot;&gt;https://github.com/vulhub/vulhub&lt;/a&gt; Vulhub 是一个面向大众的开源漏洞靶场，无需 docker 知识，执行两条命令即可编译、运行一个完整的漏洞靶场镜像
&lt;a href=&quot;https://github.com/Medicean/VulApps&quot; target=&quot;_blank&quot;&gt;https://github.com/Medicean/VulApps&lt;/a&gt; 收集各种漏洞环境，为方便使用，统一采用 Dockerfile 形式。同时也收集了安全工具环境。
&lt;a href=&quot;https://github.com/bingohuang/docker-labs&quot; target=&quot;_blank&quot;&gt;https://github.com/bingohuang/docker-labs&lt;/a&gt; 制作在线 docker 平台&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;开源漏洞库&lt;a href=&quot;#开源漏洞库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://wooyun.kieran.top/#!/&quot; target=&quot;_blank&quot;&gt;https://wooyun.kieran.top/#!/&lt;/a&gt; 2016 年之前，乌云 Drops 文章，公开漏洞详情文章
&lt;a href=&quot;https://wooyun.js.org/&quot; target=&quot;_blank&quot;&gt;https://wooyun.js.org/&lt;/a&gt; 2016 年之前，乌云 Drops 文章，公开漏洞详情文章
&lt;a href=&quot;https://dvpnet.io/list/index/state/3&quot; target=&quot;_blank&quot;&gt;https://dvpnet.io/list/index/state/3&lt;/a&gt; 公开漏洞详情文章
&lt;a href=&quot;https://sec.ly.com/bugs&quot; target=&quot;_blank&quot;&gt;https://sec.ly.com/bugs&lt;/a&gt; 同程安全公开漏洞详情文章
&lt;a href=&quot;http://ics.cnvd.org.cn&quot; target=&quot;_blank&quot;&gt;http://ics.cnvd.org.cn&lt;/a&gt; 中国国家工控漏洞库
&lt;a href=&quot;https://ics-cert.us-cert.gov/advisories&quot; target=&quot;_blank&quot;&gt;https://ics-cert.us-cert.gov/advisories&lt;/a&gt; 美国国家工控漏洞库
&lt;a href=&quot;http://www.nsfocus.net/index.php?act=sec_bug&quot; target=&quot;_blank&quot;&gt;http://www.nsfocus.net/index.php?act=sec_bug&lt;/a&gt; 绿盟漏洞库，含工控
&lt;a href=&quot;http://ivd.winicssec.com/&quot; target=&quot;_blank&quot;&gt;http://ivd.winicssec.com/&lt;/a&gt; 威努特工控漏洞库
&lt;a href=&quot;http://cve.scap.org.cn/view/ics&quot; target=&quot;_blank&quot;&gt;http://cve.scap.org.cn/view/ics&lt;/a&gt; CVE 中文工控漏洞库
&lt;a href=&quot;https://cve.mitre.org/cve/search_cve_list.html&quot; target=&quot;_blank&quot;&gt;https://cve.mitre.org/cve/search_cve_list.html&lt;/a&gt; 美国 MITRE 公司负责维护的 CVE 漏洞库
&lt;a href=&quot;https://www.exploit-db.com&quot; target=&quot;_blank&quot;&gt;https://www.exploit-db.com&lt;/a&gt; 美国 Offensive Security 的漏洞库
&lt;a href=&quot;https://nvd.nist.gov/vuln/search&quot; target=&quot;_blank&quot;&gt;https://nvd.nist.gov/vuln/search&lt;/a&gt; 美国国家信息安全漏洞库&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;工具包集合&lt;a href=&quot;#工具包集合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.4hou.com/web/11241.html&quot; target=&quot;_blank&quot;&gt;http://www.4hou.com/web/11241.html&lt;/a&gt; 史上最全攻击模拟工具盘点
&lt;a href=&quot;https://github.com/infosecn1nja/Red-Teaming-Toolkit&quot; target=&quot;_blank&quot;&gt;https://github.com/infosecn1nja/Red-Teaming-Toolkit&lt;/a&gt; 信息收集、攻击尝试获得权限、持久性控制、权限提升、网络信息收集、横向移动、数据分析（在这个基础上再做持久化控制）、清理痕迹
&lt;a href=&quot;https://github.com/toolswatch/blackhat-arsenal-tools&quot; target=&quot;_blank&quot;&gt;https://github.com/toolswatch/blackhat-arsenal-tools&lt;/a&gt; 黑帽大会工具集
&lt;a href=&quot;https://www.cnblogs.com/k8gege&quot; target=&quot;_blank&quot;&gt;https://www.cnblogs.com/k8gege&lt;/a&gt; K8 哥哥工具包集合。解压密码 Kk8team,Kk8gege
&lt;a href=&quot;https://github.com/n00py/ReadingList/blob/master/gunsafe.txt&quot; target=&quot;_blank&quot;&gt;https://github.com/n00py/ReadingList/blob/master/gunsafe.txt&lt;/a&gt; 安全工具集
&lt;a href=&quot;https://github.com/Ridter/Pentest&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/Pentest&lt;/a&gt; 安全工具集
&lt;a href=&quot;https://github.com/redcanaryco/atomic-red-team&quot; target=&quot;_blank&quot;&gt;https://github.com/redcanaryco/atomic-red-team&lt;/a&gt; win、linux、mac 等多方面 apt 利用手段、技术与工具集
&lt;a href=&quot;https://github.com/Cooolis/Cooolis.github.io&quot; target=&quot;_blank&quot;&gt;https://github.com/Cooolis/Cooolis.github.io&lt;/a&gt; Cooolis 是一个操作系统命令技巧备忘录，&lt;a href=&quot;https://cooolis.payloads.online&quot; target=&quot;_blank&quot;&gt;https://cooolis.payloads.online&lt;/a&gt;
&lt;a href=&quot;https://github.com/LOLBAS-Project/LOLBAS&quot; target=&quot;_blank&quot;&gt;https://github.com/LOLBAS-Project/LOLBAS&lt;/a&gt; 常见的渗透测试利用的脚本与二进制文件集合
&lt;a href=&quot;https://www.owasp.org/index.php/File:CSRFTester-1.0.zip&quot; target=&quot;_blank&quot;&gt;https://www.owasp.org/index.php/File:CSRFTester-1.0.zip&lt;/a&gt; csrf 验证工具
&lt;a href=&quot;https://github.com/ufrisk/MemProcFS&quot; target=&quot;_blank&quot;&gt;https://github.com/ufrisk/MemProcFS&lt;/a&gt; 以访问文件系统的方式访问物理内存, 可读写, 有易于使用的接口. 当前支持 Windows
&lt;a href=&quot;https://github.com/vletoux/SpoolerScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/vletoux/SpoolerScanner&lt;/a&gt; 检测 Windows 远程打印机服务是否开启的工具
&lt;a href=&quot;https://github.com/sirpsycho/firecall&quot; target=&quot;_blank&quot;&gt;https://github.com/sirpsycho/firecall&lt;/a&gt; 直接向 CiscoASA 防火墙发送命令, 无需登录防火墙后再做修改
&lt;a href=&quot;https://github.com/jboss-javassist/javassist&quot; target=&quot;_blank&quot;&gt;https://github.com/jboss-javassist/javassist&lt;/a&gt; 能够操作字节码框架，通过它我们能很轻易的修改 class 代码文件
&lt;a href=&quot;https://github.com/ConsenSys/mythril-classic&quot; target=&quot;_blank&quot;&gt;https://github.com/ConsenSys/mythril-classic&lt;/a&gt; 用于以太坊智能协议的安全分析工具
&lt;a href=&quot;https://github.com/a13xp0p0v/kconfig-hardened-check&quot; target=&quot;_blank&quot;&gt;https://github.com/a13xp0p0v/kconfig-hardened-check&lt;/a&gt; 用于检查 Linux 内核配置中的安全加固选项的脚本
&lt;a href=&quot;https://github.com/lionsoul2014/ip2region&quot; target=&quot;_blank&quot;&gt;https://github.com/lionsoul2014/ip2region&lt;/a&gt; ip 地址定位库，支持 python3 等多接口。类比 geoip
&lt;a href=&quot;https://github.com/m101/hsploit&quot; target=&quot;_blank&quot;&gt;https://github.com/m101/hsploit&lt;/a&gt; 基于 rust 的 HEVD 漏洞利用程序
&lt;a href=&quot;https://github.com/ticarpi/jwt_tool&quot; target=&quot;_blank&quot;&gt;https://github.com/ticarpi/jwt_tool&lt;/a&gt; 针对 json web token 的检测
&lt;a href=&quot;https://github.com/clr2of8/DPAT&quot; target=&quot;_blank&quot;&gt;https://github.com/clr2of8/DPAT&lt;/a&gt; 域密码配置审计
&lt;a href=&quot;https://github.com/chenjj/CORScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/chenjj/CORScanner&lt;/a&gt; 域解析漏洞，跨域扫描器
&lt;a href=&quot;https://github.com/dienuet/crossdomain&quot; target=&quot;_blank&quot;&gt;https://github.com/dienuet/crossdomain&lt;/a&gt; 域解析漏洞，跨域扫描器
&lt;a href=&quot;https://github.com/sfan5/fi6s&quot; target=&quot;_blank&quot;&gt;https://github.com/sfan5/fi6s&lt;/a&gt; ipv6 端口快速扫描器
&lt;a href=&quot;https://github.com/lavalamp-/ipv666&quot; target=&quot;_blank&quot;&gt;https://github.com/lavalamp-/ipv666&lt;/a&gt; go,ipv6 地址枚举扫描
&lt;a href=&quot;https://github.com/commixproject/commix&quot; target=&quot;_blank&quot;&gt;https://github.com/commixproject/commix&lt;/a&gt; 命令注入漏洞扫描
&lt;a href=&quot;https://github.com/Graph-X/davscan&quot; target=&quot;_blank&quot;&gt;https://github.com/Graph-X/davscan&lt;/a&gt; DAVScan 是一款快速轻便的 webdav 扫描仪，旨在发现 DAV 启用的 Web 服务器上的隐藏文件和文件夹
&lt;a href=&quot;https://github.com/jcesarstef/dotdotslash&quot; target=&quot;_blank&quot;&gt;https://github.com/jcesarstef/dotdotslash&lt;/a&gt; 目录遍历漏洞测试
&lt;a href=&quot;https://github.com/P3GLEG/WhaleTail&quot; target=&quot;_blank&quot;&gt;https://github.com/P3GLEG/WhaleTail&lt;/a&gt; 根据 docker 镜像生成成 dockerfile
&lt;a href=&quot;https://github.com/cr0hn/dockerscan&quot; target=&quot;_blank&quot;&gt;https://github.com/cr0hn/dockerscan&lt;/a&gt; docker 扫描工具
&lt;a href=&quot;https://github.com/utiso/dorkbot&quot; target=&quot;_blank&quot;&gt;https://github.com/utiso/dorkbot&lt;/a&gt; 通过定制化的谷歌搜索引擎进行漏洞页面搜寻及扫描
&lt;a href=&quot;https://github.com/NullArray/DorkNet&quot; target=&quot;_blank&quot;&gt;https://github.com/NullArray/DorkNet&lt;/a&gt; 基于搜索引擎的漏洞网页搜寻
&lt;a href=&quot;https://github.com/panda-re/lava&quot; target=&quot;_blank&quot;&gt;https://github.com/panda-re/lava&lt;/a&gt; 大规模向程序中植入恶意程序
&lt;a href=&quot;https://github.com/woj-ciech/Danger-zone&quot; target=&quot;_blank&quot;&gt;https://github.com/woj-ciech/Danger-zone&lt;/a&gt; 关联域名、IP 和电子邮件地址之间的数据并将其可视化输出
&lt;a href=&quot;https://github.com/securemode/DefenderKeys&quot; target=&quot;_blank&quot;&gt;https://github.com/securemode/DefenderKeys&lt;/a&gt; 枚举出被 Windows Defender 排除扫描的配置
&lt;a href=&quot;https://github.com/D4Vinci/PasteJacker&quot; target=&quot;_blank&quot;&gt;https://github.com/D4Vinci/PasteJacker&lt;/a&gt; 剪贴板劫持利用工具
&lt;a href=&quot;https://github.com/JusticeRage/freedomfighting&quot; target=&quot;_blank&quot;&gt;https://github.com/JusticeRage/freedomfighting&lt;/a&gt; 日志清理、文件共享、反向 shell、简单爬虫工具包
&lt;a href=&quot;https://github.com/gh0stkey/PoCBox&quot; target=&quot;_blank&quot;&gt;https://github.com/gh0stkey/PoCBox&lt;/a&gt; 漏洞测试验证辅助平台，SONP 劫持、CORS、Flash 跨域资源读取、Google Hack 语法生成、URL 测试字典生成、JavaScript URL 跳转、302 URL 跳转
&lt;a href=&quot;https://github.com/jakubroztocil/httpie&quot; target=&quot;_blank&quot;&gt;https://github.com/jakubroztocil/httpie&lt;/a&gt; http 调试工具，类似 curl，功能更完善
&lt;a href=&quot;https://www.getpostman.com/&quot; target=&quot;_blank&quot;&gt;https://www.getpostman.com/&lt;/a&gt; http 调试工具，带界面&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;漏洞收集与 Exp、Poc 利用&lt;a href=&quot;#漏洞收集与-exppoc-利用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Lcys/Python_PoC&quot; target=&quot;_blank&quot;&gt;https://github.com/Lcys/Python_PoC&lt;/a&gt; python3 的 poc、exp 快速编写模板，有众多模范版本
&lt;a href=&quot;https://github.com/raminfp/linux_exploit_development&quot; target=&quot;_blank&quot;&gt;https://github.com/raminfp/linux_exploit_development&lt;/a&gt; linux 漏洞利用开发手册
&lt;a href=&quot;https://github.com/mudongliang/LinuxFlaw&quot; target=&quot;_blank&quot;&gt;https://github.com/mudongliang/LinuxFlaw&lt;/a&gt; 包含 linux 下软件漏洞列表
&lt;a href=&quot;https://github.com/coffeehb/Some-PoC-oR-ExP&quot; target=&quot;_blank&quot;&gt;https://github.com/coffeehb/Some-PoC-oR-ExP&lt;/a&gt; 各种漏洞 poc、Exp 的收集或编写
&lt;a href=&quot;https://github.com/userlandkernel/plataoplomo&quot; target=&quot;_blank&quot;&gt;https://github.com/userlandkernel/plataoplomo&lt;/a&gt; Sem Voigtländer 公开其发现的 iOS 中各种漏洞，包括（Writeup/POC/Exploit）
&lt;a href=&quot;https://github.com/coffeehb/Some-PoC-oR-ExP/blob/master/check_icmp_dos.py&quot; target=&quot;_blank&quot;&gt;https://github.com/coffeehb/Some-PoC-oR-ExP/blob/master/check_icmp_dos.py&lt;/a&gt; CVE-2018-4407，macos/ios 缓冲区溢出可导致系统崩溃
&lt;a href=&quot;https://github.com/vulnersCom/getsploit&quot; target=&quot;_blank&quot;&gt;https://github.com/vulnersCom/getsploit&lt;/a&gt; py2,仿照 searchsploit 通过各种数据库的官方接口进行 payload 的查找
&lt;a href=&quot;https://github.com/SecWiki/CMS-Hunter&quot; target=&quot;_blank&quot;&gt;https://github.com/SecWiki/CMS-Hunter&lt;/a&gt; CMS 漏洞测试用例集合
&lt;a href=&quot;https://github.com/Mr5m1th/0day&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr5m1th/0day&lt;/a&gt; 各种开源 CMS 各种版本的漏洞以及 EXP
&lt;a href=&quot;https://github.com/w1109790800/penetration&quot; target=&quot;_blank&quot;&gt;https://github.com/w1109790800/penetration&lt;/a&gt; CMS 新老版本 exp 与系统漏洞搜集表
&lt;a href=&quot;https://github.com/blacknbunny/libSSH-Authentication-Bypass&quot; target=&quot;_blank&quot;&gt;https://github.com/blacknbunny/libSSH-Authentication-Bypass&lt;/a&gt; CVE-2018-10933，libssh 服务端身份验证绕过
&lt;a href=&quot;https://github.com/leapsecurity/libssh-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/leapsecurity/libssh-scanner&lt;/a&gt; CVE-2018-10933，libssh 服务端身份验证绕过
&lt;a href=&quot;https://github.com/anbai-inc/CVE-2018-4878&quot; target=&quot;_blank&quot;&gt;https://github.com/anbai-inc/CVE-2018-4878&lt;/a&gt; Adobe Flash Exploit 生成 payload
&lt;a href=&quot;https://github.com/RetireJS/grunt-retire&quot; target=&quot;_blank&quot;&gt;https://github.com/RetireJS/grunt-retire&lt;/a&gt; 扫描 js 扩展库的常见漏洞
&lt;a href=&quot;https://github.com/coffeehb/SSTIF&quot; target=&quot;_blank&quot;&gt;https://github.com/coffeehb/SSTIF&lt;/a&gt; 服务器端模板注入漏洞的半自动化工具
&lt;a href=&quot;https://github.com/tijme/angularjs-csti-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/tijme/angularjs-csti-scanner&lt;/a&gt; 探测客户端 AngularJS 模板注入漏洞工具
&lt;a href=&quot;https://github.com/blackye/Jenkins&quot; target=&quot;_blank&quot;&gt;https://github.com/blackye/Jenkins&lt;/a&gt; Jenkins 漏洞探测、用户抓取爆破
&lt;a href=&quot;https://github.com/epinna/tplmap&quot; target=&quot;_blank&quot;&gt;https://github.com/epinna/tplmap&lt;/a&gt; 服务器端模板注入漏洞检测与利用工具
&lt;a href=&quot;https://github.com/irsdl/IIS-ShortName-Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/irsdl/IIS-ShortName-Scanner&lt;/a&gt; Java,IIS 短文件名暴力枚举漏洞利用工具
&lt;a href=&quot;https://github.com/lijiejie/IIS_shortname_Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/IIS_shortname_Scanner&lt;/a&gt; py2,IIS 短文件名漏洞扫描
&lt;a href=&quot;https://github.com/rudSarkar/crlf-injector&quot; target=&quot;_blank&quot;&gt;https://github.com/rudSarkar/crlf-injector&lt;/a&gt; CRLF 注入漏洞批量扫描
&lt;a href=&quot;https://github.com/hahwul/a2sv&quot; target=&quot;_blank&quot;&gt;https://github.com/hahwul/a2sv&lt;/a&gt; SSL 漏洞扫描，例如心脏滴血漏洞等
&lt;a href=&quot;https://github.com/jagracey/Regex-DoS&quot; target=&quot;_blank&quot;&gt;https://github.com/jagracey/Regex-DoS&lt;/a&gt; RegEx 拒绝服务扫描器
&lt;a href=&quot;https://github.com/Bo0oM/PHP_imap_open_exploit&quot; target=&quot;_blank&quot;&gt;https://github.com/Bo0oM/PHP_imap_open_exploit&lt;/a&gt; 利用 imap_open 绕过 php exec 函数禁用
&lt;a href=&quot;https://www.anquanke.com/post/id/106488&quot; target=&quot;_blank&quot;&gt;https://www.anquanke.com/post/id/106488&lt;/a&gt; 利用 mysql 服务端恶意配置读取客户端文件，（如何利用 MySQL LOCAL INFILE 读取客户端文件，Read MySQL Client’s File，【技术分享】从 MySQL 出发的反击之路）
&lt;a href=&quot;https://www.waitalone.cn/awvs-poc.html&quot; target=&quot;_blank&quot;&gt;https://www.waitalone.cn/awvs-poc.html&lt;/a&gt; CVE-2015-4027，AWVS10 命令执行漏洞
&lt;a href=&quot;http://an7isec.blogspot.com/2014/04/pown-noobs-acunetix-0day.html&quot; target=&quot;_blank&quot;&gt;http://an7isec.blogspot.com/2014/04/pown-noobs-acunetix-0day.html&lt;/a&gt; Pwn the n00bs – Acunetix 0day，awvs8 命令执行漏洞
&lt;a href=&quot;https://github.com/numpy/numpy/issues/12759&quot; target=&quot;_blank&quot;&gt;https://github.com/numpy/numpy/issues/12759&lt;/a&gt; 科学计算框架 numpy 命令执行 RCE 漏洞
&lt;a href=&quot;https://github.com/petercunha/Jenkins-PreAuth-RCE-PoC&quot; target=&quot;_blank&quot;&gt;https://github.com/petercunha/Jenkins-PreAuth-RCE-PoC&lt;/a&gt; jenkins 远程命令执行
&lt;a href=&quot;https://github.com/WyAtu/CVE-2018-20250&quot; target=&quot;_blank&quot;&gt;https://github.com/WyAtu/CVE-2018-20250&lt;/a&gt; WinRar 执行漏洞加使用介绍&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;物联网路由工控漏洞收集&lt;a href=&quot;#物联网路由工控漏洞收集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/yassineaboukir/CVE-2018-0296&quot; target=&quot;_blank&quot;&gt;https://github.com/yassineaboukir/CVE-2018-0296&lt;/a&gt; 测试思科 ASA 路径穿越漏洞，可获取系统详细信息
&lt;a href=&quot;https://github.com/seclab-ucr/tcp_exploit&quot; target=&quot;_blank&quot;&gt;https://github.com/seclab-ucr/tcp_exploit&lt;/a&gt; 利用 tcp 漏洞使无线路由器产生隐私泄露
&lt;a href=&quot;https://github.com/ezelf/CVE-2018-9995_dvr_credentials&quot; target=&quot;_blank&quot;&gt;https://github.com/ezelf/CVE-2018-9995_dvr_credentials&lt;/a&gt; CVE-2018-9995 摄像头路由，Get DVR Credentials&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Java 反序列化漏洞收集&lt;a href=&quot;#java-反序列化漏洞收集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/brianwrf/hackUtils&quot; target=&quot;_blank&quot;&gt;https://github.com/brianwrf/hackUtils&lt;/a&gt; java 反序列化利用
&lt;a href=&quot;https://github.com/GoSecure/break-fast-serial&quot; target=&quot;_blank&quot;&gt;https://github.com/GoSecure/break-fast-serial&lt;/a&gt; 借助 DNS 解析来检测 Java 反序列化漏洞工具
&lt;a href=&quot;https://github.com/s1kr10s/Apache-Struts-v3&quot; target=&quot;_blank&quot;&gt;https://github.com/s1kr10s/Apache-Struts-v3&lt;/a&gt; Apache-Struts 漏洞利用工具
&lt;a href=&quot;https://github.com/iBearcat/S2-057&quot; target=&quot;_blank&quot;&gt;https://github.com/iBearcat/S2-057&lt;/a&gt; struts2 CVE-2018-11776 漏洞检测工具
&lt;a href=&quot;https://github.com/Ivan1ee/struts2-057-exp&quot; target=&quot;_blank&quot;&gt;https://github.com/Ivan1ee/struts2-057-exp&lt;/a&gt; struts2-057 利用脚本
&lt;a href=&quot;https://github.com/theLSA/s2sniper&quot; target=&quot;_blank&quot;&gt;https://github.com/theLSA/s2sniper&lt;/a&gt; struts2 漏洞的检测工具
&lt;a href=&quot;https://github.com/Lucifer1993/struts-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/Lucifer1993/struts-scan&lt;/a&gt; 批量检测 struts 命令执行漏洞
&lt;a href=&quot;https://github.com/lijiejie/struts2_045_scan&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/struts2_045_scan&lt;/a&gt; Struts2-045 漏洞批量扫描工具
&lt;a href=&quot;https://github.com/riusksk/StrutScan&quot; target=&quot;_blank&quot;&gt;https://github.com/riusksk/StrutScan&lt;/a&gt; 基于 perl 的 strut2 的历史漏洞扫描
&lt;a href=&quot;https://github.com/Coalfire-Research/java-deserialization-exploits&quot; target=&quot;_blank&quot;&gt;https://github.com/Coalfire-Research/java-deserialization-exploits&lt;/a&gt; java 反序列化漏洞收集
&lt;a href=&quot;https://github.com/quentinhardy/jndiat&quot; target=&quot;_blank&quot;&gt;https://github.com/quentinhardy/jndiat&lt;/a&gt; weblogic 漏洞利用工具
&lt;a href=&quot;https://github.com/jas502n/CVE-2018-3191&quot; target=&quot;_blank&quot;&gt;https://github.com/jas502n/CVE-2018-3191&lt;/a&gt; Weblogic CVE-2018-3191 远程代码命令执行
&lt;a href=&quot;https://github.com/pyn3rd/CVE-2018-3245&quot; target=&quot;_blank&quot;&gt;https://github.com/pyn3rd/CVE-2018-3245&lt;/a&gt; weblogic cve-2018-2893 与 cve-2018-3245 远程代码命令执行
&lt;a href=&quot;https://github.com/NickstaDB/BaRMIe&quot; target=&quot;_blank&quot;&gt;https://github.com/NickstaDB/BaRMIe&lt;/a&gt; 用于 Java Remote Method Invocation 服务的工具/rmi 的枚举与远程命令执行
&lt;a href=&quot;https://github.com/joaomatosf/jexboss&quot; target=&quot;_blank&quot;&gt;https://github.com/joaomatosf/jexboss&lt;/a&gt; JBoss 和其他 java 序列化漏洞验证和开发工具
&lt;a href=&quot;https://github.com/frohoff/ysoserial&quot; target=&quot;_blank&quot;&gt;https://github.com/frohoff/ysoserial&lt;/a&gt; java 反序列化利用工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;版本管理平台漏洞收集&lt;a href=&quot;#版本管理平台漏洞收集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/shengqi158/svnhack&quot; target=&quot;_blank&quot;&gt;https://github.com/shengqi158/svnhack&lt;/a&gt; .svn 文件夹泄漏利用工具
&lt;a href=&quot;https://www.waitalone.cn/seay-svn-poc-donw-20140505.html&quot; target=&quot;_blank&quot;&gt;https://www.waitalone.cn/seay-svn-poc-donw-20140505.html&lt;/a&gt; Seay-Svn 源代码泄露漏洞利用工具，2014-05-05 版
&lt;a href=&quot;https://github.com/BugScanTeam/GitHack&quot; target=&quot;_blank&quot;&gt;https://github.com/BugScanTeam/GitHack&lt;/a&gt; .git 文件利用工具，lijiejie 改进版
&lt;a href=&quot;https://github.com/lijiejie/GitHack&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/GitHack&lt;/a&gt; .git 文件利用工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;MS 与 Office 漏洞收集&lt;a href=&quot;#ms-与-office-漏洞收集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Lz1y/CVE-2017-8759&quot; target=&quot;_blank&quot;&gt;https://github.com/Lz1y/CVE-2017-8759&lt;/a&gt; .NET Framework 换行符漏洞，CVE-2017-8759 完美复现（另附加 hta+powershell 弹框闪烁解决方案）&lt;a href=&quot;https://www.freebuf.com/vuls/147793.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/vuls/147793.html&lt;/a&gt;
&lt;a href=&quot;https://github.com/WyAtu/CVE-2018-8581&quot; target=&quot;_blank&quot;&gt;https://github.com/WyAtu/CVE-2018-8581&lt;/a&gt; Exchange 使用完成添加收信规则的操作进行横向渗透和提权漏洞
&lt;a href=&quot;https://github.com/dafthack/MailSniper&quot; target=&quot;_blank&quot;&gt;https://github.com/dafthack/MailSniper&lt;/a&gt; PS,用于在 Microsoft Exchange 环境搜索电子邮件查找特定邮件（密码、网络架构信息等）
&lt;a href=&quot;https://github.com/sensepost/ruler&quot; target=&quot;_blank&quot;&gt;https://github.com/sensepost/ruler&lt;/a&gt; GO,通过 MAPI / HTTP 或 RPC / HTTP 协议远程与 Exchange 服务器进行交互,通过客户端 Outlook 功能远程获取 shell
&lt;a href=&quot;https://github.com/3gstudent/Smbtouch-Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/3gstudent/Smbtouch-Scanner&lt;/a&gt; 扫描内网永恒之蓝 ETERNAL445SMB 系列漏洞
&lt;a href=&quot;https://github.com/smgorelik/Windows-RCE-exploits&quot; target=&quot;_blank&quot;&gt;https://github.com/smgorelik/Windows-RCE-exploits&lt;/a&gt; windows 命令执行 RCE 漏洞 POC 样本，分为 web 与文件两种形式
&lt;a href=&quot;https://github.com/3gstudent/CVE-2017-8464-EXP&quot; target=&quot;_blank&quot;&gt;https://github.com/3gstudent/CVE-2017-8464-EXP&lt;/a&gt; CVE-2017-8464，win 快捷方式远程执行漏洞
&lt;a href=&quot;https://github.com/Lz1y/CVE-2018-8420&quot; target=&quot;_blank&quot;&gt;https://github.com/Lz1y/CVE-2018-8420&lt;/a&gt; Windows 的 msxml 解析器漏洞可以通过 ie 或 vbs 执行后门
&lt;a href=&quot;https://www.anquanke.com/post/id/163000&quot; target=&quot;_blank&quot;&gt;https://www.anquanke.com/post/id/163000&lt;/a&gt; 利用 Excel 4.0 宏躲避杀软检测的攻击技术分析
&lt;a href=&quot;https://github.com/BuffaloWill/oxml_xxe&quot; target=&quot;_blank&quot;&gt;https://github.com/BuffaloWill/oxml_xxe&lt;/a&gt; XXE 漏洞利用
&lt;a href=&quot;https://thief.one/2017/06/20/1/&quot; target=&quot;_blank&quot;&gt;https://thief.one/2017/06/20/1/&lt;/a&gt; 浅谈 XXE 漏洞攻击与防御
&lt;a href=&quot;https://github.com/thom-s/docx-embeddedhtml-injection&quot; target=&quot;_blank&quot;&gt;https://github.com/thom-s/docx-embeddedhtml-injection&lt;/a&gt; word2016，滥用 Word 联机视频特征执行恶意代码 poc
&lt;a href=&quot;https://blog.cymulate.com/abusing-microsoft-office-online-video&quot; target=&quot;_blank&quot;&gt;https://blog.cymulate.com/abusing-microsoft-office-online-video&lt;/a&gt; word2016，滥用 Word 联机视频特征执行恶意代码介绍
&lt;a href=&quot;https://github.com/0xdeadbeefJERKY/Office-DDE-Payloads&quot; target=&quot;_blank&quot;&gt;https://github.com/0xdeadbeefJERKY/Office-DDE-Payloads&lt;/a&gt; 无需开启宏即可在 word 文档中利用 DDE 执行命令
&lt;a href=&quot;http://www.freebuf.com/articles/terminal/150285.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/terminal/150285.html&lt;/a&gt; 无需开启宏即可在 word 文档中利用 DDE 执行命令利用
&lt;a href=&quot;https://github.com/Ridter/CVE-2017-11882&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/CVE-2017-11882&lt;/a&gt; 利用 word 文档 RTF 获取 shell，&lt;a href=&quot;https://evi1cg.me/archives/CVE_2017_11882_exp.html&quot; target=&quot;_blank&quot;&gt;https://evi1cg.me/archives/CVE_2017_11882_exp.html&lt;/a&gt;
&lt;a href=&quot;https://github.com/Lz1y/CVE-2017-8759&quot; target=&quot;_blank&quot;&gt;https://github.com/Lz1y/CVE-2017-8759&lt;/a&gt; 利用 word 文档 hta 获取 shell，&lt;a href=&quot;http://www.freebuf.com/vuls/147793.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/vuls/147793.html&lt;/a&gt;
&lt;a href=&quot;https://fuping.site/2017/04/18/CVE-2017-0199&quot; target=&quot;_blank&quot;&gt;https://fuping.site/2017/04/18/CVE-2017-0199&lt;/a&gt; 漏洞复现过程 WORD RTF 文档，配合 msf 利用
&lt;a href=&quot;https://github.com/tezukanice/Office8570&quot; target=&quot;_blank&quot;&gt;https://github.com/tezukanice/Office8570&lt;/a&gt; 利用 ppsx 幻灯片远程命令执行，&lt;a href=&quot;https://github.com/rxwx/CVE-2017-8570&quot; target=&quot;_blank&quot;&gt;https://github.com/rxwx/CVE-2017-8570&lt;/a&gt;
&lt;a href=&quot;https://github.com/0x09AL/CVE-2018-8174-msf&quot; target=&quot;_blank&quot;&gt;https://github.com/0x09AL/CVE-2018-8174-msf&lt;/a&gt; 目前支持的版本是 32 位 IE 浏览器和 32 位 office。网页访问上线，浏览器关闭，shell 依然存活，&lt;a href=&quot;http://www.freebuf.com/vuls/173727.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/vuls/173727.html&lt;/a&gt;
&lt;a href=&quot;http://www.4hou.com/technology/9405.html&quot; target=&quot;_blank&quot;&gt;http://www.4hou.com/technology/9405.html&lt;/a&gt; 在 Office 文档的属性中隐藏攻击载荷
&lt;a href=&quot;https://evi1cg.me/archives/Create_PPSX.html&quot; target=&quot;_blank&quot;&gt;https://evi1cg.me/archives/Create_PPSX.html&lt;/a&gt; 构造 PPSX 钓鱼文件
&lt;a href=&quot;https://github.com/enigma0x3/Generate-Macro&quot; target=&quot;_blank&quot;&gt;https://github.com/enigma0x3/Generate-Macro&lt;/a&gt; PowerShell 脚本，生成含有恶意宏的 Microsoft Office 文档
&lt;a href=&quot;https://github.com/mwrlabs/wePWNise&quot; target=&quot;_blank&quot;&gt;https://github.com/mwrlabs/wePWNise&lt;/a&gt; 生成独立于体系结构的 VBA 代码，用于 Office 文档或模板，并自动绕过应用程序控制
&lt;a href=&quot;https://github.com/curi0usJack/luckystrike&quot; target=&quot;_blank&quot;&gt;https://github.com/curi0usJack/luckystrike&lt;/a&gt; 基于 ps，用于创建恶意的 Office 宏文档
&lt;a href=&quot;https://github.com/sevagas/macro_pack&quot; target=&quot;_blank&quot;&gt;https://github.com/sevagas/macro_pack&lt;/a&gt; MS Office 文档、VBS 格式、快捷方式 payload 捆绑
&lt;a href=&quot;https://github.com/khr0x40sh/MacroShop&quot; target=&quot;_blank&quot;&gt;https://github.com/khr0x40sh/MacroShop&lt;/a&gt; 一组通过 Office 宏传递有效载荷的脚本&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Kali 环境下拓展插件&lt;a href=&quot;#kali-环境下拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/secforce/sparta&quot; target=&quot;_blank&quot;&gt;https://github.com/secforce/sparta&lt;/a&gt; py，图形化应用程序联动 Nmap、Nikto、Hydra 等工具
&lt;a href=&quot;https://github.com/Manisso/fsociety&quot; target=&quot;_blank&quot;&gt;https://github.com/Manisso/fsociety&lt;/a&gt; linux 下类似于 kali 的工具包一键安装工具
&lt;a href=&quot;https://github.com/LionSec/katoolin&quot; target=&quot;_blank&quot;&gt;https://github.com/LionSec/katoolin&lt;/a&gt; 使用 linux 服务器自动安装 kali 工具包
&lt;a href=&quot;https://github.com/skavngr/rapidscan&quot; target=&quot;_blank&quot;&gt;https://github.com/skavngr/rapidscan&lt;/a&gt; py2，simple，联动 kali 下工具，漏洞扫描工具
&lt;a href=&quot;https://github.com/koenbuyens/kalirouter&quot; target=&quot;_blank&quot;&gt;https://github.com/koenbuyens/kalirouter&lt;/a&gt; 将 kali 设置为一个路由流量分析系统&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Nessus 相关工具拓展插件&lt;a href=&quot;#nessus-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.tenable.com/downloads/nessus&quot; target=&quot;_blank&quot;&gt;https://www.tenable.com/downloads/nessus&lt;/a&gt;
&lt;a href=&quot;https://github.com/se55i0n/Awvs_Nessus_Scanner_API&quot; target=&quot;_blank&quot;&gt;https://github.com/se55i0n/Awvs_Nessus_Scanner_API&lt;/a&gt; 扫描器 Awvs 11 和 Nessus 7 Api 利用脚本
&lt;a href=&quot;https://github.com/DanMcInerney/msf-autoshell&quot; target=&quot;_blank&quot;&gt;https://github.com/DanMcInerney/msf-autoshell&lt;/a&gt; 配合 nessus 扫描结果进行 msf 攻击
&lt;a href=&quot;https://github.com/MooseDojo/apt2&quot; target=&quot;_blank&quot;&gt;https://github.com/MooseDojo/apt2&lt;/a&gt; 联动 nmap、nessus 等工具进行安全测试&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Awvs 相关工具拓展插件&lt;a href=&quot;#awvs-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.52pojie.cn/thread-214819-1-1.html&quot; target=&quot;_blank&quot;&gt;https://www.52pojie.cn/thread-214819-1-1.html&lt;/a&gt; awvs10.5 开发框架破解版
&lt;a href=&quot;https://github.com/fnmsd/awvs_script_decode&quot; target=&quot;_blank&quot;&gt;https://github.com/fnmsd/awvs_script_decode&lt;/a&gt; awvs10.5 规则 scripts 解密版，SDK，开发手册
&lt;a href=&quot;https://github.com/NS-Sp4ce/AWVS11.X-Chinese-Version&quot; target=&quot;_blank&quot;&gt;https://github.com/NS-Sp4ce/AWVS11.X-Chinese-Version&lt;/a&gt; awvs11 汉化包&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Burpsuit 相关工具拓展插件&lt;a href=&quot;#burpsuit-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/PortSwigger&quot; target=&quot;_blank&quot;&gt;https://github.com/PortSwigger&lt;/a&gt; burpsuite 官方插件库
&lt;a href=&quot;https://github.com/snoopysecurity/awesome-burp-extensions&quot; target=&quot;_blank&quot;&gt;https://github.com/snoopysecurity/awesome-burp-extensions&lt;/a&gt; awesome 系列之 burp 拓展
&lt;a href=&quot;https://github.com/d3vilbug/HackBar&quot; target=&quot;_blank&quot;&gt;https://github.com/d3vilbug/HackBar&lt;/a&gt; 集成 hackbar
&lt;a href=&quot;https://github.com/PortSwigger/turbo-intruder&quot; target=&quot;_blank&quot;&gt;https://github.com/PortSwigger/turbo-intruder&lt;/a&gt; 比 Burp 自带的 Intruder 更快，一分钟打 1.61 万次请求
&lt;a href=&quot;https://github.com/Ebryx/AES-Killer&quot; target=&quot;_blank&quot;&gt;https://github.com/Ebryx/AES-Killer&lt;/a&gt; burp 插件，破解 aes 加密的插件
&lt;a href=&quot;https://github.com/bugcrowd/HUNT&quot; target=&quot;_blank&quot;&gt;https://github.com/bugcrowd/HUNT&lt;/a&gt; 可以将 burpsuite 扫描器功能扩展的更加强大，同时支持 zapproxy 扩展
&lt;a href=&quot;https://github.com/wagiro/BurpBounty&quot; target=&quot;_blank&quot;&gt;https://github.com/wagiro/BurpBounty&lt;/a&gt; burp 插件增强主动与被动扫描功能
&lt;a href=&quot;https://github.com/nccgroup/BurpSuiteHTTPSmuggler&quot; target=&quot;_blank&quot;&gt;https://github.com/nccgroup/BurpSuiteHTTPSmuggler&lt;/a&gt; Burp 拓展, 使用几种技巧绕过 WAF
&lt;a href=&quot;https://github.com/PortSwigger/command-injection-attacker&quot; target=&quot;_blank&quot;&gt;https://github.com/PortSwigger/command-injection-attacker&lt;/a&gt; burp 插件，命令注入漏洞检测
&lt;a href=&quot;https://github.com/nccgroup/freddy&quot; target=&quot;_blank&quot;&gt;https://github.com/nccgroup/freddy&lt;/a&gt; burp 插件，自动识别 Java/.NET 应用程序中的反序列化漏洞
&lt;a href=&quot;https://github.com/modzero/interestingFileScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/modzero/interestingFileScanner&lt;/a&gt; burp 插件，增强敏感文件扫描
&lt;a href=&quot;https://github.com/summitt/Burp-Non-HTTP-Extension&quot; target=&quot;_blank&quot;&gt;https://github.com/summitt/Burp-Non-HTTP-Extension&lt;/a&gt; burp 插件，布置 dns 服务器抓取流量
&lt;a href=&quot;https://github.com/ilmila/J2EEScan&quot; target=&quot;_blank&quot;&gt;https://github.com/ilmila/J2EEScan&lt;/a&gt; burp 拓展，扫描 J2EE 应用
&lt;a href=&quot;https://github.com/JGillam/burp-co2&quot; target=&quot;_blank&quot;&gt;https://github.com/JGillam/burp-co2&lt;/a&gt; 集成了 sqlmap，菜刀，字典生成等
&lt;a href=&quot;https://github.com/swisskyrepo/SSRFmap&quot; target=&quot;_blank&quot;&gt;https://github.com/swisskyrepo/SSRFmap&lt;/a&gt; burp 插件，检测 ssrf 漏洞&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Sqlmap 相关工具拓展插件&lt;a href=&quot;#sqlmap-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/codewatchorg/sqlipy&quot; target=&quot;_blank&quot;&gt;https://github.com/codewatchorg/sqlipy&lt;/a&gt; burp 与 sqlmap 联动插件
&lt;a href=&quot;https://github.com/Hood3dRob1n/SQLMAP-Web-GUI&quot; target=&quot;_blank&quot;&gt;https://github.com/Hood3dRob1n/SQLMAP-Web-GUI&lt;/a&gt; sqlmap 的 web gui
&lt;a href=&quot;https://github.com/KINGSABRI/sqlmap-tamper-api&quot; target=&quot;_blank&quot;&gt;https://github.com/KINGSABRI/sqlmap-tamper-api&lt;/a&gt; 利用各种语言来编写 sqlmapTamper
&lt;a href=&quot;https://github.com/0xbug/SQLiScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbug/SQLiScanner&lt;/a&gt; 一款基于 sqlmapapi 和 Charles 的被动 SQL 注入漏洞扫描工具
&lt;a href=&quot;https://github.com/fengxuangit/Fox-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/fengxuangit/Fox-scan&lt;/a&gt; 基于 sqlmapapi 的主动和被动资源发现的漏洞扫描工具
&lt;a href=&quot;https://github.com/UltimateHackers/sqlmate&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/sqlmate&lt;/a&gt; 在 sqlmap 基础上增加了目录扫描、hash 爆破等功能
&lt;a href=&quot;https://github.com/ysrc/GourdScanV2&quot; target=&quot;_blank&quot;&gt;https://github.com/ysrc/GourdScanV2&lt;/a&gt; ysrc 出品的被动式漏洞扫描工具，基于 sqlmapapi
&lt;a href=&quot;https://github.com/zt2/sqli-hunter&quot; target=&quot;_blank&quot;&gt;https://github.com/zt2/sqli-hunter&lt;/a&gt; 基于 sqlmapapi，ruby 编写的漏洞代理型检测工具
&lt;a href=&quot;https://github.com/jesuiscamille/AutoSQLi&quot; target=&quot;_blank&quot;&gt;https://github.com/jesuiscamille/AutoSQLi&lt;/a&gt; 利用 DorkNet，Googler, Ddgr, WhatWaf 和 sqlmap 自动注入&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Nmap 相关工具拓展插件&lt;a href=&quot;#nmap-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Ullaakut/nmap&quot; target=&quot;_blank&quot;&gt;https://github.com/Ullaakut/nmap&lt;/a&gt; GO，实现的 Nmap 调用库
&lt;a href=&quot;https://github.com/cldrn/nmap-nse-scripts&quot; target=&quot;_blank&quot;&gt;https://github.com/cldrn/nmap-nse-scripts&lt;/a&gt; NSE 收集列表
&lt;a href=&quot;https://github.com/vulnersCom/nmap-vulners&quot; target=&quot;_blank&quot;&gt;https://github.com/vulnersCom/nmap-vulners&lt;/a&gt; 使用 nmap 扫描常见的服务漏洞
&lt;a href=&quot;https://github.com/s4n7h0/Halcyon&quot; target=&quot;_blank&quot;&gt;https://github.com/s4n7h0/Halcyon&lt;/a&gt; Nmap Script (NSE)IDE 编辑器
&lt;a href=&quot;https://github.com/m4ll0k/AutoNSE&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/AutoNSE&lt;/a&gt; NSE 自动化利用
&lt;a href=&quot;https://github.com/Screetsec/Dracnmap&quot; target=&quot;_blank&quot;&gt;https://github.com/Screetsec/Dracnmap&lt;/a&gt; shell，将 Nmap 复杂的命令进行一定程度的集成与简化，使新用户更加容易上手。
&lt;a href=&quot;https://github.com/cldrn/rainmap-lite&quot; target=&quot;_blank&quot;&gt;https://github.com/cldrn/rainmap-lite&lt;/a&gt; Django，Web 版 Nmap，可以建立新的扫描服务器，允许用户从他们的手机/平板电脑/网络浏览器启动 Nmap 扫描
&lt;a href=&quot;https://github.com/trimstray/sandmap&quot; target=&quot;_blank&quot;&gt;https://github.com/trimstray/sandmap&lt;/a&gt; linux 下将支持使用大量 Nmap 引擎进行网络和系统侦察的工具
&lt;a href=&quot;https://github.com/m0nad/HellRaiser&quot; target=&quot;_blank&quot;&gt;https://github.com/m0nad/HellRaiser&lt;/a&gt; 基于 nmap 的扫描器，与 cve 漏洞关联
&lt;a href=&quot;https://github.com/scipag/vulscan&quot; target=&quot;_blank&quot;&gt;https://github.com/scipag/vulscan&lt;/a&gt; 基于 nmap 的高级漏洞扫描器，命令行环境使用
&lt;a href=&quot;https://github.com/Rev3rseSecurity/WebMap&quot; target=&quot;_blank&quot;&gt;https://github.com/Rev3rseSecurity/WebMap&lt;/a&gt; 将 nmap 的 xml web 展示器
&lt;a href=&quot;https://github.com/DanMcInerney/msf-autopwn&quot; target=&quot;_blank&quot;&gt;https://github.com/DanMcInerney/msf-autopwn&lt;/a&gt; 执行 NMap 扫描或读取扫描结果, 然后自动使用 msf 攻击包含常见漏洞的主机&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Metasploit 相关工具拓展插件&lt;a href=&quot;#metasploit-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/13o-bbr-bbq/machine_learning_security/tree/master/DeepExploit&quot; target=&quot;_blank&quot;&gt;https://github.com/13o-bbr-bbq/machine_learning_security/tree/master/DeepExploit&lt;/a&gt; 结合机器学习与 msf 的全自动测试工具
&lt;a href=&quot;https://github.com/r00t-3xp10it/Meterpreter_Paranoid_Mode-SSL&quot; target=&quot;_blank&quot;&gt;https://github.com/r00t-3xp10it/Meterpreter_Paranoid_Mode-SSL&lt;/a&gt; 一个可以创建 SSL/TLS shell 连接的脚本
&lt;a href=&quot;https://github.com/DanMcInerney/msf-netpwn&quot; target=&quot;_blank&quot;&gt;https://github.com/DanMcInerney/msf-netpwn&lt;/a&gt; 等待 msf 的 session，并自动提为域管理
&lt;a href=&quot;https://www.exploit-db.com/exploits/45851/&quot; target=&quot;_blank&quot;&gt;https://www.exploit-db.com/exploits/45851/&lt;/a&gt; msf 插件，利用 jira upm 上传进行命令执行
&lt;a href=&quot;https://github.com/NullArray/AutoSploit&quot; target=&quot;_blank&quot;&gt;https://github.com/NullArray/AutoSploit&lt;/a&gt; 利用 Shodan 搜索引擎收集目标, 并自动调用设定的 msf 模块对目标发动攻击
&lt;a href=&quot;https://github.com/WazeHell/metateta&quot; target=&quot;_blank&quot;&gt;https://github.com/WazeHell/metateta&lt;/a&gt; 使用 msf 脚本，根据特定协议进行扫描
&lt;a href=&quot;https://github.com/fbkcs/msf-elf-in-memory-execution&quot; target=&quot;_blank&quot;&gt;https://github.com/fbkcs/msf-elf-in-memory-execution&lt;/a&gt; Metasploit 模块, 用于在内存中执行 ELF 文件
&lt;a href=&quot;https://github.com/ElevenPaths/Eternalblue-Doublepulsar-Metasploit&quot; target=&quot;_blank&quot;&gt;https://github.com/ElevenPaths/Eternalblue-Doublepulsar-Metasploit&lt;/a&gt; metasploit 双星攻击利用文件
&lt;a href=&quot;https://github.com/darkoperator/Metasploit-Plugins&quot; target=&quot;_blank&quot;&gt;https://github.com/darkoperator/Metasploit-Plugins&lt;/a&gt; msf 扩展资产搜集与帮助插件
&lt;a href=&quot;https://github.com/D4Vinci/One-Lin3r&quot; target=&quot;_blank&quot;&gt;https://github.com/D4Vinci/One-Lin3r&lt;/a&gt; metasploit、payload 辅助查询工具
&lt;a href=&quot;https://github.com/shizzz477/msploitego&quot; target=&quot;_blank&quot;&gt;https://github.com/shizzz477/msploitego&lt;/a&gt; 将 msf 数据库与 maltego 进行图形化展示
&lt;a href=&quot;https://github.com/scriptjunkie/msfgui&quot; target=&quot;_blank&quot;&gt;https://github.com/scriptjunkie/msfgui&lt;/a&gt; metasploit 的 GUI 界面，话说现在 msf 对 windows 支持也挺好的&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;CobaltStrike 相关工具拓展插件&lt;a href=&quot;#cobaltstrike-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/CEI1XYkq2PZmYsP0DRU7jg&quot; target=&quot;_blank&quot;&gt;https://mp.weixin.qq.com/s/CEI1XYkq2PZmYsP0DRU7jg&lt;/a&gt; 使用 Aggressor 脚本雕饰 Cobalt Strike
&lt;a href=&quot;https://github.com/rsmudge/armitage&quot; target=&quot;_blank&quot;&gt;https://github.com/rsmudge/armitage&lt;/a&gt; CobaltStrike 社区版，调用 msf，一对多带界面
&lt;a href=&quot;https://github.com/anbai-inc/CobaltStrike_Hanization&quot; target=&quot;_blank&quot;&gt;https://github.com/anbai-inc/CobaltStrike_Hanization&lt;/a&gt; CobaltStrike2.5 汉化版，以 msf 库为基础，3.0 以后改版
&lt;a href=&quot;https://github.com/rsmudge/cortana-scripts&quot; target=&quot;_blank&quot;&gt;https://github.com/rsmudge/cortana-scripts&lt;/a&gt; 用于 cs2.x 与 armitage 的可拓展插件，cvs3.x 的为 AggressorScripts
&lt;a href=&quot;https://github.com/harleyQu1nn/AggressorScripts&quot; target=&quot;_blank&quot;&gt;https://github.com/harleyQu1nn/AggressorScripts&lt;/a&gt; cs3.0 以后的脚本搜集
&lt;a href=&quot;https://github.com/FortyNorthSecurity/AggressorAssessor&quot; target=&quot;_blank&quot;&gt;https://github.com/FortyNorthSecurity/AggressorAssessor&lt;/a&gt; cs3.x 自动化攻击脚本集合
&lt;a href=&quot;https://github.com/Ridter/CS_Chinese_support/&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/CS_Chinese_support/&lt;/a&gt; cs3.0 传输信息的汉化插件
&lt;a href=&quot;https://github.com/verctor/CS_xor64&quot; target=&quot;_blank&quot;&gt;https://github.com/verctor/CS_xor64&lt;/a&gt; 生成 cobaltstrike 所需的 xor64.bin
&lt;a href=&quot;https://github.com/ryhanson/ExternalC2&quot; target=&quot;_blank&quot;&gt;https://github.com/ryhanson/ExternalC2&lt;/a&gt; 一个用于将通信渠道与 Cobalt Strike External C2 服务器集成的库
&lt;a href=&quot;https://github.com/threatexpress/cs2modrewrite&quot; target=&quot;_blank&quot;&gt;https://github.com/threatexpress/cs2modrewrite&lt;/a&gt; 用于将 Cobalt Strike 配置文件转换为 mod_rewrite 脚本的工具
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/CatMyFish&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/CatMyFish&lt;/a&gt; 搜索分类域，为 Cobalt Strike beacon C&amp;amp;C 设置白名单域
&lt;a href=&quot;https://github.com/threatexpress/malleable-c2&quot; target=&quot;_blank&quot;&gt;https://github.com/threatexpress/malleable-c2&lt;/a&gt; 利用 jquery 文件进行 C2 通讯，在文件内做了 JS 混淆绕过防火墙
&lt;a href=&quot;https://github.com/dcsync/pycobalt&quot; target=&quot;_blank&quot;&gt;https://github.com/dcsync/pycobalt&lt;/a&gt; py3,Python API for Cobalt Strike
&lt;a href=&quot;https://www.cobaltstrike.com/aggressor-script/cobaltstrike.html&quot; target=&quot;_blank&quot;&gt;https://www.cobaltstrike.com/aggressor-script/cobaltstrike.html&lt;/a&gt; CobaltStrike 相关插件编写，一对多带界面&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Empire 相关工具拓展插件&lt;a href=&quot;#empire-相关工具拓展插件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://paper.tuisec.win/detail/f3dce68a0b4baaa&quot; target=&quot;_blank&quot;&gt;https://paper.tuisec.win/detail/f3dce68a0b4baaa&lt;/a&gt; 利用 Empire 获取域控权限
&lt;a href=&quot;https://github.com/EmpireProject/Empire-GUI&quot; target=&quot;_blank&quot;&gt;https://github.com/EmpireProject/Empire-GUI&lt;/a&gt; empire 的 node.js 界面
&lt;a href=&quot;https://github.com/interference-security/empire-web&quot; target=&quot;_blank&quot;&gt;https://github.com/interference-security/empire-web&lt;/a&gt; empire 的 web 界面
&lt;a href=&quot;https://github.com/byt3bl33d3r/DeathStar&quot; target=&quot;_blank&quot;&gt;https://github.com/byt3bl33d3r/DeathStar&lt;/a&gt; py3,调用 Empire RESTful API 自动化获取域管权限的
&lt;a href=&quot;https://github.com/infosecn1nja/e2modrewrite&quot; target=&quot;_blank&quot;&gt;https://github.com/infosecn1nja/e2modrewrite&lt;/a&gt; 用于将 Empire 配置文件转换为 Apache modrewrite 脚本
&lt;a href=&quot;https://github.com/maxchehab/CSS-Keylogging&quot; target=&quot;_blank&quot;&gt;https://github.com/maxchehab/CSS-Keylogging&lt;/a&gt; Chrome 扩展程序和 Express 服务器利用 CSS 的键盘记录功能。
&lt;a href=&quot;https://github.com/evilcos/cookiehacker&quot; target=&quot;_blank&quot;&gt;https://github.com/evilcos/cookiehacker&lt;/a&gt; Chrome 扩展程序。JavaScript document.cookie / Wireshark Cookie
&lt;a href=&quot;https://github.com/lfzark/cookie-injecting-tools&quot; target=&quot;_blank&quot;&gt;https://github.com/lfzark/cookie-injecting-tools&lt;/a&gt; Chrome 扩展，cookie 注入工具包括注入，编辑，添加和删除 cookie&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;信息搜集&lt;a href=&quot;#信息搜集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/smicallef/spiderfoot&quot; target=&quot;_blank&quot;&gt;https://github.com/smicallef/spiderfoot&lt;/a&gt; 利用 OSINT 自动化找出对方信息，gui 界面，插件化
&lt;a href=&quot;https://github.com/Nhoya/gOSINT&quot; target=&quot;_blank&quot;&gt;https://github.com/Nhoya/gOSINT&lt;/a&gt; go，利用 OSINT 自动化搜集信息
&lt;a href=&quot;https://github.com/laramies/theHarvester&quot; target=&quot;_blank&quot;&gt;https://github.com/laramies/theHarvester&lt;/a&gt; 企业被搜索引擎收录敏感资产信息监控脚本：员工邮箱、子域名、Hosts
&lt;a href=&quot;https://github.com/guelfoweb/knock&quot; target=&quot;_blank&quot;&gt;https://github.com/guelfoweb/knock&lt;/a&gt; 通过爆破进行子域名获取，可用于查找子域名接管漏洞
&lt;a href=&quot;https://github.com/aboul3la/Sublist3r&quot; target=&quot;_blank&quot;&gt;https://github.com/aboul3la/Sublist3r&lt;/a&gt; 通过搜索引擎与爆破快速子域枚举工具
&lt;a href=&quot;https://github.com/Ice3man543/subfinder&quot; target=&quot;_blank&quot;&gt;https://github.com/Ice3man543/subfinder&lt;/a&gt; 基于 go 实现的 Sublist3r
&lt;a href=&quot;https://github.com/yanxiu0614/subdomain3&quot; target=&quot;_blank&quot;&gt;https://github.com/yanxiu0614/subdomain3&lt;/a&gt; py3、py2 的子域名,IP,CDN 信息等
&lt;a href=&quot;https://github.com/caffix/amass&quot; target=&quot;_blank&quot;&gt;https://github.com/caffix/amass&lt;/a&gt; 基于 go，子域名枚举, 搜索互联网数据源, 使用机器学习猜测子域名
&lt;a href=&quot;https://github.com/nahamsec/lazyrecon&quot; target=&quot;_blank&quot;&gt;https://github.com/nahamsec/lazyrecon&lt;/a&gt; 侦查 reconnaissance 过程自动化脚本, 可自动使用 Sublist3r/certspotter 获取子域名, 调用 nmap/dirsearch 等
&lt;a href=&quot;https://github.com/s0md3v/ReconDog&quot; target=&quot;_blank&quot;&gt;https://github.com/s0md3v/ReconDog&lt;/a&gt; simple，侦查信息的瑞士军刀
&lt;a href=&quot;https://github.com/FeeiCN/ESD&quot; target=&quot;_blank&quot;&gt;https://github.com/FeeiCN/ESD&lt;/a&gt; py3，爆破搜集子域名
&lt;a href=&quot;https://github.com/alpha1e0/pentestdb&quot; target=&quot;_blank&quot;&gt;https://github.com/alpha1e0/pentestdb&lt;/a&gt; 多用途集成化信息搜集工具
&lt;a href=&quot;https://github.com/se55i0n/PortScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/se55i0n/PortScanner&lt;/a&gt; py2,目标 tcp 端口快速扫描、banner 识别、cdn 检测
&lt;a href=&quot;https://github.com/lijiejie/subDomainsBrute&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/subDomainsBrute&lt;/a&gt; lijiejie 开发的一款使用广泛的子域名爆破枚举工具
&lt;a href=&quot;https://github.com/ring04h/wydomain&quot; target=&quot;_blank&quot;&gt;https://github.com/ring04h/wydomain&lt;/a&gt; 猪猪侠开发的一款域名收集全面、精准的子域名枚举工具
&lt;a href=&quot;https://github.com/n4xh4ck5/N4xD0rk&quot; target=&quot;_blank&quot;&gt;https://github.com/n4xh4ck5/N4xD0rk&lt;/a&gt; 利用搜索引擎来搜集子域名，可以使用西班牙语搜集
&lt;a href=&quot;https://github.com/vysec/DomLink&quot; target=&quot;_blank&quot;&gt;https://github.com/vysec/DomLink&lt;/a&gt; py2,调用 WHOXY.com，对邮箱和域名进行进一步的搜集
&lt;a href=&quot;https://github.com/jonluca/Anubis&quot; target=&quot;_blank&quot;&gt;https://github.com/jonluca/Anubis&lt;/a&gt; py3.6，子域名爆破与信息搜集
&lt;a href=&quot;https://github.com/le4f/dnsmaper&quot; target=&quot;_blank&quot;&gt;https://github.com/le4f/dnsmaper&lt;/a&gt; web 界面，子域名枚举爆破工具以及地图位置标记
&lt;a href=&quot;https://github.com/thewhiteh4t/seeker&quot; target=&quot;_blank&quot;&gt;https://github.com/thewhiteh4t/seeker&lt;/a&gt; 获取高精度地理信息和设备信息的工具
&lt;a href=&quot;https://github.com/0xbug/orangescan&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbug/orangescan&lt;/a&gt; web 界面，的在线子域名信息收集工具
&lt;a href=&quot;https://github.com/TheRook/subbrute&quot; target=&quot;_blank&quot;&gt;https://github.com/TheRook/subbrute&lt;/a&gt; 扫描器中常用的子域名爆破 API 库
&lt;a href=&quot;https://github.com/We5ter/GSDF&quot; target=&quot;_blank&quot;&gt;https://github.com/We5ter/GSDF&lt;/a&gt; 基于谷歌 SSL 透明证书的子域名查询脚本
&lt;a href=&quot;https://github.com/mandatoryprogrammer/cloudflare_enum&quot; target=&quot;_blank&quot;&gt;https://github.com/mandatoryprogrammer/cloudflare_enum&lt;/a&gt; 利用 CloudFlare 的 dns 进行子域名枚举
&lt;a href=&quot;https://github.com/ultrasecurity/webkiller&quot; target=&quot;_blank&quot;&gt;https://github.com/ultrasecurity/webkiller&lt;/a&gt; 渗透辅助，py，ip 信息、端口服务指纹、蜜罐探测、bypass cloudflare
&lt;a href=&quot;https://github.com/christophetd/CloudFlair&quot; target=&quot;_blank&quot;&gt;https://github.com/christophetd/CloudFlair&lt;/a&gt; cloudflare 绕过，获取真实 ip，集成 censys
&lt;a href=&quot;https://github.com/exp-db/PythonPool/tree/master/Tools/DomainSeeker&quot; target=&quot;_blank&quot;&gt;https://github.com/exp-db/PythonPool/tree/master/Tools/DomainSeeker&lt;/a&gt; 多方式收集目标子域名信息
&lt;a href=&quot;https://github.com/code-scan/BroDomain&quot; target=&quot;_blank&quot;&gt;https://github.com/code-scan/BroDomain&lt;/a&gt; 子域名查询
&lt;a href=&quot;https://github.com/michenriksen/aquatone&quot; target=&quot;_blank&quot;&gt;https://github.com/michenriksen/aquatone&lt;/a&gt; 子域名枚举、探测工具。可用于子域名接管漏洞探测
&lt;a href=&quot;https://github.com/chuhades/dnsbrute&quot; target=&quot;_blank&quot;&gt;https://github.com/chuhades/dnsbrute&lt;/a&gt; 基于 go，高效的子域名爆破工具
&lt;a href=&quot;https://github.com/evilsocket/dnssearch&quot; target=&quot;_blank&quot;&gt;https://github.com/evilsocket/dnssearch&lt;/a&gt; 基于 go，一款子域名爆破工具
&lt;a href=&quot;https://github.com/OJ/gobuster&quot; target=&quot;_blank&quot;&gt;https://github.com/OJ/gobuster&lt;/a&gt; 基于 go，根据 dns 查询子域名和 web 目录爆破的工具
&lt;a href=&quot;https://github.com/reconned/domained&quot; target=&quot;_blank&quot;&gt;https://github.com/reconned/domained&lt;/a&gt; 可用于子域名收集的一款工具
&lt;a href=&quot;https://github.com/bit4woo/Teemo&quot; target=&quot;_blank&quot;&gt;https://github.com/bit4woo/Teemo&lt;/a&gt; 多方式域名收集及枚举工具
&lt;a href=&quot;https://github.com/swisskyrepo/Subdomino&quot; target=&quot;_blank&quot;&gt;https://github.com/swisskyrepo/Subdomino&lt;/a&gt; 子域名枚举，端口扫描，服务存活确认
&lt;a href=&quot;https://github.com/nmalcolm/Inventus&quot; target=&quot;_blank&quot;&gt;https://github.com/nmalcolm/Inventus&lt;/a&gt; 通过爬虫实现的子域名收集工具
&lt;a href=&quot;https://github.com/alienwithin/OWASP-mth3l3m3nt-framework&quot; target=&quot;_blank&quot;&gt;https://github.com/alienwithin/OWASP-mth3l3m3nt-framework&lt;/a&gt; 渗透辅助，php，exp 搜寻、payload 与 shell 生产、信息搜集
&lt;a href=&quot;https://github.com/chrismaddalena/ODIN&quot; target=&quot;_blank&quot;&gt;https://github.com/chrismaddalena/ODIN&lt;/a&gt; py3，simple，信息搜集与后期漏洞利用
&lt;a href=&quot;https://github.com/x0day/bannerscan&quot; target=&quot;_blank&quot;&gt;https://github.com/x0day/bannerscan&lt;/a&gt; C 段/旁站查询与路径扫描
&lt;a href=&quot;https://github.com/Xyntax/BingC&quot; target=&quot;_blank&quot;&gt;https://github.com/Xyntax/BingC&lt;/a&gt; 基于 Bing 搜索引擎的 C 段/旁站查询，多线程，支持 API
&lt;a href=&quot;https://github.com/zer0h/httpscan&quot; target=&quot;_blank&quot;&gt;https://github.com/zer0h/httpscan&lt;/a&gt; 网段 Web 主机发现小工具
&lt;a href=&quot;https://github.com/lijiejie/BBScan&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/BBScan&lt;/a&gt; 网站信息泄漏批量扫描脚本
&lt;a href=&quot;https://github.com/aipengjie/sensitivefilescan&quot; target=&quot;_blank&quot;&gt;https://github.com/aipengjie/sensitivefilescan&lt;/a&gt; 网站敏感文件扫描工具
&lt;a href=&quot;https://github.com/Mosuan/FileScan&quot; target=&quot;_blank&quot;&gt;https://github.com/Mosuan/FileScan&lt;/a&gt; 网站敏感文件扫描 / 二次判断降低误报率 / 扫描内容规则化 / 多目录扫描
&lt;a href=&quot;https://github.com/Xyntax/FileSensor&quot; target=&quot;_blank&quot;&gt;https://github.com/Xyntax/FileSensor&lt;/a&gt; 网站敏感文件探测工具
&lt;a href=&quot;https://github.com/ring04h/weakfilescan&quot; target=&quot;_blank&quot;&gt;https://github.com/ring04h/weakfilescan&lt;/a&gt; 多线程网站泄露信息检测工具
&lt;a href=&quot;https://github.com/Viralmaniar/Passhunt&quot; target=&quot;_blank&quot;&gt;https://github.com/Viralmaniar/Passhunt&lt;/a&gt; simple，用于搜索网络设备 Web 应用程序等的默认凭证。包含 523 个厂家的 2084 组默认密码
&lt;a href=&quot;https://github.com/yassineaboukir/Asnlookup&quot; target=&quot;_blank&quot;&gt;https://github.com/yassineaboukir/Asnlookup&lt;/a&gt; simple,利用 ASN 搜索特定组织拥有 ip，可联动 nmap、masscan 进行进一步信息扫描&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;敏感信息泄露发现&lt;a href=&quot;#敏感信息泄露发现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Yelp/detect-secrets&quot; target=&quot;_blank&quot;&gt;https://github.com/Yelp/detect-secrets&lt;/a&gt; PY,防止代码中的密码等相关敏感信息被提交到代码库中，可以在保证安全性的同时不会给开发者的生产力带来任何影响
&lt;a href=&quot;https://github.com/Acceis/leakScraper&quot; target=&quot;_blank&quot;&gt;https://github.com/Acceis/leakScraper&lt;/a&gt; 处理和可视化大规模文本文件, 查找敏感信息, 例如证书
&lt;a href=&quot;https://github.com/Raikia/CredNinja&quot; target=&quot;_blank&quot;&gt;https://github.com/Raikia/CredNinja&lt;/a&gt; 多线程用户凭证验证脚本，比如验证 dump 的 hash 是否属于此机器，利用 445 端口进行协议验证
&lt;a href=&quot;https://github.com/CERTCC/keyfinder&quot; target=&quot;_blank&quot;&gt;https://github.com/CERTCC/keyfinder&lt;/a&gt; 查找并分析私钥/公钥文件(文件系统中), 支持 Android APK 文件
&lt;a href=&quot;https://github.com/Ice3man543/hawkeye&quot; target=&quot;_blank&quot;&gt;https://github.com/Ice3man543/hawkeye&lt;/a&gt; go，cli 端，文件系统分析工具，快速查找文件内包含的 SSH 密钥，日志文件，Sqlite 数据库，密码文件等
&lt;a href=&quot;https://github.com/FortyNorthSecurity/EyeWitness&quot; target=&quot;_blank&quot;&gt;https://github.com/FortyNorthSecurity/EyeWitness&lt;/a&gt; 获取目标网站截图、vnc、rdp 服务，尝试获取默认凭证
&lt;a href=&quot;https://github.com/D4Vinci/Cr3dOv3r&quot; target=&quot;_blank&quot;&gt;https://github.com/D4Vinci/Cr3dOv3r&lt;/a&gt; 根据邮箱自动搜索泄漏的密码信息，也可测试账户密码在各大网站能否登录的工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;威胁情报分析&lt;a href=&quot;#威胁情报分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.databases.today%EF%BC%8Chttps://publicdbhost.dmca.gripe/%EF%BC%8Chttp://www.wttech.org/%EF%BC%8Chttps://hashes.org/leaks.php%EF%BC%8Chttps://archive.org/search.php?query=&quot; target=&quot;_blank&quot;&gt;https://www.databases.today，https://publicdbhost.dmca.gripe/，http://www.wttech.org/，https://hashes.org/leaks.php，https://archive.org/search.php?query=&lt;/a&gt; 密码泄露
&lt;a href=&quot;https://www.threatcrowd.org/&quot; target=&quot;_blank&quot;&gt;https://www.threatcrowd.org/&lt;/a&gt; 威胁情报分析平台
&lt;a href=&quot;https://x.threatbook.cn/&quot; target=&quot;_blank&quot;&gt;https://x.threatbook.cn/&lt;/a&gt; 微步在线 | 威胁情报分析平台-ThreatBook-多引擎在线扫描、恶意软件在线检测
&lt;a href=&quot;https://github.com/needmorecowbell/sniff-paste&quot; target=&quot;_blank&quot;&gt;https://github.com/needmorecowbell/sniff-paste&lt;/a&gt; 针对 Pastebin 的开源情报收集工具
&lt;a href=&quot;https://talosintelligence.com/documents/ip-blacklist&quot; target=&quot;_blank&quot;&gt;https://talosintelligence.com/documents/ip-blacklist&lt;/a&gt; 恶意 IP 地址
&lt;a href=&quot;https://ransomwaretracker.abuse.ch/downloads/RW_IPBL.txt&quot; target=&quot;_blank&quot;&gt;https://ransomwaretracker.abuse.ch/downloads/RW_IPBL.txt&lt;/a&gt; 恶意软件 IP 地址
&lt;a href=&quot;https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=1.1.1.1&quot; target=&quot;_blank&quot;&gt;https://check.torproject.org/cgi-bin/TorBulkExitList.py?ip=1.1.1.1&lt;/a&gt; 洋葱路由出口节点
&lt;a href=&quot;https://isc.sans.edu/api/threatlist/shodan&quot; target=&quot;_blank&quot;&gt;https://isc.sans.edu/api/threatlist/shodan&lt;/a&gt; shodan 撒旦扫描器节点
&lt;a href=&quot;https://github.com/Te-k/harpoon&quot; target=&quot;_blank&quot;&gt;https://github.com/Te-k/harpoon&lt;/a&gt; 用于开源和威胁智能的 CLI 工具
&lt;a href=&quot;https://trumail.io/&quot; target=&quot;_blank&quot;&gt;https://trumail.io/&lt;/a&gt; 验证对方邮箱是否为垃圾邮箱，每个月可以免费验证 1000 次
&lt;a href=&quot;https://github.com/ChrisJohnRiley/Scythe&quot; target=&quot;_blank&quot;&gt;https://github.com/ChrisJohnRiley/Scythe&lt;/a&gt; 验证账号是否为常用账号
&lt;a href=&quot;https://github.com/fireeye/GeoLogonalyzer&quot; target=&quot;_blank&quot;&gt;https://github.com/fireeye/GeoLogonalyzer&lt;/a&gt; 远程身份验证地理位置分析工具，用于区分合法登录和恶意登录。
&lt;a href=&quot;https://github.com/target/strelka&quot; target=&quot;_blank&quot;&gt;https://github.com/target/strelka&lt;/a&gt; py3，通过实时扫描文件进行威胁情报分析和实时监测。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;托管云安全&lt;a href=&quot;#托管云安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/stuhirst/awssecurity/blob/master/arsenal.md&quot; target=&quot;_blank&quot;&gt;https://github.com/stuhirst/awssecurity/blob/master/arsenal.md&lt;/a&gt; AWS 安全检测相关的项目列表
&lt;a href=&quot;https://github.com/toniblyx/my-arsenal-of-aws-security-tools&quot; target=&quot;_blank&quot;&gt;https://github.com/toniblyx/my-arsenal-of-aws-security-tools&lt;/a&gt; AWS 安全工具集
&lt;a href=&quot;https://github.com/sa7mon/S3Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/sa7mon/S3Scanner&lt;/a&gt; 扫描 amazon 公开的 S3 buckets 和 dump
&lt;a href=&quot;https://github.com/kromtech/s3-inspector&quot; target=&quot;_blank&quot;&gt;https://github.com/kromtech/s3-inspector&lt;/a&gt; 检测亚马逊 AWS S3 bucket permissions
&lt;a href=&quot;https://github.com/jordanpotti/AWSBucketDump&quot; target=&quot;_blank&quot;&gt;https://github.com/jordanpotti/AWSBucketDump&lt;/a&gt; 枚举 AWS S3 buckets 以查找敏感机密的文件
&lt;a href=&quot;https://github.com/sa7mon/S3Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/sa7mon/S3Scanner&lt;/a&gt; 扫描 amazon 公开的 S3 buckets 和 dump
&lt;a href=&quot;https://github.com/kromtech/s3-inspector&quot; target=&quot;_blank&quot;&gt;https://github.com/kromtech/s3-inspector&lt;/a&gt; 检测亚马逊 AWS S3 bucket permissions
&lt;a href=&quot;https://github.com/jordanpotti/AWSBucketDump&quot; target=&quot;_blank&quot;&gt;https://github.com/jordanpotti/AWSBucketDump&lt;/a&gt; 枚举 AWS S3 buckets 以查找敏感机密的文件
&lt;a href=&quot;https://github.com/Netflix/repokid&quot; target=&quot;_blank&quot;&gt;https://github.com/Netflix/repokid&lt;/a&gt; AWS 最低权限策略部署工具
&lt;a href=&quot;https://github.com/RhinoSecurityLabs/pacu&quot; target=&quot;_blank&quot;&gt;https://github.com/RhinoSecurityLabs/pacu&lt;/a&gt; AWS 漏洞检测框架
&lt;a href=&quot;https://github.com/0xbug/Hawkeye&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbug/Hawkeye&lt;/a&gt; GitHub 泄露监控系统
&lt;a href=&quot;https://github.com/neal1991/gshark&quot; target=&quot;_blank&quot;&gt;https://github.com/neal1991/gshark&lt;/a&gt; github 信息泄露检测
&lt;a href=&quot;https://github.com/VKSRC/Github-Monitor&quot; target=&quot;_blank&quot;&gt;https://github.com/VKSRC/Github-Monitor&lt;/a&gt; GitHub 监控，代码信息泄露，分钟级监控，邮件预警
&lt;a href=&quot;https://github.com/metac0rtex/GitHarvester&quot; target=&quot;_blank&quot;&gt;https://github.com/metac0rtex/GitHarvester&lt;/a&gt; github Repo 信息搜集工具
&lt;a href=&quot;https://github.com/repoog/GitPrey&quot; target=&quot;_blank&quot;&gt;https://github.com/repoog/GitPrey&lt;/a&gt; GitHub 敏感信息扫描工具
&lt;a href=&quot;https://github.com/FeeiCN/GSIL&quot; target=&quot;_blank&quot;&gt;https://github.com/FeeiCN/GSIL&lt;/a&gt; py3，近实时监控 Github 敏感信息，并发送告警通知。
&lt;a href=&quot;https://github.com/UnkL4b/GitMiner&quot; target=&quot;_blank&quot;&gt;https://github.com/UnkL4b/GitMiner&lt;/a&gt; github 敏感内容挖掘
&lt;a href=&quot;https://github.com/dxa4481/truffleHog&quot; target=&quot;_blank&quot;&gt;https://github.com/dxa4481/truffleHog&lt;/a&gt; GitHub 敏感信息扫描工具,包括检测 commit 等
&lt;a href=&quot;https://github.com/Hell0W0rld0/Github-Hunter&quot; target=&quot;_blank&quot;&gt;https://github.com/Hell0W0rld0/Github-Hunter&lt;/a&gt; github 信息监测脚本
&lt;a href=&quot;https://github.com/awslabs/git-secrets&quot; target=&quot;_blank&quot;&gt;https://github.com/awslabs/git-secrets&lt;/a&gt; 防止将敏感数据提交到 git 仓库的工具
&lt;a href=&quot;https://github.com/zricethezav/gitleaks&quot; target=&quot;_blank&quot;&gt;https://github.com/zricethezav/gitleaks&lt;/a&gt; 基于 go 的，检查 git repo 中的密码信息和密钥&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;目录路径发现&lt;a href=&quot;#目录路径发现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/maurosoria/dirsearch&quot; target=&quot;_blank&quot;&gt;https://github.com/maurosoria/dirsearch&lt;/a&gt; 经典目录路径扫描
&lt;a href=&quot;https://github.com/TheM4hd1/PenCrawLer&quot; target=&quot;_blank&quot;&gt;https://github.com/TheM4hd1/PenCrawLer&lt;/a&gt; C#界面，web 爬虫与目录路径爆破工具，除了常规扫描增加了递归爆破模式
&lt;a href=&quot;https://github.com/Xyntax/DirBrute&quot; target=&quot;_blank&quot;&gt;https://github.com/Xyntax/DirBrute&lt;/a&gt; 目录路径爆破工具
&lt;a href=&quot;https://github.com/abaykan/crawlbox&quot; target=&quot;_blank&quot;&gt;https://github.com/abaykan/crawlbox&lt;/a&gt; 目录路径路径扫描器
&lt;a href=&quot;https://github.com/deibit/cansina&quot; target=&quot;_blank&quot;&gt;https://github.com/deibit/cansina&lt;/a&gt; 目录路径路径扫描器
&lt;a href=&quot;https://github.com/UltimateHackers/Breacher&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/Breacher&lt;/a&gt; 多线程的后台路径扫描器，也可用于发现 Execution After Redirect 漏洞
&lt;a href=&quot;https://github.com/fnk0c/cangibrina&quot; target=&quot;_blank&quot;&gt;https://github.com/fnk0c/cangibrina&lt;/a&gt; 通过字典穷举、google、robots.txt 等途径的跨平台后台管理路径扫描器
&lt;a href=&quot;https://github.com/Go0s/SitePathScan&quot; target=&quot;_blank&quot;&gt;https://github.com/Go0s/SitePathScan&lt;/a&gt; 基于协程的目录路径爆破工具，配合 aiohttp 扫描路径比之前快了三倍有余
&lt;a href=&quot;https://github.com/secfree/bcrpscan&quot; target=&quot;_blank&quot;&gt;https://github.com/secfree/bcrpscan&lt;/a&gt; 基于爬虫的 web 路径扫描器&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;本地文件包含漏洞&lt;a href=&quot;#本地文件包含漏洞&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/hvqzao/liffy&quot; target=&quot;_blank&quot;&gt;https://github.com/hvqzao/liffy&lt;/a&gt; 本地文件包含漏洞利用工具
&lt;a href=&quot;https://github.com/D35m0nd142/Kadabra&quot; target=&quot;_blank&quot;&gt;https://github.com/D35m0nd142/Kadabra&lt;/a&gt; 本地文件包含漏洞扫描和利用工具
&lt;a href=&quot;https://github.com/P0cL4bs/Kadimus&quot; target=&quot;_blank&quot;&gt;https://github.com/P0cL4bs/Kadimus&lt;/a&gt; 本地文件包含漏洞扫描和利用工具
&lt;a href=&quot;https://github.com/D35m0nd142/LFISuite&quot; target=&quot;_blank&quot;&gt;https://github.com/D35m0nd142/LFISuite&lt;/a&gt; 本地文件包含漏洞利用及扫描工具，支持反弹 shell
&lt;a href=&quot;https://github.com/OsandaMalith/LFiFreak&quot; target=&quot;_blank&quot;&gt;https://github.com/OsandaMalith/LFiFreak&lt;/a&gt; 本地文件包含漏洞利用及扫描工具，支持反弹 shell&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;安全测试与扫描器框架&lt;a href=&quot;#安全测试与扫描器框架&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/zaproxy/zaproxy&quot; target=&quot;_blank&quot;&gt;https://github.com/zaproxy/zaproxy&lt;/a&gt; The OWASP ZAP core project 出品的综合性渗透测试工具。由于其流量代理、请求重放和可扩展性拿来做模糊测试未尝不可
&lt;a href=&quot;https://github.com/x-Ai/BurpUnlimitedre&quot; target=&quot;_blank&quot;&gt;https://github.com/x-Ai/BurpUnlimitedre&lt;/a&gt; burpsuite 1.7.27 的永久破解版
&lt;a href=&quot;https://github.com/andresriancho/w3af&quot; target=&quot;_blank&quot;&gt;https://github.com/andresriancho/w3af&lt;/a&gt; 知名插件化扫描器
&lt;a href=&quot;https://github.com/juansacco/exploitpack&quot; target=&quot;_blank&quot;&gt;https://github.com/juansacco/exploitpack&lt;/a&gt; 渗透测试集成框架，包含超过 38,000+ exploits
&lt;a href=&quot;https://github.com/Lucifer1993/AngelSword&quot; target=&quot;_blank&quot;&gt;https://github.com/Lucifer1993/AngelSword&lt;/a&gt; Web 应用漏洞扫描框架,python3，300poc
&lt;a href=&quot;https://github.com/Xyntax/POC-T&quot; target=&quot;_blank&quot;&gt;https://github.com/Xyntax/POC-T&lt;/a&gt; 渗透测试插件化扫描框架，自带 poc，并发扫描
&lt;a href=&quot;https://github.com/knownsec/Pocsuite&quot; target=&quot;_blank&quot;&gt;https://github.com/knownsec/Pocsuite&lt;/a&gt; 知道创宇维护的一个规范化 POC/EXP 利用框架
&lt;a href=&quot;https://github.com/leisurelicht/Pocsuite3&quot; target=&quot;_blank&quot;&gt;https://github.com/leisurelicht/Pocsuite3&lt;/a&gt; Pocsuite 用 py3 重写
&lt;a href=&quot;https://github.com/Eitenne/roxysploit&quot; target=&quot;_blank&quot;&gt;https://github.com/Eitenne/roxysploit&lt;/a&gt; 漏洞利用框架，支持永恒之蓝直接利用
&lt;a href=&quot;https://github.com/TophantTechnology/osprey&quot; target=&quot;_blank&quot;&gt;https://github.com/TophantTechnology/osprey&lt;/a&gt; 斗象能力中心出品并长期维护的一个规范化 POC/EXP 利用框架
&lt;a href=&quot;https://github.com/he1m4n6a/btScan&quot; target=&quot;_blank&quot;&gt;https://github.com/he1m4n6a/btScan&lt;/a&gt; 大黑阔的插件化漏洞利用工具
&lt;a href=&quot;https://github.com/boy-hack/w9scan&quot; target=&quot;_blank&quot;&gt;https://github.com/boy-hack/w9scan&lt;/a&gt; python 下内置 1200+插件可对网站进行一次规模的检测
&lt;a href=&quot;https://github.com/WooYun/TangScan&quot; target=&quot;_blank&quot;&gt;https://github.com/WooYun/TangScan&lt;/a&gt; 乌云维护的一个规范化 POC/EXP 利用框架
&lt;a href=&quot;https://github.com/n0tr00t/Beebeeto-framework&quot; target=&quot;_blank&quot;&gt;https://github.com/n0tr00t/Beebeeto-framework&lt;/a&gt; Beebeeto 是由众多安全研究人员所共同维护的一个规范化 POC/EXP 利用框架
&lt;a href=&quot;https://github.com/erevus-cn/pocscan&quot; target=&quot;_blank&quot;&gt;https://github.com/erevus-cn/pocscan&lt;/a&gt; 一款开源 Poc 调用框架,可轻松调用 Pocsuite,Tangscan,Beebeeto,Knowsec 老版本 POC，可使用 docker 部署
&lt;a href=&quot;https://github.com/DavexPro/PocHunter&quot; target=&quot;_blank&quot;&gt;https://github.com/DavexPro/PocHunter&lt;/a&gt; 借鉴 pocscan 的一款多利用框架 poc 适配框架
&lt;a href=&quot;https://github.com/theInfectedDrake/TIDoS-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/theInfectedDrake/TIDoS-Framework&lt;/a&gt; 覆盖从侦察到漏洞分析的所有内容
&lt;a href=&quot;https://github.com/gyoisamurai/GyoiThon&quot; target=&quot;_blank&quot;&gt;https://github.com/gyoisamurai/GyoiThon&lt;/a&gt; 使用深度学习的渗透测试工具, 从每次扫描数据中学习, 扫描越多, 软件检测精准度越高
&lt;a href=&quot;https://github.com/euphrat1ca/polar-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/euphrat1ca/polar-scan&lt;/a&gt; 易语言的北极熊扫描器
&lt;a href=&quot;https://github.com/euphrat1ca/yeezy-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/euphrat1ca/yeezy-scan&lt;/a&gt; 椰树 1.9 扫描器
&lt;a href=&quot;https://github.com/euphrat1ca/WebCruiserWVS&quot; target=&quot;_blank&quot;&gt;https://github.com/euphrat1ca/WebCruiserWVS&lt;/a&gt; 轻量级基于 C#的扫描器，椰树扫描器的前身
&lt;a href=&quot;https://github.com/Skycrab/leakScan&quot; target=&quot;_blank&quot;&gt;https://github.com/Skycrab/leakScan&lt;/a&gt; web 界面，漏洞扫描
&lt;a href=&quot;https://github.com/az0ne/AZScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/az0ne/AZScanner&lt;/a&gt; web 界面，自动漏洞扫描器，子域名爆破，端口扫描，目录爆破，常用框架漏洞检测
&lt;a href=&quot;https://github.com/boy-hack/w8scan&quot; target=&quot;_blank&quot;&gt;https://github.com/boy-hack/w8scan&lt;/a&gt; web 界面，基于 bugscan 扫描和架构思想的扫描器
&lt;a href=&quot;https://github.com/MiniSafe/microweb&quot; target=&quot;_blank&quot;&gt;https://github.com/MiniSafe/microweb&lt;/a&gt; web 界面，base bugscan，django
&lt;a href=&quot;https://github.com/taipan-scanner/Taipan&quot; target=&quot;_blank&quot;&gt;https://github.com/taipan-scanner/Taipan&lt;/a&gt; web 界面，基于 F#与 C#的安全扫描器
&lt;a href=&quot;https://github.com/zhangzhenfeng/AnyScan&quot; target=&quot;_blank&quot;&gt;https://github.com/zhangzhenfeng/AnyScan&lt;/a&gt; web 界面，python 漏洞扫描器
&lt;a href=&quot;https://github.com/Canbing007/wukong-agent&quot; target=&quot;_blank&quot;&gt;https://github.com/Canbing007/wukong-agent&lt;/a&gt; web 界面，python 漏洞扫描器
&lt;a href=&quot;https://github.com/dermotblair/webvulscan&quot; target=&quot;_blank&quot;&gt;https://github.com/dermotblair/webvulscan&lt;/a&gt; web 界面，php，漏洞扫描器，支持输出 pdf 报告
&lt;a href=&quot;https://github.com/jeffzh3ng/InsectsAwake&quot; target=&quot;_blank&quot;&gt;https://github.com/jeffzh3ng/InsectsAwake&lt;/a&gt; web 界面，基于 Flask 应用框架的漏洞扫描系统，同时集成了渗透测试常用的端口扫描、子域名爆破等功能，后端漏洞扫描采用 Pocsuite
&lt;a href=&quot;https://github.com/0xInfection/TIDoS-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/0xInfection/TIDoS-Framework&lt;/a&gt; py，linux，网站扫描器
&lt;a href=&quot;https://github.com/secdec/adapt&quot; target=&quot;_blank&quot;&gt;https://github.com/secdec/adapt&lt;/a&gt; py,linux，网站扫描器
&lt;a href=&quot;https://github.com/sullo/nikto&quot; target=&quot;_blank&quot;&gt;https://github.com/sullo/nikto&lt;/a&gt; perl，linux，kali 内置的网站扫描器
&lt;a href=&quot;https://github.com/Ekultek/Zeus-Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/Ekultek/Zeus-Scanner&lt;/a&gt; web 扫描器，联动 Geckodriver，nmap 和 sqlmap
&lt;a href=&quot;https://github.com/blackye/lalascan&quot; target=&quot;_blank&quot;&gt;https://github.com/blackye/lalascan&lt;/a&gt; 集合 owasp top10 漏洞扫描和边界资产发现能力的分布式 web 漏洞扫描框架
&lt;a href=&quot;https://github.com/blackye/BkScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/blackye/BkScanner&lt;/a&gt; BkScanner 分布式、插件化 web 漏洞扫描器
&lt;a href=&quot;https://github.com/tlkh/prowler&quot; target=&quot;_blank&quot;&gt;https://github.com/tlkh/prowler&lt;/a&gt; 一款基于 Raspberry Pi Cluster 的网络漏洞扫描工具
&lt;a href=&quot;https://github.com/netxfly/passive_scan&quot; target=&quot;_blank&quot;&gt;https://github.com/netxfly/passive_scan&lt;/a&gt; 基于 http 代理的 web 漏洞扫描器
&lt;a href=&quot;https://github.com/1N3/Sn1per&quot; target=&quot;_blank&quot;&gt;https://github.com/1N3/Sn1per&lt;/a&gt; php，自动化中间件扫描以及设备指纹识别
&lt;a href=&quot;https://github.com/Tuhinshubhra/RED_HAWK&quot; target=&quot;_blank&quot;&gt;https://github.com/Tuhinshubhra/RED_HAWK&lt;/a&gt; php，集成信息收集、漏洞扫描、指纹识别等的扫描工具
&lt;a href=&quot;https://github.com/m4ll0k/Spaghetti&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/Spaghetti&lt;/a&gt; web 应用扫描器，支持指纹识别、文件目录爆破、SQL/XSS/RFI 等漏洞扫描，也可直接用于 struts、ShellShock 等漏洞扫描
&lt;a href=&quot;https://github.com/v3n0m-Scanner/V3n0M-Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/v3n0m-Scanner/V3n0M-Scanner&lt;/a&gt; 支持检测 SQLi/XSS/LFI/RFI 等漏洞的扫描器
&lt;a href=&quot;https://github.com/Yukinoshita47/Yuki-Chan-The-Auto-Pentest&quot; target=&quot;_blank&quot;&gt;https://github.com/Yukinoshita47/Yuki-Chan-The-Auto-Pentest&lt;/a&gt; 集成子域名枚举、nmap、waf 指纹识别等模块的 web 应用扫描器
&lt;a href=&quot;https://github.com/RASSec/pentestEr_Fully-automatic-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/RASSec/pentestEr_Fully-automatic-scanner&lt;/a&gt; 定向自动测试工具
&lt;a href=&quot;https://github.com/Fireflyi/lcyscan&quot; target=&quot;_blank&quot;&gt;https://github.com/Fireflyi/lcyscan&lt;/a&gt; py，插件化漏洞扫描器，支持生成报表
&lt;a href=&quot;https://github.com/Arachni/arachni&quot; target=&quot;_blank&quot;&gt;https://github.com/Arachni/arachni&lt;/a&gt; Web 应用漏洞扫描框架，支持 REST、RPC 等 api 调用
&lt;a href=&quot;https://github.com/swisskyrepo/DamnWebScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/swisskyrepo/DamnWebScanner&lt;/a&gt; 基于 chrome/opera 插件的被动式漏洞扫描
&lt;a href=&quot;https://github.com/0xsauby/yasuo&quot; target=&quot;_blank&quot;&gt;https://github.com/0xsauby/yasuo&lt;/a&gt; ruby,扫描主机第三方 web 应用服务漏洞
&lt;a href=&quot;https://github.com/yangbh/Hammer&quot; target=&quot;_blank&quot;&gt;https://github.com/yangbh/Hammer&lt;/a&gt; Web 应用漏洞扫描
&lt;a href=&quot;https://github.com/viraintel/OWASP-Nettacker&quot; target=&quot;_blank&quot;&gt;https://github.com/viraintel/OWASP-Nettacker&lt;/a&gt; 自动化渗透测试框架
&lt;a href=&quot;https://github.com/flipkart-incubator/watchdog&quot; target=&quot;_blank&quot;&gt;https://github.com/flipkart-incubator/watchdog&lt;/a&gt; 全面的 web 扫描器与漏洞利用工具
&lt;a href=&quot;https://github.com/Fplyth0ner-Combie/Bug-Project-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/Fplyth0ner-Combie/Bug-Project-Framework&lt;/a&gt; 易语言，模仿 msf 的漏洞利用框架，自带 exp 编辑器
&lt;a href=&quot;https://github.com/PowerScript/KatanaFramework&quot; target=&quot;_blank&quot;&gt;https://github.com/PowerScript/KatanaFramework&lt;/a&gt; py，模仿 msf 的漏洞利用框架，还有些 ssh、压缩包破解工具
&lt;a href=&quot;https://github.com/m4ll0k/Galileo&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/Galileo&lt;/a&gt; py2，网站扫描器
&lt;a href=&quot;https://github.com/samhaxr/hackbox&quot; target=&quot;_blank&quot;&gt;https://github.com/samhaxr/hackbox&lt;/a&gt; py2，simple，网站扫描器
&lt;a href=&quot;https://github.com/secrary/EllaScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/secrary/EllaScanner&lt;/a&gt; py3，simple，被动式漏洞扫描，支持历史 cve 编号漏洞识别
&lt;a href=&quot;https://github.com/m4ll0k/WAScan&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/WAScan&lt;/a&gt; py，simple，扫描页面/链接/脚本/Form, 测试 Payload 等
&lt;a href=&quot;https://github.com/jiangsir404/S7scan&quot; target=&quot;_blank&quot;&gt;https://github.com/jiangsir404/S7scan&lt;/a&gt; py,已用 1，七种综合检测
&lt;a href=&quot;https://github.com/hatRiot/clusterd&quot; target=&quot;_blank&quot;&gt;https://github.com/hatRiot/clusterd&lt;/a&gt; py，simple，web 漏洞利用
&lt;a href=&quot;https://github.com/M4cs/BabySploit&quot; target=&quot;_blank&quot;&gt;https://github.com/M4cs/BabySploit&lt;/a&gt; py,simple,模仿 msf
&lt;a href=&quot;https://github.com/iceyhexman/onlinetools&quot; target=&quot;_blank&quot;&gt;https://github.com/iceyhexman/onlinetools&lt;/a&gt; simple，web 界面，在线 cms 指纹识别|旁站|c 段|信息泄露|工控|系统|物联网安全|cms 漏洞扫描|端口扫描|等
&lt;a href=&quot;https://github.com/tulpar/tulpar&quot; target=&quot;_blank&quot;&gt;https://github.com/tulpar/tulpar&lt;/a&gt; simple,支持多种 web 漏洞扫描
&lt;a href=&quot;https://github.com/UltimateHackers/Striker&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/Striker&lt;/a&gt; simple，信息搜集、cms 利用与漏扫，侦察绕过 Cloudflare
&lt;a href=&quot;https://github.com/0x4D31/salt-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/0x4D31/salt-scanner&lt;/a&gt; 基于 Salt Open 以及 Vulners Linux Audit API 的 linux 漏洞扫描器，支持与 JIRA、slack 平台结合使用
&lt;a href=&quot;https://github.com/opensec-cn/kunpeng&quot; target=&quot;_blank&quot;&gt;https://github.com/opensec-cn/kunpeng&lt;/a&gt; go，POC 检测框架，以动态链接库的形式提供各种语言调用&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;运维安全服务与资产管理&lt;a href=&quot;#运维安全服务与资产管理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/chaitin/cloudwalker&quot; target=&quot;_blank&quot;&gt;https://github.com/chaitin/cloudwalker&lt;/a&gt; CloudWalker（牧云）服务器安全管理平台，逐步覆盖服务器资产管理、威胁扫描、Webshell 查杀、基线检测等功能。
&lt;a href=&quot;https://github.com/mitre/caldera&quot; target=&quot;_blank&quot;&gt;https://github.com/mitre/caldera&lt;/a&gt; mitre 公司模拟攻击测试系统，主要是在 win 下
&lt;a href=&quot;https://github.com/guardicore/monkey&quot; target=&quot;_blank&quot;&gt;https://github.com/guardicore/monkey&lt;/a&gt; 评估网络安全状况，分为扫描器与 C2C 服务器，利用默认口令与 exp 对 ssh、smb 等多种协议方式进行攻击检测
&lt;a href=&quot;https://github.com/grayddq/PublicSecScan&quot; target=&quot;_blank&quot;&gt;https://github.com/grayddq/PublicSecScan&lt;/a&gt; 调用 awvs 对大量 WEB 资产进行分布式 WEB 安全扫描，发现 web 环境下常规的一些安全漏洞
&lt;a href=&quot;https://github.com/jeffzh3ng/Fuxi-Scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/jeffzh3ng/Fuxi-Scanner&lt;/a&gt; 资产管理，漏洞检测集成 awvs、创宇 Pocsuite、nmap、hydra
&lt;a href=&quot;https://github.com/infobyte/faraday&quot; target=&quot;_blank&quot;&gt;https://github.com/infobyte/faraday&lt;/a&gt; 协作渗透测试和漏洞管理平台，集成多种
&lt;a href=&quot;https://github.com/DefectDojo/django-DefectDojo&quot; target=&quot;_blank&quot;&gt;https://github.com/DefectDojo/django-DefectDojo&lt;/a&gt; 基于 django 的漏洞资产管理平台
&lt;a href=&quot;https://github.com/creditease-sec/insight&quot; target=&quot;_blank&quot;&gt;https://github.com/creditease-sec/insight&lt;/a&gt; web 界面，宜信安全部开发，集成应用系统资产管理、漏洞全生命周期管理、安全知识库管理三位一体的管理平台
&lt;a href=&quot;https://github.com/RASSec/A_Scan_Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/RASSec/A_Scan_Framework&lt;/a&gt; 漏洞管理、资产管理、任务扫描系统
&lt;a href=&quot;https://github.com/cea-sec/ivre&quot; target=&quot;_blank&quot;&gt;https://github.com/cea-sec/ivre&lt;/a&gt; 网络资产指纹发现，搭建属于自己的 shodan 与 zoomeye
&lt;a href=&quot;https://github.com/ysrc/xunfeng&quot; target=&quot;_blank&quot;&gt;https://github.com/ysrc/xunfeng&lt;/a&gt; web 界面，同程安全开发的网络资产识别引擎，漏洞检测引擎
&lt;a href=&quot;https://github.com/superhuahua/xunfengES&quot; target=&quot;_blank&quot;&gt;https://github.com/superhuahua/xunfengES&lt;/a&gt; web 界面，base 巡风开发，一个人的安全
&lt;a href=&quot;https://github.com/zhaoweiho/SecurityManageFramwork&quot; target=&quot;_blank&quot;&gt;https://github.com/zhaoweiho/SecurityManageFramwork&lt;/a&gt; py3，django。企业内网安全管理平台，包含资产管理，漏洞管理，账号管理，知识库管、安全扫描自动化功能模块
&lt;a href=&quot;https://github.com/grayddq/PublicMonitors&quot; target=&quot;_blank&quot;&gt;https://github.com/grayddq/PublicMonitors&lt;/a&gt; 对公网 IP 列表进行端口服务扫描，发现周期内的端口服务变化情况和弱口令安全风险。一个人的安全部
&lt;a href=&quot;https://github.com/grayddq/PubilcAssetInfo&quot; target=&quot;_blank&quot;&gt;https://github.com/grayddq/PubilcAssetInfo&lt;/a&gt; 主要目标是以甲方安全人员的视角，尽可能收集发现企业的域名和服务器公网 IP 资产。如百度云、阿里云、腾讯云等。一个人的安全部
&lt;a href=&quot;https://github.com/maya6/SiteScan&quot; target=&quot;_blank&quot;&gt;https://github.com/maya6/SiteScan&lt;/a&gt; web 界面，py3 celery。资产收集
&lt;a href=&quot;https://github.com/ywolf/F-NAScan&quot; target=&quot;_blank&quot;&gt;https://github.com/ywolf/F-NAScan&lt;/a&gt; py2.6，网络资产、端口服务搜集整理，生成报表显示。快速
&lt;a href=&quot;https://github.com/flipkart-incubator/RTA&quot; target=&quot;_blank&quot;&gt;https://github.com/flipkart-incubator/RTA&lt;/a&gt; 扫描公司内部所有在线设备, 提供整体安全视图, 标示所有安全异常
&lt;a href=&quot;https://github.com/0xbug/Biu-framework&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbug/Biu-framework&lt;/a&gt; 企业内网基础服务安全扫描框架&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;上传漏洞利用&lt;a href=&quot;#上传漏洞利用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/UltimateHackers/Arjun&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/Arjun&lt;/a&gt; 扫描网页, 使用正则表达式爆破查找隐藏的 GET/POST 参数
&lt;a href=&quot;https://github.com/3xp10it/xupload&quot; target=&quot;_blank&quot;&gt;https://github.com/3xp10it/xupload&lt;/a&gt; 用于自动测试上传功能是否可上传 webshell 的工具
&lt;a href=&quot;https://github.com/gunnerstahl/JQShell&quot; target=&quot;_blank&quot;&gt;https://github.com/gunnerstahl/JQShell&lt;/a&gt; py3，CVE-2018-9206 jQuery File Upload 利用工具
&lt;a href=&quot;https://github.com/destine21/ZIPFileRaider&quot; target=&quot;_blank&quot;&gt;https://github.com/destine21/ZIPFileRaider&lt;/a&gt; burp 插件，测试 zip 文件上传漏洞
&lt;a href=&quot;https://github.com/jpiechowka/zip-shotgun&quot; target=&quot;_blank&quot;&gt;https://github.com/jpiechowka/zip-shotgun&lt;/a&gt; py，测试 zip 文件上传漏洞&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;端口发现服务指纹识别&lt;a href=&quot;#端口发现服务指纹识别&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/nmap/nmap&quot; target=&quot;_blank&quot;&gt;https://github.com/nmap/nmap&lt;/a&gt; LUA,Nmap 端口扫描器，具有有强大的脚本引擎框架
&lt;a href=&quot;https://github.com/robertdavidgraham/masscan&quot; target=&quot;_blank&quot;&gt;https://github.com/robertdavidgraham/masscan&lt;/a&gt; C,无状态扫描，可以调用 nmap 进行指纹识别
&lt;a href=&quot;https://github.com/zmap/zmap&quot; target=&quot;_blank&quot;&gt;https://github.com/zmap/zmap&lt;/a&gt; C,无状态扫描，需要用 C 编写扩展模块
&lt;a href=&quot;https://github.com/zmap/zgrab&quot; target=&quot;_blank&quot;&gt;https://github.com/zmap/zgrab&lt;/a&gt; go，基于 zmap 扫描器进行指纹识别、调度管理，可绕过 CDN
&lt;a href=&quot;https://github.com/chichou/grab.js&quot; target=&quot;_blank&quot;&gt;https://github.com/chichou/grab.js&lt;/a&gt; 类似 zgrab 的快速 TCP 指纹抓取解析工具，支持更多协议
&lt;a href=&quot;https://github.com/johnnyxmas/scancannon&quot; target=&quot;_blank&quot;&gt;https://github.com/johnnyxmas/scancannon&lt;/a&gt; shell,联动 masscan 和 nmap
&lt;a href=&quot;https://github.com/OffensivePython/Nscan&quot; target=&quot;_blank&quot;&gt;https://github.com/OffensivePython/Nscan&lt;/a&gt; 基于 Masscan 和 Zmap 的网络扫描器
&lt;a href=&quot;https://github.com/ring04h/wyportmap&quot; target=&quot;_blank&quot;&gt;https://github.com/ring04h/wyportmap&lt;/a&gt; 调用 nmap 目标端口扫描+系统服务指纹识别
&lt;a href=&quot;https://github.com/angryip/ipscan&quot; target=&quot;_blank&quot;&gt;https://github.com/angryip/ipscan&lt;/a&gt; Angry IP Scanner，跨平台界面化端口扫描器
&lt;a href=&quot;https://github.com/EnableSecurity/wafw00f&quot; target=&quot;_blank&quot;&gt;https://github.com/EnableSecurity/wafw00f&lt;/a&gt; WAF 产品指纹识别
&lt;a href=&quot;https://github.com/rbsec/sslscan&quot; target=&quot;_blank&quot;&gt;https://github.com/rbsec/sslscan&lt;/a&gt; ssl 类型识别
&lt;a href=&quot;https://github.com/urbanadventurer/whatweb&quot; target=&quot;_blank&quot;&gt;https://github.com/urbanadventurer/whatweb&lt;/a&gt; web 指纹识别
&lt;a href=&quot;https://github.com/Rvn0xsy/FastWhatWebSearch&quot; target=&quot;_blank&quot;&gt;https://github.com/Rvn0xsy/FastWhatWebSearch&lt;/a&gt; whatweb 工具结果搜索平台
&lt;a href=&quot;https://github.com/tanjiti/FingerPrint&quot; target=&quot;_blank&quot;&gt;https://github.com/tanjiti/FingerPrint&lt;/a&gt; web 应用指纹识别
&lt;a href=&quot;https://github.com/nanshihui/Scan-T&quot; target=&quot;_blank&quot;&gt;https://github.com/nanshihui/Scan-T&lt;/a&gt; 网络爬虫式指纹识别
&lt;a href=&quot;https://github.com/ywolf/F-MiddlewareScan&quot; target=&quot;_blank&quot;&gt;https://github.com/ywolf/F-MiddlewareScan&lt;/a&gt; 中间件扫描服务识别
&lt;a href=&quot;https://github.com/lietdai/doom&quot; target=&quot;_blank&quot;&gt;https://github.com/lietdai/doom&lt;/a&gt; thorn 上实现的分布式任务分发的 ip 端口漏洞扫描器
&lt;a href=&quot;https://github.com/RASSec/RASscan&quot; target=&quot;_blank&quot;&gt;https://github.com/RASSec/RASscan&lt;/a&gt; 端口服务扫描
&lt;a href=&quot;https://github.com/m3liot/shcheck&quot; target=&quot;_blank&quot;&gt;https://github.com/m3liot/shcheck&lt;/a&gt; 用于检查 web 服务的 http header 的安全性
&lt;a href=&quot;https://github.com/mozilla/ssh_scan&quot; target=&quot;_blank&quot;&gt;https://github.com/mozilla/ssh_scan&lt;/a&gt; 服务器 ssh 配置信息扫描
&lt;a href=&quot;https://github.com/18F/domain-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/18F/domain-scan&lt;/a&gt; 针对域名及其子域名的资产数据检测／扫描，包括 http/https 检测等
&lt;a href=&quot;https://github.com/ggusoft/inforfinder&quot; target=&quot;_blank&quot;&gt;https://github.com/ggusoft/inforfinder&lt;/a&gt; 域名资产收集及指纹识别工具
&lt;a href=&quot;https://github.com/0xbug/Howl&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbug/Howl&lt;/a&gt; 网络设备 web 服务指纹扫描与检索
&lt;a href=&quot;https://github.com/mozilla/cipherscan&quot; target=&quot;_blank&quot;&gt;https://github.com/mozilla/cipherscan&lt;/a&gt; 目标主机服务 ssl 类型识别
&lt;a href=&quot;https://github.com/medbenali/CyberScan&quot; target=&quot;_blank&quot;&gt;https://github.com/medbenali/CyberScan&lt;/a&gt; 渗透测试辅助工具，支持分析数据包、解码、端口扫描、IP 地址分析等
&lt;a href=&quot;https://github.com/jekyc/wig&quot; target=&quot;_blank&quot;&gt;https://github.com/jekyc/wig&lt;/a&gt; web 应用信息搜集工具
&lt;a href=&quot;https://github.com/eldraco/domain_analyzer&quot; target=&quot;_blank&quot;&gt;https://github.com/eldraco/domain_analyzer&lt;/a&gt; 围绕 web 服务的域名进行信息收集和”域传送”等漏洞扫描，也支持针对背后的服务器端口扫描等
&lt;a href=&quot;https://github.com/cloudtracer/paskto&quot; target=&quot;_blank&quot;&gt;https://github.com/cloudtracer/paskto&lt;/a&gt; 基于 Nikto 扫描规则的被动式路径扫描以及信息爬虫
&lt;a href=&quot;https://github.com/zerokeeper/WebEye&quot; target=&quot;_blank&quot;&gt;https://github.com/zerokeeper/WebEye&lt;/a&gt; 快速识别 WEB 服务器类型、CMS 类型、WAF 类型、WHOIS 信息、以及语言框架
&lt;a href=&quot;https://github.com/n4xh4ck5/CMSsc4n&quot; target=&quot;_blank&quot;&gt;https://github.com/n4xh4ck5/CMSsc4n&lt;/a&gt; CMS 指纹识别
&lt;a href=&quot;https://github.com/HA71/WhatCMS&quot; target=&quot;_blank&quot;&gt;https://github.com/HA71/WhatCMS&lt;/a&gt; CMS 检测和漏洞利用脚本, 基于 Whatcms.org API
&lt;a href=&quot;https://github.com/boy-hack/gwhatweb&quot; target=&quot;_blank&quot;&gt;https://github.com/boy-hack/gwhatweb&lt;/a&gt; CMS 识别 python gevent 实现
&lt;a href=&quot;https://github.com/wpscanteam/wpscan&quot; target=&quot;_blank&quot;&gt;https://github.com/wpscanteam/wpscan&lt;/a&gt; 基本算是 word press 下最好用的工具了
&lt;a href=&quot;https://github.com/swisskyrepo/Wordpresscan&quot; target=&quot;_blank&quot;&gt;https://github.com/swisskyrepo/Wordpresscan&lt;/a&gt; 基于 WPScan 以及 WPSeku 的优化版 wordpress 扫描器
&lt;a href=&quot;https://github.com/m4ll0k/WPSeku&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/WPSeku&lt;/a&gt; 精简的 wordpress 扫描工具
&lt;a href=&quot;https://github.com/rastating/wordpress-exploit-framework&quot; target=&quot;_blank&quot;&gt;https://github.com/rastating/wordpress-exploit-framework&lt;/a&gt; wordpress 漏洞利用框架
&lt;a href=&quot;https://github.com/Jamalc0m/wphunter&quot; target=&quot;_blank&quot;&gt;https://github.com/Jamalc0m/wphunter&lt;/a&gt; php，wordpress 扫描器
&lt;a href=&quot;https://github.com/UltimateLabs/Zoom&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateLabs/Zoom&lt;/a&gt; wordpress 漏洞扫描器
&lt;a href=&quot;https://github.com/immunIT/drupwn&quot; target=&quot;_blank&quot;&gt;https://github.com/immunIT/drupwn&lt;/a&gt; Drupal 信息收集与漏洞利用工具
&lt;a href=&quot;https://github.com/CHYbeta/cmsPoc&quot; target=&quot;_blank&quot;&gt;https://github.com/CHYbeta/cmsPoc&lt;/a&gt; CMS 渗透测试框架
&lt;a href=&quot;https://github.com/chuhades/CMS-Exploit-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/chuhades/CMS-Exploit-Framework&lt;/a&gt; CMS 攻击框架
&lt;a href=&quot;https://github.com/Tuhinshubhra/CMSeeK&quot; target=&quot;_blank&quot;&gt;https://github.com/Tuhinshubhra/CMSeeK&lt;/a&gt; 20 多种 CMS 的基本检测，针对 wp 利用、可定制模块化爆破功能
&lt;a href=&quot;https://github.com/Dionach/CMSmap&quot; target=&quot;_blank&quot;&gt;https://github.com/Dionach/CMSmap&lt;/a&gt; 支持 WordPress，Joomla 和 Drupal 扫描
&lt;a href=&quot;https://github.com/Moham3dRiahi/XAttacker&quot; target=&quot;_blank&quot;&gt;https://github.com/Moham3dRiahi/XAttacker&lt;/a&gt; Web CMS Exploit 工具,包含针对主流 CMS 的 66 个不同的 Exploits
&lt;a href=&quot;https://github.com/code-scan/dzscan&quot; target=&quot;_blank&quot;&gt;https://github.com/code-scan/dzscan&lt;/a&gt; 首款集成化的 Discuz 扫描工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;数据库扫描与爆破&lt;a href=&quot;#数据库扫描与爆破&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ron190/jsql-injection&quot; target=&quot;_blank&quot;&gt;https://github.com/ron190/jsql-injection&lt;/a&gt; Java 编写的 SQL 注入工具
&lt;a href=&quot;https://github.com/shack2/SuperSQLInjectionV1&quot; target=&quot;_blank&quot;&gt;https://github.com/shack2/SuperSQLInjectionV1&lt;/a&gt; 安恒航牛的一款界面化注入工具
&lt;a href=&quot;https://github.com/sqlmapproject/sqlmap&quot; target=&quot;_blank&quot;&gt;https://github.com/sqlmapproject/sqlmap&lt;/a&gt; sql 注入 sqlmap
&lt;a href=&quot;https://github.com/stamparm/DSSS&quot; target=&quot;_blank&quot;&gt;https://github.com/stamparm/DSSS&lt;/a&gt; 已用 1,99 行代码实现的 sql 注入漏洞扫描器
&lt;a href=&quot;https://github.com/Hadesy2k/sqliv&quot; target=&quot;_blank&quot;&gt;https://github.com/Hadesy2k/sqliv&lt;/a&gt; 已用 1,基于搜索引擎的批量 SQL 注入漏洞扫描器
&lt;a href=&quot;https://github.com/quentinhardy/odat&quot; target=&quot;_blank&quot;&gt;https://github.com/quentinhardy/odat&lt;/a&gt; 一款专门用于 Oracle 渗透的很全面的工具
&lt;a href=&quot;https://github.com/m8r0wn/enumdb&quot; target=&quot;_blank&quot;&gt;https://github.com/m8r0wn/enumdb&lt;/a&gt; MySQL 和 MSSQL 利用工具后期爆破、搜索数据库并提取敏感信息。
&lt;a href=&quot;https://github.com/LoRexxar/Feigong&quot; target=&quot;_blank&quot;&gt;https://github.com/LoRexxar/Feigong&lt;/a&gt; 针对各种情况自由变化的 MySQL 注入脚本
&lt;a href=&quot;https://github.com/youngyangyang04/NoSQLAttack&quot; target=&quot;_blank&quot;&gt;https://github.com/youngyangyang04/NoSQLAttack&lt;/a&gt; 一款针对 mongoDB 的攻击工具
&lt;a href=&quot;https://github.com/Neohapsis/bbqsql&quot; target=&quot;_blank&quot;&gt;https://github.com/Neohapsis/bbqsql&lt;/a&gt; SQL 盲注利用框架
&lt;a href=&quot;https://github.com/NetSPI/PowerUpSQL&quot; target=&quot;_blank&quot;&gt;https://github.com/NetSPI/PowerUpSQL&lt;/a&gt; 基于 Powershell 的 sqlserver 测试框架
&lt;a href=&quot;http://www.4hou.com/system/14950.html&quot; target=&quot;_blank&quot;&gt;http://www.4hou.com/system/14950.html&lt;/a&gt; 利用 PowerUpSQL，渗透测试技巧：绕过 SQL Server 登录触发器限制
&lt;a href=&quot;https://github.com/WhitewidowScanner/whitewidow&quot; target=&quot;_blank&quot;&gt;https://github.com/WhitewidowScanner/whitewidow&lt;/a&gt; 一款数据库扫描器
&lt;a href=&quot;https://github.com/stampery/mongoaudit&quot; target=&quot;_blank&quot;&gt;https://github.com/stampery/mongoaudit&lt;/a&gt; MongoDB 审计及渗透工具
&lt;a href=&quot;https://github.com/torque59/Nosql-Exploitation-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/torque59/Nosql-Exploitation-Framework&lt;/a&gt; NoSQL 扫描/爆破工具
&lt;a href=&quot;https://github.com/missDronio/blindy&quot; target=&quot;_blank&quot;&gt;https://github.com/missDronio/blindy&lt;/a&gt; MySQL 盲注爆破工具
&lt;a href=&quot;https://github.com/JohnTroony/Blisqy&quot; target=&quot;_blank&quot;&gt;https://github.com/JohnTroony/Blisqy&lt;/a&gt; 用于 http header 中的时间盲注爆破工具，仅针对 MySQL/MariaDB
&lt;a href=&quot;https://github.com/se55i0n/DBScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/se55i0n/DBScanner&lt;/a&gt; 自动扫描内网中常见 sql、no-sql 数据库脚本，包含未授权访问及常规弱口令检测
&lt;a href=&quot;https://github.com/Turr0n/firebase&quot; target=&quot;_blank&quot;&gt;https://github.com/Turr0n/firebase&lt;/a&gt; 对没有正确配置的 firebase 数据库进行利用&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;XSS 跨站脚本检测利用&lt;a href=&quot;#xss-跨站脚本检测利用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/UltimateHackers/AwesomeXSS&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/AwesomeXSS&lt;/a&gt; XSS Awesome 系列
&lt;a href=&quot;http://www.xss-payloads.com&quot; target=&quot;_blank&quot;&gt;http://www.xss-payloads.com&lt;/a&gt; 很全面的 xss 工具包与资料
&lt;a href=&quot;https://github.com/ismailtasdelen/xss-payload-list&quot; target=&quot;_blank&quot;&gt;https://github.com/ismailtasdelen/xss-payload-list&lt;/a&gt; XSS 漏洞 Payload 列表
&lt;a href=&quot;https://github.com/beefproject/beef&quot; target=&quot;_blank&quot;&gt;https://github.com/beefproject/beef&lt;/a&gt; 经典的 xss 利用框架
&lt;a href=&quot;https://github.com/samdenty99/injectify&quot; target=&quot;_blank&quot;&gt;https://github.com/samdenty99/injectify&lt;/a&gt; 类似 beef 的 xss 利用框架
&lt;a href=&quot;https://github.com/firesunCN/BlueLotus_XSSReceiver&quot; target=&quot;_blank&quot;&gt;https://github.com/firesunCN/BlueLotus_XSSReceiver&lt;/a&gt; 蓝莲花战队为 CTF 打造的 xss 利用框架
&lt;a href=&quot;https://github.com/NytroRST/XSSFuzzer&quot; target=&quot;_blank&quot;&gt;https://github.com/NytroRST/XSSFuzzer&lt;/a&gt; 根据特定标签生成 xss payload
&lt;a href=&quot;https://github.com/evilcos/xssor2&quot; target=&quot;_blank&quot;&gt;https://github.com/evilcos/xssor2&lt;/a&gt; 余弦写的 xss 利用辅助工具
&lt;a href=&quot;https://github.com/UltimateHackers/XSStrike&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/XSStrike&lt;/a&gt; 可识别并绕过 WAF 的 XSS 扫描工具
&lt;a href=&quot;https://github.com/raz-varren/xsshell&quot; target=&quot;_blank&quot;&gt;https://github.com/raz-varren/xsshell&lt;/a&gt; go,利用 xss 漏洞返回一个 js 交互 shell
&lt;a href=&quot;https://github.com/UltimateHackers/JShell&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/JShell&lt;/a&gt; 利用 xss 漏洞返回一个 js 交互 shell
&lt;a href=&quot;https://github.com/shawarkhanethicalhacker/BruteXSS&quot; target=&quot;_blank&quot;&gt;https://github.com/shawarkhanethicalhacker/BruteXSS&lt;/a&gt; 一款 XSS 扫描器,可暴力注入参数
&lt;a href=&quot;https://github.com/1N3/XSSTracer&quot; target=&quot;_blank&quot;&gt;https://github.com/1N3/XSSTracer&lt;/a&gt; 小型 XSS 扫描器,也可检测 CRLF、XSS、点击劫持的
&lt;a href=&quot;https://github.com/0x584A/fuzzXssPHP&quot; target=&quot;_blank&quot;&gt;https://github.com/0x584A/fuzzXssPHP&lt;/a&gt; PHP 版本的反射型 xss 扫描
&lt;a href=&quot;https://github.com/chuhades/xss_scan&quot; target=&quot;_blank&quot;&gt;https://github.com/chuhades/xss_scan&lt;/a&gt; 批量扫描 XSS 的 python 脚本
&lt;a href=&quot;https://github.com/BlackHole1/autoFindXssAndCsrf&quot; target=&quot;_blank&quot;&gt;https://github.com/BlackHole1/autoFindXssAndCsrf&lt;/a&gt; 自动化检测页面是否存在 XSS 和 CSRF 漏洞的浏览器插件
&lt;a href=&quot;https://github.com/shogunlab/shuriken&quot; target=&quot;_blank&quot;&gt;https://github.com/shogunlab/shuriken&lt;/a&gt; 使用命令行进行 XSS 批量检测
&lt;a href=&quot;https://github.com/stamparm/DSXS&quot; target=&quot;_blank&quot;&gt;https://github.com/stamparm/DSXS&lt;/a&gt; 支持 GET、POST 方式的高效 XSS 扫描器
&lt;a href=&quot;https://github.com/bsmali4/xssfork&quot; target=&quot;_blank&quot;&gt;https://github.com/bsmali4/xssfork&lt;/a&gt; kali 下无法使用的话，请下载正确的 PhantomJS 到目录 thirdparty/phantomjs/Linux
&lt;a href=&quot;https://github.com/riusksk/FlashScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/riusksk/FlashScanner&lt;/a&gt; flash xss 扫描
&lt;a href=&quot;https://github.com/Damian89/xssfinder&quot; target=&quot;_blank&quot;&gt;https://github.com/Damian89/xssfinder&lt;/a&gt; 针对检测网站中的反射 XSS
&lt;a href=&quot;https://github.com/BlackHole1/WebRtcXSS&quot; target=&quot;_blank&quot;&gt;https://github.com/BlackHole1/WebRtcXSS&lt;/a&gt; 自动化利用 XSS 入侵内网&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;弱口令扫描爆破&lt;a href=&quot;#弱口令扫描爆破&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/vanhauser-thc/thc-hydra&quot; target=&quot;_blank&quot;&gt;https://github.com/vanhauser-thc/thc-hydra&lt;/a&gt; 支持多种协议方式的破解与爆破，v8 以后就不提供 windows 版本了
&lt;a href=&quot;https://github.com/nmap/ncrack&quot; target=&quot;_blank&quot;&gt;https://github.com/nmap/ncrack&lt;/a&gt; c，支持多种协议的破解与爆破
&lt;a href=&quot;https://github.com/0pn1i9ht/F-Scrack&quot; target=&quot;_blank&quot;&gt;https://github.com/0pn1i9ht/F-Scrack&lt;/a&gt; ysrc 对各类服务用户名密码爆破的脚本
&lt;a href=&quot;https://github.com/TunisianEagles/SocialBox&quot; target=&quot;_blank&quot;&gt;https://github.com/TunisianEagles/SocialBox&lt;/a&gt; 针对 fb、gmail、ins、twitter 的用户名密码爆破的脚本
&lt;a href=&quot;https://github.com/lanjelot/patator&quot; target=&quot;_blank&quot;&gt;https://github.com/lanjelot/patator&lt;/a&gt; 支持多种协议的爆破，采用模块化设计，使用灵活
&lt;a href=&quot;https://github.com/m4ll0k/SMBrute&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/SMBrute&lt;/a&gt; 利用 smb 服务进行用户名密码爆破
&lt;a href=&quot;https://github.com/netxfly/crack_ssh&quot; target=&quot;_blank&quot;&gt;https://github.com/netxfly/crack_ssh&lt;/a&gt; Go 写的协程版的 ssh\redis\mongodb 弱口令破解
&lt;a href=&quot;https://github.com/UltimateHackers/Blazy&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/Blazy&lt;/a&gt; 支持测试 CSRF, Clickjacking, Cloudflare and WAF 的弱口令探测器
&lt;a href=&quot;https://github.com/Moham3dRiahi/XBruteForcer&quot; target=&quot;_blank&quot;&gt;https://github.com/Moham3dRiahi/XBruteForcer&lt;/a&gt; WordPress、Joomla、DruPal、OpenCart、Magento 等 CMS 用户密码爆破
&lt;a href=&quot;https://github.com/shengqi158/weak_password_detect&quot; target=&quot;_blank&quot;&gt;https://github.com/shengqi158/weak_password_detect&lt;/a&gt; Linux 下利用 nmap 多线程探测 ssh 弱口令
&lt;a href=&quot;https://github.com/ztgrace/changeme&quot; target=&quot;_blank&quot;&gt;https://github.com/ztgrace/changeme&lt;/a&gt; 弱口令扫描器，不仅支持普通登录页，也支持 ssh、mongodb 等组件
&lt;a href=&quot;https://github.com/lijiejie/htpwdScan&quot; target=&quot;_blank&quot;&gt;https://github.com/lijiejie/htpwdScan&lt;/a&gt; simple，http 暴力破解、撞库攻击脚本
&lt;a href=&quot;https://github.com/scu-igroup/ssh-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/scu-igroup/ssh-scanner&lt;/a&gt; 联动 nmap、hydra 对 ssh 批量爆破&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;密码破解还原&lt;a href=&quot;#密码破解还原&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://securityxploded.com/download.php&quot; target=&quot;_blank&quot;&gt;https://securityxploded.com/download.php&lt;/a&gt; 各种密码方向安全小工具
&lt;a href=&quot;https://github.com/bdutro/ibm_pw_clear&quot; target=&quot;_blank&quot;&gt;https://github.com/bdutro/ibm_pw_clear&lt;/a&gt; IBM x3550/x3560 M3 bios 密码清除重置工具
&lt;a href=&quot;https://github.com/thehappydinoa/iOSRestrictionBruteForce&quot; target=&quot;_blank&quot;&gt;https://github.com/thehappydinoa/iOSRestrictionBruteForce&lt;/a&gt; py,实现的 ios 访问限制密码破解工具
&lt;a href=&quot;https://github.com/hashcat/hashcat&quot; target=&quot;_blank&quot;&gt;https://github.com/hashcat/hashcat&lt;/a&gt; C,哈希破解
&lt;a href=&quot;https://github.com/fireeye/gocrack&quot; target=&quot;_blank&quot;&gt;https://github.com/fireeye/gocrack&lt;/a&gt; GO,基于 hashcat 3.6.0+的分布式密码破解工具
&lt;a href=&quot;https://github.com/s3inlc/hashtopolis&quot; target=&quot;_blank&quot;&gt;https://github.com/s3inlc/hashtopolis&lt;/a&gt; 基于 php 的 hashcat 的分布式破解工具，支持 C#与 python 客户端
&lt;a href=&quot;https://github.com/e-ago/bitcracker&quot; target=&quot;_blank&quot;&gt;https://github.com/e-ago/bitcracker&lt;/a&gt; 首款开源的 BitLocker 密码破解工具
&lt;a href=&quot;https://www.ru.nl/publish/pages/909282/draft-paper.pdf&quot; target=&quot;_blank&quot;&gt;https://www.ru.nl/publish/pages/909282/draft-paper.pdf&lt;/a&gt; 破解 SSD 下使用 BitLocker 的论文
&lt;a href=&quot;https://github.com/magnumripper/JohnTheRipper&quot; target=&quot;_blank&quot;&gt;https://github.com/magnumripper/JohnTheRipper&lt;/a&gt; 已知密文的情况下尝试破解出明文的破解密码软件
&lt;a href=&quot;https://github.com/shinnok/johnny&quot; target=&quot;_blank&quot;&gt;https://github.com/shinnok/johnny&lt;/a&gt; JohnTheRipper 密码破解的 GUI 界面，理论兼容所有功能，有 windows 界面
&lt;a href=&quot;https://github.com/jmk-foofus/medusa&quot; target=&quot;_blank&quot;&gt;https://github.com/jmk-foofus/medusa&lt;/a&gt; 支持的协议会比 hydra 少一点，但是某些速度会快
&lt;a href=&quot;https://github.com/MrSqar-Ye/wpCrack&quot; target=&quot;_blank&quot;&gt;https://github.com/MrSqar-Ye/wpCrack&lt;/a&gt; wordpress hash 破解
&lt;a href=&quot;https://github.com/testsecer/Md5Decrypt&quot; target=&quot;_blank&quot;&gt;https://github.com/testsecer/Md5Decrypt&lt;/a&gt; C#,基于网上 web API 的 MD5 搜索工具
&lt;a href=&quot;https://github.com/s0md3v/Hash-Buster&quot; target=&quot;_blank&quot;&gt;https://github.com/s0md3v/Hash-Buster&lt;/a&gt; 能调用多个 API 进行 hash 破解查询的智能工具
&lt;a href=&quot;https://www.52pojie.cn/thread-275945-1-1.html&quot; target=&quot;_blank&quot;&gt;https://www.52pojie.cn/thread-275945-1-1.html&lt;/a&gt; ARCHPR Pro4.54 绿色中文破解版。压缩包密码破解，利用“已知明文攻击”破解加密的压缩文件&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;网站管理与 Webshell&lt;a href=&quot;#网站管理与-webshell&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.bt.cn&quot; target=&quot;_blank&quot;&gt;http://www.bt.cn&lt;/a&gt; 宝塔网站管理系统
&lt;a href=&quot;https://github.com/AntSwordProject/antSword&quot; target=&quot;_blank&quot;&gt;https://github.com/AntSwordProject/antSword&lt;/a&gt; js,中国蚁剑,插件式开发
&lt;a href=&quot;https://github.com/Chora10/Cknife&quot; target=&quot;_blank&quot;&gt;https://github.com/Chora10/Cknife&lt;/a&gt; java，中国菜刀
&lt;a href=&quot;https://github.com/naozibuhao/SecQuanCknife&quot; target=&quot;_blank&quot;&gt;https://github.com/naozibuhao/SecQuanCknife&lt;/a&gt; java，中国菜刀升级版，增加爆破功能
&lt;a href=&quot;https://github.com/euphrat1ca/hatchet&quot; target=&quot;_blank&quot;&gt;https://github.com/euphrat1ca/hatchet&lt;/a&gt; 中国大砍刀
&lt;a href=&quot;https://github.com/tengzhangchao/PyCmd&quot; target=&quot;_blank&quot;&gt;https://github.com/tengzhangchao/PyCmd&lt;/a&gt; py，一句话木马客户端程序，目前支持 php、jsp，CS 端通信加密
&lt;a href=&quot;https://github.com/epinna/weevely3&quot; target=&quot;_blank&quot;&gt;https://github.com/epinna/weevely3&lt;/a&gt; py,利用特定的一句话脚本对网站进行管理
&lt;a href=&quot;https://github.com/nil0x42/phpsploit&quot; target=&quot;_blank&quot;&gt;https://github.com/nil0x42/phpsploit&lt;/a&gt; py3,利用特定的一句话脚本对网站进行管理
&lt;a href=&quot;https://github.com/wonderqs/Blade&quot; target=&quot;_blank&quot;&gt;https://github.com/wonderqs/Blade&lt;/a&gt; py，利用特定的一句话脚本对网站进行管理
&lt;a href=&quot;https://github.com/anestisb/WeBaCoo&quot; target=&quot;_blank&quot;&gt;https://github.com/anestisb/WeBaCoo&lt;/a&gt; perl，利用特定的一句话脚本对网站进行管理
&lt;a href=&quot;https://github.com/keepwn/Altman&quot; target=&quot;_blank&quot;&gt;https://github.com/keepwn/Altman&lt;/a&gt; .net 配合 mono，实现的跨平台菜刀
&lt;a href=&quot;https://github.com/k4mpr3t/b4tm4n&quot; target=&quot;_blank&quot;&gt;https://github.com/k4mpr3t/b4tm4n&lt;/a&gt; 集成伪造邮件 ddos，bat.php 的 webshell，初始 k4mpr3t
&lt;a href=&quot;https://github.com/dotcppfile/DAws&quot; target=&quot;_blank&quot;&gt;https://github.com/dotcppfile/DAws&lt;/a&gt; 过防火墙 webshell，post pass=DAws
&lt;a href=&quot;https://github.com/b374k/b374k&quot; target=&quot;_blank&quot;&gt;https://github.com/b374k/b374k&lt;/a&gt; php 网站管理，默认密码 b374k
&lt;a href=&quot;https://github.com/wso-shell/WSO&quot; target=&quot;_blank&quot;&gt;https://github.com/wso-shell/WSO&lt;/a&gt; webshell 的文件管理，可以伪装为 404 界面
&lt;a href=&quot;https://github.com/UltimateHackers/nano&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/nano&lt;/a&gt; php 小马，附带 py 编写的生成器
&lt;a href=&quot;https://github.com/rebeyond/memShell&quot; target=&quot;_blank&quot;&gt;https://github.com/rebeyond/memShell&lt;/a&gt; 一款可以写入 java web server 内存中的 webshell
&lt;a href=&quot;https://github.com/DXkite/freebuf-stream-shell&quot; target=&quot;_blank&quot;&gt;https://github.com/DXkite/freebuf-stream-shell&lt;/a&gt; PHP 使用流包装器实现 WebShell。freebuf 上有详细文章
&lt;a href=&quot;https://xz.aliyun.com/t/2799&quot; target=&quot;_blank&quot;&gt;https://xz.aliyun.com/t/2799&lt;/a&gt; 利用动态二进制加密实现新型一句话木马之客户端篇
&lt;a href=&quot;https://github.com/rebeyond/Behinder&quot; target=&quot;_blank&quot;&gt;https://github.com/rebeyond/Behinder&lt;/a&gt; “冰蝎”动态二进制加密网站管理客户端
&lt;a href=&quot;https://xz.aliyun.com/t/2744#toc-8&quot; target=&quot;_blank&quot;&gt;https://xz.aliyun.com/t/2744#toc-8&lt;/a&gt; 利用动态二进制加密实现新型一句话木马之 Java 篇
&lt;a href=&quot;https://xz.aliyun.com/t/2758#toc-4&quot; target=&quot;_blank&quot;&gt;https://xz.aliyun.com/t/2758#toc-4&lt;/a&gt; 利用动态二进制加密实现新型一句话木马之.NET 篇
&lt;a href=&quot;https://xz.aliyun.com/t/2774#toc-4&quot; target=&quot;_blank&quot;&gt;https://xz.aliyun.com/t/2774#toc-4&lt;/a&gt; 利用动态二进制加密实现新型一句话木马之 PHP 篇&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;内网拓展后渗透&lt;a href=&quot;#内网拓展后渗透&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/OpenWireSec/metasploit&quot; target=&quot;_blank&quot;&gt;https://github.com/OpenWireSec/metasploit&lt;/a&gt; 后渗透框架
&lt;a href=&quot;https://github.com/EmpireProject/Empire&quot; target=&quot;_blank&quot;&gt;https://github.com/EmpireProject/Empire&lt;/a&gt; 基于 poweshell 的命令执行框架
&lt;a href=&quot;https://github.com/TheSecondSun/Bashark&quot; target=&quot;_blank&quot;&gt;https://github.com/TheSecondSun/Bashark&lt;/a&gt; 纯 Bash 脚本编写的后渗透框架，大鲨鱼
&lt;a href=&quot;https://github.com/JusticeRage/FFM&quot; target=&quot;_blank&quot;&gt;https://github.com/JusticeRage/FFM&lt;/a&gt; py3，拥有下载、上传功能，生成可执行 py 脚本的后门的后渗透框架
&lt;a href=&quot;https://github.com/DarkSpiritz/DarkSpiritz&quot; target=&quot;_blank&quot;&gt;https://github.com/DarkSpiritz/DarkSpiritz&lt;/a&gt; py2,后渗透框架
&lt;a href=&quot;https://github.com/byt3bl33d3r/CrackMapExec&quot; target=&quot;_blank&quot;&gt;https://github.com/byt3bl33d3r/CrackMapExec&lt;/a&gt; 网络测试中的瑞士军刀，包含 impacket、PowerSploit 等多种模块
&lt;a href=&quot;https://github.com/SpiderLabs/scavenger&quot; target=&quot;_blank&quot;&gt;https://github.com/SpiderLabs/scavenger&lt;/a&gt; 对 CrackMapExec 进行二次包装开发进行内网敏感信息扫描
&lt;a href=&quot;https://github.com/jmortega/python-pentesting&quot; target=&quot;_blank&quot;&gt;https://github.com/jmortega/python-pentesting&lt;/a&gt; python-pentesting-tool python 安全工具相关功能模块
&lt;a href=&quot;https://github.com/0xdea/tactical-exploitation&quot; target=&quot;_blank&quot;&gt;https://github.com/0xdea/tactical-exploitation&lt;/a&gt; Python/PowerShell 的测试脚本集
&lt;a href=&quot;https://github.com/PowerShellMafia/PowerSploit&quot; target=&quot;_blank&quot;&gt;https://github.com/PowerShellMafia/PowerSploit&lt;/a&gt; powershell 测试脚本集与开发框架汇总
&lt;a href=&quot;https://github.com/samratashok/nishang&quot; target=&quot;_blank&quot;&gt;https://github.com/samratashok/nishang&lt;/a&gt; powershell 脚本集与利用框架
&lt;a href=&quot;https://github.com/PowerShellEmpire/PowerTools&quot; target=&quot;_blank&quot;&gt;https://github.com/PowerShellEmpire/PowerTools&lt;/a&gt; PowerShell 脚本集，停止更新
&lt;a href=&quot;https://github.com/FuzzySecurity/PowerShell-Suite&quot; target=&quot;_blank&quot;&gt;https://github.com/FuzzySecurity/PowerShell-Suite&lt;/a&gt; PowerShell 脚本集
&lt;a href=&quot;https://github.com/rvrsh3ll/Misc-Powershell-Scripts&quot; target=&quot;_blank&quot;&gt;https://github.com/rvrsh3ll/Misc-Powershell-Scripts&lt;/a&gt; PowerShell 脚本集
&lt;a href=&quot;https://github.com/nccgroup/redsnarf&quot; target=&quot;_blank&quot;&gt;https://github.com/nccgroup/redsnarf&lt;/a&gt; 窃取哈希，密码解密，偷偷调用猕猴桃等程序，rdp 多方法利用，远程启动 shell，清楚痕迹
&lt;a href=&quot;https://github.com/BloodHoundAD/BloodHound&quot; target=&quot;_blank&quot;&gt;https://github.com/BloodHoundAD/BloodHound&lt;/a&gt; 用于分析域成员和用用户关系的程序，通过用 powershell 脚本导出域内的 session、computer、group、user 等信息，入库后进行可视化分析可以做到定点攻击。
&lt;a href=&quot;https://github.com/xorrior/RemoteRecon&quot; target=&quot;_blank&quot;&gt;https://github.com/xorrior/RemoteRecon&lt;/a&gt; 利用 DotNetToJScript 进行截图、key 记录、token 窃取、dll 与恶意代码注入
&lt;a href=&quot;https://github.com/SkyLined/LocalNetworkScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/SkyLined/LocalNetworkScanner&lt;/a&gt; 利用浏览器漏洞当对方打开网址时，扫描对方内网信息
&lt;a href=&quot;https://github.com/fdiskyou/hunter&quot; target=&quot;_blank&quot;&gt;https://github.com/fdiskyou/hunter&lt;/a&gt; 调用 Windows API 对内网信息进行搜集很全面
&lt;a href=&quot;https://github.com/0xwindows/VulScritp&quot; target=&quot;_blank&quot;&gt;https://github.com/0xwindows/VulScritp&lt;/a&gt; 内网渗透脚本，包括 banner 扫描、端口扫描；phpmyadmin、jenkins 等通用漏洞利用等
&lt;a href=&quot;https://github.com/lcatro/network_backdoor_scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/lcatro/network_backdoor_scanner&lt;/a&gt; 基于网络流量的内网探测框架
&lt;a href=&quot;https://github.com/sowish/LNScan&quot; target=&quot;_blank&quot;&gt;https://github.com/sowish/LNScan&lt;/a&gt; 详细的内部网络信息扫描器
&lt;a href=&quot;https://github.com/rootlabs/nWatch&quot; target=&quot;_blank&quot;&gt;https://github.com/rootlabs/nWatch&lt;/a&gt; 联动 nmap，并对组织内网进行扫描
&lt;a href=&quot;https://github.com/m8r0wn/nullinux&quot; target=&quot;_blank&quot;&gt;https://github.com/m8r0wn/nullinux&lt;/a&gt; 用于 Linux 的内部渗透测试工具，可用于通过 SMB 枚举操作系统信息，域信息，共享，目录和用户。
&lt;a href=&quot;https://github.com/zMarch/Orc&quot; target=&quot;_blank&quot;&gt;https://github.com/zMarch/Orc&lt;/a&gt; bash，Linux 下后渗透命令集合&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;远程控制 C2 服务器&lt;a href=&quot;#远程控制-c2-服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/malwaredllc/byob&quot; target=&quot;_blank&quot;&gt;https://github.com/malwaredllc/byob&lt;/a&gt; 僵尸网络生成框架
&lt;a href=&quot;https://github.com/proxycannon/proxycannon-ng&quot; target=&quot;_blank&quot;&gt;https://github.com/proxycannon/proxycannon-ng&lt;/a&gt; 构建攻击僵尸网络
&lt;a href=&quot;https://github.com/deadPix3l/CryptSky/&quot; target=&quot;_blank&quot;&gt;https://github.com/deadPix3l/CryptSky/&lt;/a&gt; 勒索软件 poc
&lt;a href=&quot;https://github.com/jgamblin/Mirai-Source-Code&quot; target=&quot;_blank&quot;&gt;https://github.com/jgamblin/Mirai-Source-Code&lt;/a&gt; 蠕虫病毒 poc
&lt;a href=&quot;https://github.com/AhMyth/AhMyth-Android-RAT&quot; target=&quot;_blank&quot;&gt;https://github.com/AhMyth/AhMyth-Android-RAT&lt;/a&gt; 基于 smali，Windows 下安卓远控，一对多带界面
&lt;a href=&quot;https://github.com/ssooking/cobaltstrike3.12_cracked&quot; target=&quot;_blank&quot;&gt;https://github.com/ssooking/cobaltstrike3.12_cracked&lt;/a&gt; java1.8，远控、钓鱼、内网
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/ThunderShell&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/ThunderShell&lt;/a&gt; py2，CLI 与 web 端，内存马，RC4 加密 HTTP 传输
&lt;a href=&quot;https://github.com/tiagorlampert/CHAOS&quot; target=&quot;_blank&quot;&gt;https://github.com/tiagorlampert/CHAOS&lt;/a&gt; go，win 远控，可过大部分杀软
&lt;a href=&quot;https://github.com/Ne0nd0g/merlin&quot; target=&quot;_blank&quot;&gt;https://github.com/Ne0nd0g/merlin&lt;/a&gt; go，c2 通讯，一对多
&lt;a href=&quot;https://github.com/0x09AL/Browser-C2&quot; target=&quot;_blank&quot;&gt;https://github.com/0x09AL/Browser-C2&lt;/a&gt; go，利用 chrome 以浏览器的形式连接 C2 服务器
&lt;a href=&quot;https://github.com/xdnice/PCShare&quot; target=&quot;_blank&quot;&gt;https://github.com/xdnice/PCShare&lt;/a&gt; c++，可以监视目标机器屏幕、注册表、文件系统等
&lt;a href=&quot;https://github.com/quasar/QuasarRAT&quot; target=&quot;_blank&quot;&gt;https://github.com/quasar/QuasarRAT&lt;/a&gt; c#，一对多，界面
&lt;a href=&quot;https://github.com/TheM4hd1/Vayne-RaT&quot; target=&quot;_blank&quot;&gt;https://github.com/TheM4hd1/Vayne-RaT&lt;/a&gt; c#，一对多，界面
&lt;a href=&quot;https://github.com/nettitude/PoshC2&quot; target=&quot;_blank&quot;&gt;https://github.com/nettitude/PoshC2&lt;/a&gt; PowerShell、C#，远控工具，有 win 提权组件
&lt;a href=&quot;https://github.com/euphrat1ca/njRAT-v0.7d&quot; target=&quot;_blank&quot;&gt;https://github.com/euphrat1ca/njRAT-v0.7d&lt;/a&gt; vb，常见蠕虫远控，有很多变种，一对多带界面
&lt;a href=&quot;https://github.com/zerosum0x0/koadic&quot; target=&quot;_blank&quot;&gt;https://github.com/zerosum0x0/koadic&lt;/a&gt; py3,利用 JScript/VBScript 进行控制，大宝剑
&lt;a href=&quot;https://github.com/Ridter/MyJSRat&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/MyJSRat&lt;/a&gt; py2，利用 js 后门，配合 chm、hta 可实现很多后门方式。evi1cg.me/archives/chm_backdoor.html
&lt;a href=&quot;https://github.com/its-a-feature/Apfell&quot; target=&quot;_blank&quot;&gt;https://github.com/its-a-feature/Apfell&lt;/a&gt; py3，macOS 与 linux 下的利用 js 后门，web 界面管理
&lt;a href=&quot;https://github.com/peterpt/fuzzbunch&quot; target=&quot;_blank&quot;&gt;https://github.com/peterpt/fuzzbunch&lt;/a&gt; py2，NSA 漏洞利用工具，配有自动化安装脚本与 gui 界面，远控 rat
&lt;a href=&quot;https://github.com/n1nj4sec/pupy&quot; target=&quot;_blank&quot;&gt;https://github.com/n1nj4sec/pupy&lt;/a&gt; py，Windows, Linux, OSX, Android 跨平台，一对多
&lt;a href=&quot;https://github.com/nathanlopez/Stitch&quot; target=&quot;_blank&quot;&gt;https://github.com/nathanlopez/Stitch&lt;/a&gt; py，Windows、Mac OSX、Linux 跨平台
&lt;a href=&quot;https://github.com/neoneggplant/EggShell&quot; target=&quot;_blank&quot;&gt;https://github.com/neoneggplant/EggShell&lt;/a&gt; py，macos/osx 远控,可生成 HID 代码，一对多
&lt;a href=&quot;https://github.com/Marten4n6/EvilOSX&quot; target=&quot;_blank&quot;&gt;https://github.com/Marten4n6/EvilOSX&lt;/a&gt; py，macos/osx 远控，一对多
&lt;a href=&quot;https://github.com/vesche/basicRAT&quot; target=&quot;_blank&quot;&gt;https://github.com/vesche/basicRAT&lt;/a&gt; py3，simple 远控，一对多
&lt;a href=&quot;https://github.com/Viralmaniar/Powershell-RAT&quot; target=&quot;_blank&quot;&gt;https://github.com/Viralmaniar/Powershell-RAT&lt;/a&gt; py，截图通过 gmail 传输
&lt;a href=&quot;https://github.com/byt3bl33d3r/gcat&quot; target=&quot;_blank&quot;&gt;https://github.com/byt3bl33d3r/gcat&lt;/a&gt; py，使用 gmail 作为 C&amp;amp;C 服务器
&lt;a href=&quot;https://github.com/sweetsoftware/Ares&quot; target=&quot;_blank&quot;&gt;https://github.com/sweetsoftware/Ares&lt;/a&gt; py，c2 通讯，支持代理
&lt;a href=&quot;https://github.com/micle-fm/Parat&quot; target=&quot;_blank&quot;&gt;https://github.com/micle-fm/Parat&lt;/a&gt; py，利用 telegram，windows 下的远程控制工具
&lt;a href=&quot;https://github.com/ahhh/Reverse_DNS_Shell&quot; target=&quot;_blank&quot;&gt;https://github.com/ahhh/Reverse_DNS_Shell&lt;/a&gt; py，通过 dns 传输
&lt;a href=&quot;https://github.com/iagox86/dnscat2&quot; target=&quot;_blank&quot;&gt;https://github.com/iagox86/dnscat2&lt;/a&gt; 服务端为 ruby（linux），客户端为 C（win/linux），利用 DNS 协议进行端对端传输
&lt;a href=&quot;https://github.com/deepzec/Grok-backdoor&quot; target=&quot;_blank&quot;&gt;https://github.com/deepzec/Grok-backdoor&lt;/a&gt; py，利用 ngrok 的后门
&lt;a href=&quot;https://github.com/trustedsec/trevorc2&quot; target=&quot;_blank&quot;&gt;https://github.com/trustedsec/trevorc2&lt;/a&gt; py，搭建一个合法的网站（可浏览），用于隐藏命令执行的客户端/服务器通信&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;端口转发与代理工具&lt;a href=&quot;#端口转发与代理工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/fatedier/frp&quot; target=&quot;_blank&quot;&gt;https://github.com/fatedier/frp&lt;/a&gt; 用于内网穿透的高性能的反向代理应用，支持 tcp, udp, http, https 协议
&lt;a href=&quot;https://github.com/inconshreveable/ngrok&quot; target=&quot;_blank&quot;&gt;https://github.com/inconshreveable/ngrok&lt;/a&gt; 端口转发，正反向代理，内网穿透
&lt;a href=&quot;http://ngrok.ciqiuwl.cn/&quot; target=&quot;_blank&quot;&gt;http://ngrok.ciqiuwl.cn/&lt;/a&gt; 在线小米球 ngrok
&lt;a href=&quot;https://github.com/knownsec/rtcp&quot; target=&quot;_blank&quot;&gt;https://github.com/knownsec/rtcp&lt;/a&gt; Socket 端口转发，用于远程维护
&lt;a href=&quot;https://github.com/davrodpin/mole&quot; target=&quot;_blank&quot;&gt;https://github.com/davrodpin/mole&lt;/a&gt; 基于 ssh 的端口转发
&lt;a href=&quot;http://rootkiter.com/EarthWorm&quot; target=&quot;_blank&quot;&gt;http://rootkiter.com/EarthWorm&lt;/a&gt; 一款用于开启 SOCKS v5 代理服务的工具，基于标准 C 开发，可提供多平台间的转接通讯，用于复杂网络环境下的数据转发。
&lt;a href=&quot;http://rootkiter.com/Termite/README.txt&quot; target=&quot;_blank&quot;&gt;http://rootkiter.com/Termite/README.txt&lt;/a&gt; EarthWorm 升级版，可以实现多节点跳跃
&lt;a href=&quot;https://github.com/SECFORCE/Tunna&quot; target=&quot;_blank&quot;&gt;https://github.com/SECFORCE/Tunna&lt;/a&gt; 可以通过 HTTP 封装隧道通信任何 TCP，以及用于绕过防火墙环境中的网络限制
&lt;a href=&quot;https://github.com/fbkcs/thunderdns&quot; target=&quot;_blank&quot;&gt;https://github.com/fbkcs/thunderdns&lt;/a&gt; 将 tcp 流量通过 DNS 协议转发，不需要客户端和 socket5 支持
&lt;a href=&quot;https://github.com/sensepost/reGeorg&quot; target=&quot;_blank&quot;&gt;https://github.com/sensepost/reGeorg&lt;/a&gt; reDuh 的升级版，主要是把内网服务器的端口通过 http/https 隧道转发到本机，形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口（提供了 php，asp，jsp 脚本的正反向代理）
&lt;a href=&quot;https://github.com/SpiderClub/haipproxy&quot; target=&quot;_blank&quot;&gt;https://github.com/SpiderClub/haipproxy&lt;/a&gt; py3,Scrapy and Redis,高可用 ip 代理池
&lt;a href=&quot;https://github.com/chenjiandongx/async-proxy-pool&quot; target=&quot;_blank&quot;&gt;https://github.com/chenjiandongx/async-proxy-pool&lt;/a&gt; py3 异步爬虫 ip 代理池
&lt;a href=&quot;https://github.com/audibleblink/doxycannon&quot; target=&quot;_blank&quot;&gt;https://github.com/audibleblink/doxycannon&lt;/a&gt; 使用一个 openvpn 代理池，为每一个生成 docker，当连接某一个 vpn 后，其它的进行 socks5 转发做流量分发
&lt;a href=&quot;https://github.com/decoder-it/psportfwd&quot; target=&quot;_blank&quot;&gt;https://github.com/decoder-it/psportfwd&lt;/a&gt; PowerShell 编写的端口转发工具, 无需 admin 权限
&lt;a href=&quot;https://github.com/ls0f/gortcp&quot; target=&quot;_blank&quot;&gt;https://github.com/ls0f/gortcp&lt;/a&gt; go，通过主控端、中转、被控端实现内网穿透&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Cross 超越边界 NPV&lt;a href=&quot;#cross-超越边界-npv&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bannedbook/fanqiang/wiki&quot; target=&quot;_blank&quot;&gt;https://github.com/bannedbook/fanqiang/wiki&lt;/a&gt; cross 汇总
&lt;a href=&quot;https://github.com/teddysun/across&quot; target=&quot;_blank&quot;&gt;https://github.com/teddysun/across&lt;/a&gt; 梯子搭建
&lt;a href=&quot;https://github.com/ToyoDAdoubi/doubi&quot; target=&quot;_blank&quot;&gt;https://github.com/ToyoDAdoubi/doubi&lt;/a&gt; 各种常用一键脚本
&lt;a href=&quot;https://github.com/Nyr/openvpn-install&quot; target=&quot;_blank&quot;&gt;https://github.com/Nyr/openvpn-install&lt;/a&gt; openvpn 一键
&lt;a href=&quot;https://github.com/quericy/one-key-ikev2-vpn&quot; target=&quot;_blank&quot;&gt;https://github.com/quericy/one-key-ikev2-vpn&lt;/a&gt; CentOS/Debian/Ubuntu 一键安装 IPSEC/IKEV2 VPN 脚本
&lt;a href=&quot;https://github.com/teddysun/shadowsocks_install&quot; target=&quot;_blank&quot;&gt;https://github.com/teddysun/shadowsocks_install&lt;/a&gt; shadowsocks,shadowsocksr
&lt;a href=&quot;https://github.com/guyingbo/shadowproxy&quot; target=&quot;_blank&quot;&gt;https://github.com/guyingbo/shadowproxy&lt;/a&gt; ss/socks5/http//https 等多种代理
&lt;a href=&quot;https://github.com/shadowsocks/shadowsocks-manager&quot; target=&quot;_blank&quot;&gt;https://github.com/shadowsocks/shadowsocks-manager&lt;/a&gt; shadowsocks 多用户管理
&lt;a href=&quot;https://github.com/leitbogioro/SSR.Go&quot; target=&quot;_blank&quot;&gt;https://github.com/leitbogioro/SSR.Go&lt;/a&gt; shadowsocksrr 配置管理简化工具
&lt;a href=&quot;https://github.com/ssrpanel/SSRPanel&quot; target=&quot;_blank&quot;&gt;https://github.com/ssrpanel/SSRPanel&lt;/a&gt; ss\ssr\v2ray 用户分布式管理
&lt;a href=&quot;https://github.com/xuanhuan/ss-panel&quot; target=&quot;_blank&quot;&gt;https://github.com/xuanhuan/ss-panel&lt;/a&gt; ss 用户分布式管理
&lt;a href=&quot;https://github.com/Ahref-Group/SS-Panel-smarty-Edition&quot; target=&quot;_blank&quot;&gt;https://github.com/Ahref-Group/SS-Panel-smarty-Edition&lt;/a&gt; ss 用户分布式管理，兑换码功能、商城系统，服务器信息
&lt;a href=&quot;https://github.com/Ccapton/brook-web&quot; target=&quot;_blank&quot;&gt;https://github.com/Ccapton/brook-web&lt;/a&gt; brook 程序服务端 Web 后台管理服务器（Linux|MacOS），基于 python、flask、flask-restful
&lt;a href=&quot;https://github.com/Ccapton/brook-ok&quot; target=&quot;_blank&quot;&gt;https://github.com/Ccapton/brook-ok&lt;/a&gt; Brook 一键安装脚本
&lt;a href=&quot;https://github.com/txthinking/brook&quot; target=&quot;_blank&quot;&gt;https://github.com/txthinking/brook&lt;/a&gt; go，支持 Linux/MacOS/Windows/Android/iOS 的代理与 vpn
&lt;a href=&quot;https://github.com/gwuhaolin/lightsocks&quot; target=&quot;_blank&quot;&gt;https://github.com/gwuhaolin/lightsocks&lt;/a&gt; 轻量级网络混淆代理，基于 SOCKS5 协议，类 SS
&lt;a href=&quot;https://github.com/Umbrellazc/BypassCampusNet&quot; target=&quot;_blank&quot;&gt;https://github.com/Umbrellazc/BypassCampusNet&lt;/a&gt; 校园网防断网; UDP 53 免流上网
&lt;a href=&quot;https://doub.io/dbrj-5/&quot; target=&quot;_blank&quot;&gt;https://doub.io/dbrj-5/&lt;/a&gt; 通过虚拟网卡转为类 VPN 全局代理 SSTAP，还有 sockscap64，比 proxifier 使用简单
&lt;a href=&quot;https://github.com/ntkernel/lantern&quot; target=&quot;_blank&quot;&gt;https://github.com/ntkernel/lantern&lt;/a&gt; unlimited-landeng-for-win，无限流量蓝灯
&lt;a href=&quot;https://www.psiphon3.com&quot; target=&quot;_blank&quot;&gt;https://www.psiphon3.com&lt;/a&gt; 开源赛风超越边界代理
&lt;a href=&quot;https://hide.me&quot; target=&quot;_blank&quot;&gt;https://hide.me&lt;/a&gt; 可试用
&lt;a href=&quot;https://windscribe.com&quot; target=&quot;_blank&quot;&gt;https://windscribe.com&lt;/a&gt; 可试用
&lt;a href=&quot;http://www.vpngate.net&quot; target=&quot;_blank&quot;&gt;http://www.vpngate.net&lt;/a&gt; 日本国立筑波大学超越边界代理
&lt;a href=&quot;https://rava.app&quot; target=&quot;_blank&quot;&gt;https://rava.app&lt;/a&gt; 注册可免费用一天&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;横向移动与密码 Hash 窃取&lt;a href=&quot;#横向移动与密码-hash-窃取&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.oxid.it/cain.html&quot; target=&quot;_blank&quot;&gt;http://www.oxid.it/cain.html&lt;/a&gt; Cain &amp;amp; Abel 支持密码还原、arp 中间人攻击
&lt;a href=&quot;https://github.com/gentilkiwi/mimikatz&quot; target=&quot;_blank&quot;&gt;https://github.com/gentilkiwi/mimikatz&lt;/a&gt; Windows 下以抓取密码为主的横向移动神器
&lt;a href=&quot;https://github.com/skelsec/pypykatz&quot; target=&quot;_blank&quot;&gt;https://github.com/skelsec/pypykatz&lt;/a&gt; 使用纯 py3 实现的 mimikatz
&lt;a href=&quot;https://github.com/eladshamir/Internal-Monologue&quot; target=&quot;_blank&quot;&gt;https://github.com/eladshamir/Internal-Monologue&lt;/a&gt; 无需 LSASS 进程使用 Mimikatz 从 LSASS 进程内存中提取内容, 从内存中提取明文密码, NTLM 哈希, Kerberos ticket, 以及执行 pass-the-hash/pass-the-ticket 攻击等
&lt;a href=&quot;https://github.com/AlessandroZ/LaZagne&quot; target=&quot;_blank&quot;&gt;https://github.com/AlessandroZ/LaZagne&lt;/a&gt; py3，密码抓取工具
&lt;a href=&quot;https://github.com/AlessandroZ/LaZagneForensic&quot; target=&quot;_blank&quot;&gt;https://github.com/AlessandroZ/LaZagneForensic&lt;/a&gt; LaZagne 密码破解升级版，利用 DPAPI，目前缺陷是需要 windows user 密码
&lt;a href=&quot;https://github.com/twelvesec/passcat&quot; target=&quot;_blank&quot;&gt;https://github.com/twelvesec/passcat&lt;/a&gt; Windows 下密码抓取工具
&lt;a href=&quot;https://github.com/huntergregal/mimipenguin&quot; target=&quot;_blank&quot;&gt;https://github.com/huntergregal/mimipenguin&lt;/a&gt; linux 密码抓取神器
&lt;a href=&quot;https://github.com/quarkslab/quarkspwdump&quot; target=&quot;_blank&quot;&gt;https://github.com/quarkslab/quarkspwdump&lt;/a&gt; quarkslab 出品的密码抓取工具，不用注入任何进程
&lt;a href=&quot;https://github.com/mthbernardes/sshLooter&quot; target=&quot;_blank&quot;&gt;https://github.com/mthbernardes/sshLooter&lt;/a&gt; 从 ssh 服务中窃取用户名密码
&lt;a href=&quot;https://github.com/nettitude/Invoke-PowerThIEf&quot; target=&quot;_blank&quot;&gt;https://github.com/nettitude/Invoke-PowerThIEf&lt;/a&gt; 利用 IE 进行后渗透，抓取密码、重定向等
&lt;a href=&quot;https://github.com/GhostPack/Rubeus&quot; target=&quot;_blank&quot;&gt;https://github.com/GhostPack/Rubeus&lt;/a&gt; 操作 Kerberos 的库, 实现了 Kekeo 的大部分功能, C#编写
&lt;a href=&quot;https://github.com/m8r0wn/ldap_search&quot; target=&quot;_blank&quot;&gt;https://github.com/m8r0wn/ldap_search&lt;/a&gt; PY,通过 ldap（轻量目录访问协议）认证，列举 win 域信息，爆破登录&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Linux 提权相关&lt;a href=&quot;#linux-提权相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/AlessandroZ/BeRoot&quot; target=&quot;_blank&quot;&gt;https://github.com/AlessandroZ/BeRoot&lt;/a&gt; py,通过检查常见的错误配置来查找提权方法. 支持 Windows/Linux/Mac
&lt;a href=&quot;https://github.com/mschwager/0wned&quot; target=&quot;_blank&quot;&gt;https://github.com/mschwager/0wned&lt;/a&gt; 利用 python 包进行高权限用户创建
&lt;a href=&quot;https://github.com/mzet-/linux-exploit-suggester&quot; target=&quot;_blank&quot;&gt;https://github.com/mzet-/linux-exploit-suggester&lt;/a&gt; 查找 linux 有哪些补丁没有打的脚本
&lt;a href=&quot;https://github.com/belane/linux-soft-exploit-suggester&quot; target=&quot;_blank&quot;&gt;https://github.com/belane/linux-soft-exploit-suggester&lt;/a&gt; 查找 linux 有哪些有漏洞的软件
&lt;a href=&quot;https://github.com/dirtycow/dirtycow.github.io&quot; target=&quot;_blank&quot;&gt;https://github.com/dirtycow/dirtycow.github.io&lt;/a&gt; 脏牛提权漏洞 exp
&lt;a href=&quot;https://github.com/FireFart/dirtycow&quot; target=&quot;_blank&quot;&gt;https://github.com/FireFart/dirtycow&lt;/a&gt; 脏牛提权漏洞 exp
&lt;a href=&quot;https://github.com/stanleyb0y/sushell&quot; target=&quot;_blank&quot;&gt;https://github.com/stanleyb0y/sushell&lt;/a&gt; 利用 su 小偷实现低权限用户窃取 root 用户口令
&lt;a href=&quot;https://github.com/jas502n/CVE-2018-17182/&quot; target=&quot;_blank&quot;&gt;https://github.com/jas502n/CVE-2018-17182/&lt;/a&gt; Linux 内核 VMA-UAF 提权漏洞 CVE-2018-17182
&lt;a href=&quot;https://github.com/jas502n/CVE-2018-14665&quot; target=&quot;_blank&quot;&gt;https://github.com/jas502n/CVE-2018-14665&lt;/a&gt; CVE-2018-14665，linux 下 Xorg X 服务器提权利用
&lt;a href=&quot;https://github.com/nmulasmajic/syscall_exploit_CVE-2018-8897&quot; target=&quot;_blank&quot;&gt;https://github.com/nmulasmajic/syscall_exploit_CVE-2018-8897&lt;/a&gt; Linux 系统利用 Syscall 实现提权
&lt;a href=&quot;https://github.com/can1357/CVE-2018-8897&quot; target=&quot;_blank&quot;&gt;https://github.com/can1357/CVE-2018-8897&lt;/a&gt; Linux 系统利用 Syscall 实现提权
&lt;a href=&quot;https://github.com/SecWiki/linux-kernel-exploits&quot; target=&quot;_blank&quot;&gt;https://github.com/SecWiki/linux-kernel-exploits&lt;/a&gt; linux-kernel-exploits Linux 平台提权漏洞集合
&lt;a href=&quot;https://github.com/nilotpalbiswas/Auto-Root-Exploit&quot; target=&quot;_blank&quot;&gt;https://github.com/nilotpalbiswas/Auto-Root-Exploit&lt;/a&gt; linux 自动提权脚本
&lt;a href=&quot;https://github.com/WazeHell/PE-Linux&quot; target=&quot;_blank&quot;&gt;https://github.com/WazeHell/PE-Linux&lt;/a&gt; Linux 提权工具
&lt;a href=&quot;https://guif.re/linuxeop&quot; target=&quot;_blank&quot;&gt;https://guif.re/linuxeop&lt;/a&gt; linux 提权命令集合&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Windows 提权相关&lt;a href=&quot;#windows-提权相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.fuzzysecurity.com/tutorials/16.html&quot; target=&quot;_blank&quot;&gt;http://www.fuzzysecurity.com/tutorials/16.html&lt;/a&gt; windows 平台教程级提权参考文章
&lt;a href=&quot;https://github.com/SecWiki/windows-kernel-exploits&quot; target=&quot;_blank&quot;&gt;https://github.com/SecWiki/windows-kernel-exploits&lt;/a&gt; Windows 平台提权漏洞 Exp 集合
&lt;a href=&quot;https://github.com/51x/WHP&quot; target=&quot;_blank&quot;&gt;https://github.com/51x/WHP&lt;/a&gt; windows 下各种提权与利用工具
&lt;a href=&quot;https://github.com/rasta-mouse/Sherlock&quot; target=&quot;_blank&quot;&gt;https://github.com/rasta-mouse/Sherlock&lt;/a&gt; win 提权漏洞验证
&lt;a href=&quot;https://github.com/WindowsExploits/Exploits&quot; target=&quot;_blank&quot;&gt;https://github.com/WindowsExploits/Exploits&lt;/a&gt; 微软 CVE-2012-0217、CVE-2016-3309、CVE-2016-3371、CVE-2016-7255、CVE-2017-0213 提权利用
&lt;a href=&quot;https://github.com/decoder-it/lonelypotato&quot; target=&quot;_blank&quot;&gt;https://github.com/decoder-it/lonelypotato&lt;/a&gt; RottenPotatoNG 变种，利用 NBNS 本地域名欺骗和 WPAD 代理欺骗提权
&lt;a href=&quot;https://github.com/ohpe/juicy-potato&quot; target=&quot;_blank&quot;&gt;https://github.com/ohpe/juicy-potato&lt;/a&gt; RottenPotatoNG 变种，利用 com 对象、用户 token 进行提权
&lt;a href=&quot;https://github.com/foxglovesec/Potato&quot; target=&quot;_blank&quot;&gt;https://github.com/foxglovesec/Potato&lt;/a&gt; RottenPotatoNG 变种，利用本地域名欺骗和代理欺骗提权
&lt;a href=&quot;https://github.com/DanMcInerney/icebreaker&quot; target=&quot;_blank&quot;&gt;https://github.com/DanMcInerney/icebreaker&lt;/a&gt; 处于内网环境但又在 AD 环境之外，icebreaker 将会帮助你获取明文 Active Directory 凭据（活动目录存储在域控服务器可用于提权）
&lt;a href=&quot;https://github.com/hausec/ADAPE-Script&quot; target=&quot;_blank&quot;&gt;https://github.com/hausec/ADAPE-Script&lt;/a&gt; Active Directory 权限提升脚本
&lt;a href=&quot;https://github.com/klionsec/BypassAV-AllThings&quot; target=&quot;_blank&quot;&gt;https://github.com/klionsec/BypassAV-AllThings&lt;/a&gt; 利用 aspx 一句话配合提权 payload 提权
&lt;a href=&quot;https://github.com/St0rn/Windows-10-Exploit&quot; target=&quot;_blank&quot;&gt;https://github.com/St0rn/Windows-10-Exploit&lt;/a&gt; msf 插件，win10 uac bypass
&lt;a href=&quot;https://github.com/sam-b/CVE-2014-4113&quot; target=&quot;_blank&quot;&gt;https://github.com/sam-b/CVE-2014-4113&lt;/a&gt; 利用 Win32k.sys 内核漏洞进行提取，ms14-058
&lt;a href=&quot;https://github.com/breenmachine/RottenPotatoNG&quot; target=&quot;_blank&quot;&gt;https://github.com/breenmachine/RottenPotatoNG&lt;/a&gt; 利用 NBNS 本地域名欺骗和 WPAD 代理欺骗提权
&lt;a href=&quot;https://github.com/unamer/CVE-2018-8120&quot; target=&quot;_blank&quot;&gt;https://github.com/unamer/CVE-2018-8120&lt;/a&gt; 影响 Win32k 组件，针对 win7 和 win2008 提权
&lt;a href=&quot;https://github.com/alpha1ab/CVE-2018-8120&quot; target=&quot;_blank&quot;&gt;https://github.com/alpha1ab/CVE-2018-8120&lt;/a&gt; 在 win7 与 win2k8 的基础上增加了 winXP 与 win2k3
&lt;a href=&quot;https://github.com/0xbadjuju/Tokenvator&quot; target=&quot;_blank&quot;&gt;https://github.com/0xbadjuju/Tokenvator&lt;/a&gt; 使用 Windows 令牌提升权限的工具，提供一个交互命令行界面&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;权限绕过&lt;a href=&quot;#权限绕过&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://payloads.online/archivers/2018-12-22/1&quot; target=&quot;_blank&quot;&gt;https://payloads.online/archivers/2018-12-22/1&lt;/a&gt; DLL Hijacking &amp;amp; COM Hijacking ByPass UAC – 议题解读
&lt;a href=&quot;https://github.com/tyranid/DotNetToJScript&quot; target=&quot;_blank&quot;&gt;https://github.com/tyranid/DotNetToJScript&lt;/a&gt; 能够利用 JS/Vbs 脚本加载.Net 程序的工具
&lt;a href=&quot;https://github.com/mdsecactivebreach/SharpPack&quot; target=&quot;_blank&quot;&gt;https://github.com/mdsecactivebreach/SharpPack&lt;/a&gt; 绕过系统应用白名单执行 DotNet and PowerShell tools
&lt;a href=&quot;https://github.com/rootm0s/WinPwnage&quot; target=&quot;_blank&quot;&gt;https://github.com/rootm0s/WinPwnage&lt;/a&gt; py2，win 下权限提升，uac 绕过，dll 注入等
&lt;a href=&quot;https://github.com/hfiref0x/UACME&quot; target=&quot;_blank&quot;&gt;https://github.com/hfiref0x/UACME&lt;/a&gt; 包含许多用于多个版本操作系统上绕过 Windows 用户帐户控制的方法
&lt;a href=&quot;https://github.com/Ben0xA/nps&quot; target=&quot;_blank&quot;&gt;https://github.com/Ben0xA/nps&lt;/a&gt; 实现了不使用 powershell.exe 的情况下执行 powershell 命令
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/PowerLessShell&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/PowerLessShell&lt;/a&gt; 实现了不调用 powershell.exe 的情况下执行 powershell 命令
&lt;a href=&quot;https://github.com/p3nt4/PowerShdll&quot; target=&quot;_blank&quot;&gt;https://github.com/p3nt4/PowerShdll&lt;/a&gt; 使用 rundll32 运行 PowerShell，绕过软件限制
&lt;a href=&quot;https://github.com/ionescu007/r0ak&quot; target=&quot;_blank&quot;&gt;https://github.com/ionescu007/r0ak&lt;/a&gt; 内核层的瑞士军刀. 在 Windows10 内核中读/写/执行代码
&lt;a href=&quot;https://github.com/leechristensen/UnmanagedPowerShell&quot; target=&quot;_blank&quot;&gt;https://github.com/leechristensen/UnmanagedPowerShell&lt;/a&gt; 从一个非托管程序来执行 PowerShell,经过一些修改后可以被用来注入到其他进程
&lt;a href=&quot;https://github.com/stephenfewer/ReflectiveDLLInjection&quot; target=&quot;_blank&quot;&gt;https://github.com/stephenfewer/ReflectiveDLLInjection&lt;/a&gt; 一种库注入技术，让 DLL 自身不使用 LoadLibraryA 函数,将自身映射到目标进程内存中
&lt;a href=&quot;https://github.com/ChrisAD/ads-payload&quot; target=&quot;_blank&quot;&gt;https://github.com/ChrisAD/ads-payload&lt;/a&gt; 利用环境变量与 destop.ini 绕过 windows 下的 Palo Alto Traps endpoint 防护软件
&lt;a href=&quot;https://github.com/Zer0Mem0ry/RunPE&quot; target=&quot;_blank&quot;&gt;https://github.com/Zer0Mem0ry/RunPE&lt;/a&gt; 通过内存读取，网络传输内容，利用 PE 执行 shellcode&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;沙盒逃逸&lt;a href=&quot;#沙盒逃逸&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/hacksysteam/WpadEscape&quot; target=&quot;_blank&quot;&gt;https://github.com/hacksysteam/WpadEscape&lt;/a&gt; 利用 wpad 进行浏览器 sandbox 沙箱逃逸
&lt;a href=&quot;https://github.com/unamer/vmware_escape&quot; target=&quot;_blank&quot;&gt;https://github.com/unamer/vmware_escape&lt;/a&gt; vmware 虚拟机逃逸。CVE-2017-4901，CVE-2018-6981，CVE-2018-6982
&lt;a href=&quot;https://github.com/MorteNoir1/virtualbox_e1000_0day&quot; target=&quot;_blank&quot;&gt;https://github.com/MorteNoir1/virtualbox_e1000_0day&lt;/a&gt; VirtualBox E1000 Guest-to-Host Escape 逃逸。教程
&lt;a href=&quot;https://bugs.chromium.org/p/project-zero/issues/detail?id=1682&amp;amp;desc=2&quot; target=&quot;_blank&quot;&gt;https://bugs.chromium.org/p/project-zero/issues/detail?id=1682&amp;amp;desc=2&lt;/a&gt; Ghostscript：基于漏洞 CVE-2018-17961 的-dSAFER 沙盒逃逸技术&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;后门免杀代码混淆&lt;a href=&quot;#后门免杀代码混淆&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.shellterproject.com&quot; target=&quot;_blank&quot;&gt;https://www.shellterproject.com&lt;/a&gt; 杀毒软件绕过
&lt;a href=&quot;https://github.com/trustedsec/unicorn&quot; target=&quot;_blank&quot;&gt;https://github.com/trustedsec/unicorn&lt;/a&gt; py，一键生成多种后门
&lt;a href=&quot;https://github.com/islamTaha12/Python-Rootkit&quot; target=&quot;_blank&quot;&gt;https://github.com/islamTaha12/Python-Rootkit&lt;/a&gt; windows 下 rootkit，反弹 meterpreter
&lt;a href=&quot;https://github.com/n00py/Hwacha&quot; target=&quot;_blank&quot;&gt;https://github.com/n00py/Hwacha&lt;/a&gt; linux 下快速生成 metepreter 等多种 payload
&lt;a href=&quot;https://github.com/Screetsec/Vegile&quot; target=&quot;_blank&quot;&gt;https://github.com/Screetsec/Vegile&lt;/a&gt; msf 免杀，程序注入
&lt;a href=&quot;https://github.com/MohamedNourTN/Terminator&quot; target=&quot;_blank&quot;&gt;https://github.com/MohamedNourTN/Terminator&lt;/a&gt; py2，msf 免杀
&lt;a href=&quot;https://github.com/Veil-Framework/Veil&quot; target=&quot;_blank&quot;&gt;https://github.com/Veil-Framework/Veil&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/abedalqaderswedan1/aswcrypter&quot; target=&quot;_blank&quot;&gt;https://github.com/abedalqaderswedan1/aswcrypter&lt;/a&gt; py、bash，msf 免杀
&lt;a href=&quot;https://github.com/Screetsec/TheFatRat&quot; target=&quot;_blank&quot;&gt;https://github.com/Screetsec/TheFatRat&lt;/a&gt; java，msf 免杀，利用 searchsploit 快速搜索
&lt;a href=&quot;https://github.com/pasahitz/zirikatu&quot; target=&quot;_blank&quot;&gt;https://github.com/pasahitz/zirikatu&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/govolution/avet&quot; target=&quot;_blank&quot;&gt;https://github.com/govolution/avet&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/GreatSCT/GreatSCT&quot; target=&quot;_blank&quot;&gt;https://github.com/GreatSCT/GreatSCT&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/EgeBalci/HERCULES&quot; target=&quot;_blank&quot;&gt;https://github.com/EgeBalci/HERCULES&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/trustedsec/nps_payload&quot; target=&quot;_blank&quot;&gt;https://github.com/trustedsec/nps_payload&lt;/a&gt; msf 免杀
&lt;a href=&quot;https://github.com/4w4k3/Insanity-Framework&quot; target=&quot;_blank&quot;&gt;https://github.com/4w4k3/Insanity-Framework&lt;/a&gt; py，payload 生成，过杀软，识别虚拟机，钓鱼，内存注入等
&lt;a href=&quot;https://github.com/hlldz/SpookFlare&quot; target=&quot;_blank&quot;&gt;https://github.com/hlldz/SpookFlare&lt;/a&gt; Meterpreter，Empire，Koadic 等 loader/dropper 的生成器，可以绕过客户端检测和网络端检测的端点策略
&lt;a href=&quot;https://github.com/pasahitz/regsvr32&quot; target=&quot;_blank&quot;&gt;https://github.com/pasahitz/regsvr32&lt;/a&gt; 使用 C#+Empire 实现最小体积免杀后门
&lt;a href=&quot;https://github.com/malcomvetter/UnstoppableService&quot; target=&quot;_blank&quot;&gt;https://github.com/malcomvetter/UnstoppableService&lt;/a&gt; 将自身安装为 Windows 服务且管理员无法停止/暂停服务的程序. C#编写
&lt;a href=&quot;https://github.com/Cn33liz/StarFighters&quot; target=&quot;_blank&quot;&gt;https://github.com/Cn33liz/StarFighters&lt;/a&gt; 基于 DotNetToJScript，利用 JavaScript 和 VBScript 执行 Empire Launcher
&lt;a href=&quot;https://github.com/mdsecactivebreach/SharpShooter&quot; target=&quot;_blank&quot;&gt;https://github.com/mdsecactivebreach/SharpShooter&lt;/a&gt; 基于 DotNetToJScript 使用 js、vbs，用于检索和执行任意 CSharp 源码的 payload 创建框架
&lt;a href=&quot;https://github.com/mdsecactivebreach/CACTUSTORCH&quot; target=&quot;_blank&quot;&gt;https://github.com/mdsecactivebreach/CACTUSTORCH&lt;/a&gt; 基于 DotNetToJScript 使用 js、vbs 生成恶意 payload
&lt;a href=&quot;https://github.com/OmerYa/Invisi-Shell&quot; target=&quot;_blank&quot;&gt;https://github.com/OmerYa/Invisi-Shell&lt;/a&gt; 对 powershell 文件进行混淆
&lt;a href=&quot;https://github.com/danielbohannon/Invoke-DOSfuscation&quot; target=&quot;_blank&quot;&gt;https://github.com/danielbohannon/Invoke-DOSfuscation&lt;/a&gt; 对 powershell 文件进行混淆，加密操作以及重新编码
&lt;a href=&quot;https://github.com/danielbohannon/Invoke-Obfuscation&quot; target=&quot;_blank&quot;&gt;https://github.com/danielbohannon/Invoke-Obfuscation&lt;/a&gt; 对 powershell 文件进行混淆，加密操作以及重新编码
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/SCT-obfuscator&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/SCT-obfuscator&lt;/a&gt; Cobalt Strike SCT 有效载荷混淆器
&lt;a href=&quot;https://github.com/tokyoneon/Armor&quot; target=&quot;_blank&quot;&gt;https://github.com/tokyoneon/Armor&lt;/a&gt; bash，生成加密 Payload 在 macOS 上反弹 Shell
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/MaliciousMacroGenerator&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/MaliciousMacroGenerator&lt;/a&gt; 宏混淆，其中还包括 AV/Sandboxes 逃避机制
&lt;a href=&quot;https://github.com/Kkevsterrr/backdoorme&quot; target=&quot;_blank&quot;&gt;https://github.com/Kkevsterrr/backdoorme&lt;/a&gt; py3、py2 多种类型的后门、shell 生成工具，可以自动维持权限
&lt;a href=&quot;https://github.com/TestingPens/MalwarePersistenceScripts&quot; target=&quot;_blank&quot;&gt;https://github.com/TestingPens/MalwarePersistenceScripts&lt;/a&gt; win 下权限维持脚本
&lt;a href=&quot;https://github.com/mhaskar/Linux-Root-Kit&quot; target=&quot;_blank&quot;&gt;https://github.com/mhaskar/Linux-Root-Kit&lt;/a&gt; py，simple，linux 下 rootkit
&lt;a href=&quot;https://github.com/PinkP4nther/Sutekh&quot; target=&quot;_blank&quot;&gt;https://github.com/PinkP4nther/Sutekh&lt;/a&gt; simple，rootkit，使普通用户获取 root shell
&lt;a href=&quot;https://github.com/threatexpress/metatwin&quot; target=&quot;_blank&quot;&gt;https://github.com/threatexpress/metatwin&lt;/a&gt; 从一个文件中提取元数据，包括数字签名，并注入到另一个文件中
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/Windows-SignedBinary&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/Windows-SignedBinary&lt;/a&gt; 可以修改二进制文件的 HASH，同时保留微软 windows 的签名
&lt;a href=&quot;https://github.com/secretsquirrel/SigThief&quot; target=&quot;_blank&quot;&gt;https://github.com/secretsquirrel/SigThief&lt;/a&gt; py，用于劫持合法的数字签名并绕过 Windows 的哈希验证机制的脚本工具
&lt;a href=&quot;https://github.com/9aylas/Shortcut-Payload-Generator&quot; target=&quot;_blank&quot;&gt;https://github.com/9aylas/Shortcut-Payload-Generator&lt;/a&gt; 快捷方式(.lnk)文件 Payload 生成器.AutoIt 编写
&lt;a href=&quot;https://github.com/GuestGuri/Rootkit&quot; target=&quot;_blank&quot;&gt;https://github.com/GuestGuri/Rootkit&lt;/a&gt; 反弹一个 tcp 连接，将进程 id 绑定到一个空文件夹
&lt;a href=&quot;https://github.com/secretsquirrel/the-backdoor-factory&quot; target=&quot;_blank&quot;&gt;https://github.com/secretsquirrel/the-backdoor-factory&lt;/a&gt; 可以生成 win32PE 后门测试程序,ELF 文件后门程序等&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;社工相关&lt;a href=&quot;#社工相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/brannondorsey/PassGAN&quot; target=&quot;_blank&quot;&gt;https://github.com/brannondorsey/PassGAN&lt;/a&gt; py,深度学习,密码字典样本生成
&lt;a href=&quot;https://github.com/Mebus/cupp&quot; target=&quot;_blank&quot;&gt;https://github.com/Mebus/cupp&lt;/a&gt; 根据用户习惯密码生成弱口令探测
&lt;a href=&quot;https://github.com/Saferman/cupper&quot; target=&quot;_blank&quot;&gt;https://github.com/Saferman/cupper&lt;/a&gt; 根据用户习惯密码生成弱口令探测，楼上升级
&lt;a href=&quot;https://github.com/LandGrey/pydictor&quot; target=&quot;_blank&quot;&gt;https://github.com/LandGrey/pydictor&lt;/a&gt; py3，特定密码字典生成
&lt;a href=&quot;https://github.com/mehulj94/Radium-Keylogger&quot; target=&quot;_blank&quot;&gt;https://github.com/mehulj94/Radium-Keylogger&lt;/a&gt; python 下的键盘记录工具
&lt;a href=&quot;https://github.com/threatexpress/domainhunter&quot; target=&quot;_blank&quot;&gt;https://github.com/threatexpress/domainhunter&lt;/a&gt; 检查过期域名，bluecoat 分类和 Archive.org 历史记录，以确定最为适合于钓鱼和 C2 的域名
&lt;a href=&quot;https://github.com/Mr-Un1k0d3r/CatMyPhish&quot; target=&quot;_blank&quot;&gt;https://github.com/Mr-Un1k0d3r/CatMyPhish&lt;/a&gt; 收集目标类似的尚未注册的域名
&lt;a href=&quot;https://github.com/x0day/Multisearch-v2&quot; target=&quot;_blank&quot;&gt;https://github.com/x0day/Multisearch-v2&lt;/a&gt; Bing、google、360、zoomeye 等搜索引擎聚合搜索，可用于发现企业被搜索引擎收录的敏感资产信息
&lt;a href=&quot;https://github.com/n0tr00t/Sreg&quot; target=&quot;_blank&quot;&gt;https://github.com/n0tr00t/Sreg&lt;/a&gt; Sreg 可对使用者通过输入 email、phone、username 的返回用户注册的所有互联网护照信息。
&lt;a href=&quot;https://github.com/SpiderLabs/social_mapper&quot; target=&quot;_blank&quot;&gt;https://github.com/SpiderLabs/social_mapper&lt;/a&gt; 社交媒体枚举和关联工具, 通过人脸识别关联人物侧写
&lt;a href=&quot;https://github.com/vysec/MaiInt&quot; target=&quot;_blank&quot;&gt;https://github.com/vysec/MaiInt&lt;/a&gt; 公司雇员信息收集测试工具
&lt;a href=&quot;https://github.com/jofpin/trape&quot; target=&quot;_blank&quot;&gt;https://github.com/jofpin/trape&lt;/a&gt; py，利用 OSINT 对人员进行追踪定位
&lt;a href=&quot;https://github.com/famavott/osint-scraper&quot; target=&quot;_blank&quot;&gt;https://github.com/famavott/osint-scraper&lt;/a&gt; 输入人名或邮箱地址, 自动从互联网爬取关于此人的信息
&lt;a href=&quot;https://github.com/xHak9x/fbi&quot; target=&quot;_blank&quot;&gt;https://github.com/xHak9x/fbi&lt;/a&gt; py2,facebook 脸书信息搜集工具
&lt;a href=&quot;https://github.com/initstring/linkedin2username&quot; target=&quot;_blank&quot;&gt;https://github.com/initstring/linkedin2username&lt;/a&gt; 通过 Linkedin 领英获取相关公司员工列表
&lt;a href=&quot;https://github.com/0x09AL/raven&quot; target=&quot;_blank&quot;&gt;https://github.com/0x09AL/raven&lt;/a&gt; linux 下领英 Linkedin information gathering tool
&lt;a href=&quot;https://github.com/Ridter/Mailget&quot; target=&quot;_blank&quot;&gt;https://github.com/Ridter/Mailget&lt;/a&gt; 通过脉脉用户猜测企业邮箱
&lt;a href=&quot;https://github.com/haccer/tweep&quot; target=&quot;_blank&quot;&gt;https://github.com/haccer/tweep&lt;/a&gt; 使用 twitter API 进行信息爬取查询
&lt;a href=&quot;https://github.com/MazenElzanaty/TwLocation&quot; target=&quot;_blank&quot;&gt;https://github.com/MazenElzanaty/TwLocation&lt;/a&gt; py，获取 Twitter 用户发推的地址
&lt;a href=&quot;https://github.com/vaguileradiaz/tinfoleak&quot; target=&quot;_blank&quot;&gt;https://github.com/vaguileradiaz/tinfoleak&lt;/a&gt; web 界面，对某人的 twitter 进行全面的情报分析
&lt;a href=&quot;https://github.com/deepfakes&quot; target=&quot;_blank&quot;&gt;https://github.com/deepfakes&lt;/a&gt; 虚假音视频制作
&lt;a href=&quot;https://www.jianshu.com/p/147cf5414851&quot; target=&quot;_blank&quot;&gt;https://www.jianshu.com/p/147cf5414851&lt;/a&gt; 聊聊那些常见的探侦类 APP
&lt;a href=&quot;https://github.com/thinkst/canarytokens&quot; target=&quot;_blank&quot;&gt;https://github.com/thinkst/canarytokens&lt;/a&gt; 重要文件的追踪溯源，信标定位（&lt;a href=&quot;https://canarytokens.org/generate#%EF%BC%89&quot; target=&quot;_blank&quot;&gt;https://canarytokens.org/generate#）&lt;/a&gt;
&lt;a href=&quot;https://github.com/ggerganov/kbd-audio&quot; target=&quot;_blank&quot;&gt;https://github.com/ggerganov/kbd-audio&lt;/a&gt; c++,linux,利用麦克风监控键盘输入测试输入值&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;钓鱼框架邮件伪造&lt;a href=&quot;#钓鱼框架邮件伪造&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bhdresh/SocialEngineeringPayloads&quot; target=&quot;_blank&quot;&gt;https://github.com/bhdresh/SocialEngineeringPayloads&lt;/a&gt; 负责收集用于证书盗窃和鱼叉式网络钓鱼攻击的社交工程技巧和 payloads
&lt;a href=&quot;https://github.com/trustedsec/social-engineer-toolkit&quot; target=&quot;_blank&quot;&gt;https://github.com/trustedsec/social-engineer-toolkit&lt;/a&gt; 专为社交工程设计的开源渗透测试框架
&lt;a href=&quot;https://github.com/thelinuxchoice/blackeye&quot; target=&quot;_blank&quot;&gt;https://github.com/thelinuxchoice/blackeye&lt;/a&gt; 拥有 facebook、instagram 等三十余个钓鱼模板的一键启用工具
&lt;a href=&quot;https://github.com/M4cs/BlackEye-Python&quot; target=&quot;_blank&quot;&gt;https://github.com/M4cs/BlackEye-Python&lt;/a&gt; 以 blackeye 为基础加强子域的管理
&lt;a href=&quot;https://github.com/azizaltuntas/Camelishing&quot; target=&quot;_blank&quot;&gt;https://github.com/azizaltuntas/Camelishing&lt;/a&gt; py3，界面化社会工程学攻击辅助工具
&lt;a href=&quot;https://github.com/JonCooperWorks/judas&quot; target=&quot;_blank&quot;&gt;https://github.com/JonCooperWorks/judas&lt;/a&gt; go，克隆网站钓鱼
&lt;a href=&quot;https://github.com/gophish/gophish&quot; target=&quot;_blank&quot;&gt;https://github.com/gophish/gophish&lt;/a&gt; go，拥有在线模板设计、发送诱骗广告等功能的钓鱼系统
&lt;a href=&quot;https://github.com/tatanus/SPF&quot; target=&quot;_blank&quot;&gt;https://github.com/tatanus/SPF&lt;/a&gt; py2，deefcon 上的钓鱼系统
&lt;a href=&quot;https://github.com/MSG-maniac/mail_fishing&quot; target=&quot;_blank&quot;&gt;https://github.com/MSG-maniac/mail_fishing&lt;/a&gt; 甲方内部钓鱼系统
&lt;a href=&quot;https://github.com/samyoyo/weeman&quot; target=&quot;_blank&quot;&gt;https://github.com/samyoyo/weeman&lt;/a&gt; 钓鱼的 http 服务器
&lt;a href=&quot;https://github.com/Raikia/FiercePhish&quot; target=&quot;_blank&quot;&gt;https://github.com/Raikia/FiercePhish&lt;/a&gt; 可以管理所有钓鱼攻击的完整钓鱼框架，允许你跟踪单独的网络钓鱼活动，定时发送电子邮件等
&lt;a href=&quot;https://github.com/securestate/king-phisher&quot; target=&quot;_blank&quot;&gt;https://github.com/securestate/king-phisher&lt;/a&gt; 可视化钓鱼活动工具包
&lt;a href=&quot;https://github.com/fireeye/ReelPhish&quot; target=&quot;_blank&quot;&gt;https://github.com/fireeye/ReelPhish&lt;/a&gt; 实时双因素网络钓鱼工具
&lt;a href=&quot;https://github.com/kgretzky/evilginx&quot; target=&quot;_blank&quot;&gt;https://github.com/kgretzky/evilginx&lt;/a&gt; 绕过双因素验证的钓鱼框架
&lt;a href=&quot;https://github.com/kgretzky/evilginx2&quot; target=&quot;_blank&quot;&gt;https://github.com/kgretzky/evilginx2&lt;/a&gt; MiTM 框架, 登录页面钓鱼, 绕过双因素认证等
&lt;a href=&quot;https://github.com/ustayready/CredSniper&quot; target=&quot;_blank&quot;&gt;https://github.com/ustayready/CredSniper&lt;/a&gt; 使用 Flask 和 Jinja2 模板编写的网络钓鱼框架，支持捕获 2FA 令牌
&lt;a href=&quot;https://github.com/fireeye/PwnAuth&quot; target=&quot;_blank&quot;&gt;https://github.com/fireeye/PwnAuth&lt;/a&gt; OAuth 滥用测试检测平台
&lt;a href=&quot;https://github.com/n0pe-sled/Postfix-Server-Setup&quot; target=&quot;_blank&quot;&gt;https://github.com/n0pe-sled/Postfix-Server-Setup&lt;/a&gt; 自动化建立一个网络钓鱼服务器
&lt;a href=&quot;https://github.com/Dionach/PhEmail&quot; target=&quot;_blank&quot;&gt;https://github.com/Dionach/PhEmail&lt;/a&gt; py2，钓鱼与邮件伪造
&lt;a href=&quot;https://github.com/PHPMailer/PHPMailer&quot; target=&quot;_blank&quot;&gt;https://github.com/PHPMailer/PHPMailer&lt;/a&gt; 世界上最流行的 PHP 发送邮件的代码
&lt;a href=&quot;http://tool.chacuo.net/mailanonymous&quot; target=&quot;_blank&quot;&gt;http://tool.chacuo.net/mailanonymous&lt;/a&gt; 在线邮件伪造
&lt;a href=&quot;http://ns4gov.000webhostapp.com&quot; target=&quot;_blank&quot;&gt;http://ns4gov.000webhostapp.com&lt;/a&gt; 在线邮件伪造&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;中间人攻击流量劫持&lt;a href=&quot;#中间人攻击流量劫持&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/bettercap/bettercap&quot; target=&quot;_blank&quot;&gt;https://github.com/bettercap/bettercap&lt;/a&gt; 网络攻击以及监控的瑞士军刀。该工具支持多种模块，比如 ARP/DNS 欺骗、TCP 以及数据包代理等
&lt;a href=&quot;https://github.com/mitmproxy/mitmproxy&quot; target=&quot;_blank&quot;&gt;https://github.com/mitmproxy/mitmproxy&lt;/a&gt; PY,支持 SSL 拦截，进行 https 流量代理
&lt;a href=&quot;https://github.com/qiyeboy/BaseProxy&quot; target=&quot;_blank&quot;&gt;https://github.com/qiyeboy/BaseProxy&lt;/a&gt; py3,异步 http/https 代理,楼上简化版。可以作为中间人工具，比如说替换网址图片等
&lt;a href=&quot;https://github.com/lgandx/Responder&quot; target=&quot;_blank&quot;&gt;https://github.com/lgandx/Responder&lt;/a&gt; 用于嗅探网络内所有的 NTLM、NTLMv1/v2、Net-NTLMv1/v2 包，对网络内主机进行欺骗获取用户 hash。a 拿着 b 密码请求 b，c 对 a 说我是 b，然后 c 获得了 b 的密码，&lt;a href=&quot;https://www.secpulse.com/archives/65503.html&quot; target=&quot;_blank&quot;&gt;https://www.secpulse.com/archives/65503.html&lt;/a&gt; 【脉搏译文系列】渗透师指南之 Responder。
&lt;a href=&quot;https://github.com/Kevin-Robertson/Inveigh&quot; target=&quot;_blank&quot;&gt;https://github.com/Kevin-Robertson/Inveigh&lt;/a&gt; 一款 PowerShell LLMNR / mDNS / NBNS 欺骗器和中间人工具
&lt;a href=&quot;https://github.com/LionSec/xerosploit&quot; target=&quot;_blank&quot;&gt;https://github.com/LionSec/xerosploit&lt;/a&gt; 中间人攻击测试工具包
&lt;a href=&quot;https://github.com/AlsidOfficial/WSUSpendu&quot; target=&quot;_blank&quot;&gt;https://github.com/AlsidOfficial/WSUSpendu&lt;/a&gt; 可以自主创建恶意更新，并将其注入到 WSUS 服务器数据库中，然后随意的分发这些恶意更新
&lt;a href=&quot;https://github.com/infobyte/evilgrade&quot; target=&quot;_blank&quot;&gt;https://github.com/infobyte/evilgrade&lt;/a&gt; 一个模块化的脚本框架，使攻击者在不知情的情况下将恶意更新注入到用户更新中
&lt;a href=&quot;https://github.com/quickbreach/smbetray&quot; target=&quot;_blank&quot;&gt;https://github.com/quickbreach/smbetray&lt;/a&gt; 专注于通过文件内容交换、lnk 交换来攻击客户端，以及窃取任何以明文形式传输的数据
&lt;a href=&quot;https://github.com/mrexodia/haxxmap&quot; target=&quot;_blank&quot;&gt;https://github.com/mrexodia/haxxmap&lt;/a&gt; 对 IMAP 服务器进行中间人攻击&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;协议解析流量还原分析&lt;a href=&quot;#协议解析流量还原分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/wireshark/wireshark&quot; target=&quot;_blank&quot;&gt;https://github.com/wireshark/wireshark&lt;/a&gt; 协议解析流量分析还原
&lt;a href=&quot;https://github.com/CoreSecurity/impacket&quot; target=&quot;_blank&quot;&gt;https://github.com/CoreSecurity/impacket&lt;/a&gt; Impacket 是用于处理网络协议的 Python 工具包集合，内网中可用以提权例如 wmiexec.py、NMB，SMB1-3 和 MS-DCERPC 提供对协议实现本身的低级别编程访问。
&lt;a href=&quot;https://github.com/secdev/scapy&quot; target=&quot;_blank&quot;&gt;https://github.com/secdev/scapy&lt;/a&gt; 内置了交互式网络数据包处理、数据包生成器、网络扫描器网络发现和包嗅探工具，提供多种协议包生成及解析插件，能够灵活的的生成协议数据包，并进行修改、解析。
&lt;a href=&quot;https://gitee.com/qielige/openQPA&quot; target=&quot;_blank&quot;&gt;https://gitee.com/qielige/openQPA&lt;/a&gt; 协议分析软件 QPA 的开源代码，特点是进程抓包、特征自动分析
&lt;a href=&quot;https://github.com/jtpereyda/boofuzz&quot; target=&quot;_blank&quot;&gt;https://github.com/jtpereyda/boofuzz&lt;/a&gt; 网络协议 fuzz 测试
&lt;a href=&quot;https://www.jianshu.com/p/4dca12a35158&quot; target=&quot;_blank&quot;&gt;https://www.jianshu.com/p/4dca12a35158&lt;/a&gt; 5 个常用的免费报文库
&lt;a href=&quot;https://github.com/zerbea/hcxdumptool&quot; target=&quot;_blank&quot;&gt;https://github.com/zerbea/hcxdumptool&lt;/a&gt; 从 Wlan 设备上捕获数据包
&lt;a href=&quot;https://github.com/NytroRST/NetRipper&quot; target=&quot;_blank&quot;&gt;https://github.com/NytroRST/NetRipper&lt;/a&gt; 支持截获像 putty,winscp,mssql,chrome,firefox,outlook，https 中的明文密码
&lt;a href=&quot;https://github.com/shramos/polymorph&quot; target=&quot;_blank&quot;&gt;https://github.com/shramos/polymorph&lt;/a&gt; 支持几乎所有现有协议的实时网络数据包操作框架
&lt;a href=&quot;https://github.com/nospaceships/raw-socket-sniffer&quot; target=&quot;_blank&quot;&gt;https://github.com/nospaceships/raw-socket-sniffer&lt;/a&gt; C,PS，无需驱动抓取 Windows 流量&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;无线网络 WIFI 中间人攻击&lt;a href=&quot;#无线网络-wifi-中间人攻击&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/wi-fi-analyzer/fluxion&quot; target=&quot;_blank&quot;&gt;https://github.com/wi-fi-analyzer/fluxion&lt;/a&gt; 窃取用户 wifi 密码的进行密码重放攻击
&lt;a href=&quot;https://github.com/0v3rl0w/e013&quot; target=&quot;_blank&quot;&gt;https://github.com/0v3rl0w/e013&lt;/a&gt; 窃取 Wifi 密码. VB 脚本
&lt;a href=&quot;https://github.com/cls1991/ng&quot; target=&quot;_blank&quot;&gt;https://github.com/cls1991/ng&lt;/a&gt; 获取你当前连接 wifi 的密码与 ip
&lt;a href=&quot;https://github.com/wifiphisher/wifiphisher&quot; target=&quot;_blank&quot;&gt;https://github.com/wifiphisher/wifiphisher&lt;/a&gt; PY,中间人攻击，FakeAp 恶意热点，WIFI 钓鱼，凭证窃取
&lt;a href=&quot;https://github.com/1N3/PRISM-AP&quot; target=&quot;_blank&quot;&gt;https://github.com/1N3/PRISM-AP&lt;/a&gt; 自动部署 RogueAP(恶意热点) MITM 攻击框架
&lt;a href=&quot;https://github.com/sensepost/mana&quot; target=&quot;_blank&quot;&gt;https://github.com/sensepost/mana&lt;/a&gt; Wifi 劫持工具，可以监听计算机或其他移动设备的 Wifi 通信，并能够模仿该设备
&lt;a href=&quot;https://github.com/deltaxflux/fluxion&quot; target=&quot;_blank&quot;&gt;https://github.com/deltaxflux/fluxion&lt;/a&gt; bash 与 py，对使用 wpa 协议的无线网络进行 MiTM 攻击
&lt;a href=&quot;https://github.com/DanMcInerney/LANs.py&quot; target=&quot;_blank&quot;&gt;https://github.com/DanMcInerney/LANs.py&lt;/a&gt; ARP 欺骗，无线网络劫持&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;无线网络 WIFI 防御&lt;a href=&quot;#无线网络-wifi-防御&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/SYWorks/waidps&quot; target=&quot;_blank&quot;&gt;https://github.com/SYWorks/waidps&lt;/a&gt; PY,Linux 下无线网络入侵检测工具
&lt;a href=&quot;https://github.com/SkypLabs/probequest&quot; target=&quot;_blank&quot;&gt;https://github.com/SkypLabs/probequest&lt;/a&gt; 嗅探和显示无线网卡附近的 Wifi Probe 请求
&lt;a href=&quot;https://github.com/wangshub/hmpa-pi&quot; target=&quot;_blank&quot;&gt;https://github.com/wangshub/hmpa-pi&lt;/a&gt; 在树莓派或路由，利用 Wireshark 扫描附近网络 WiFi 设备，当有手机或其它 Wi-Fi 设备在附近时，通过邮件或者微信提醒
&lt;a href=&quot;https://github.com/besimaltnok/PiFinger&quot; target=&quot;_blank&quot;&gt;https://github.com/besimaltnok/PiFinger&lt;/a&gt; 检查 wifi 是否为”Wifi-Pineapple 大菠萝”所开放的恶意热点
&lt;a href=&quot;https://github.com/WiPi-Hunter/PiSavar&quot; target=&quot;_blank&quot;&gt;https://github.com/WiPi-Hunter/PiSavar&lt;/a&gt; 利用 PineAP，对于 FAKE AP 虚假接入点，如”Wifi-Pineapple 大菠萝”进行监测&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;无线网络 WIFI 审计测试&lt;a href=&quot;#无线网络-wifi-审计测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.wifislax.com&quot; target=&quot;_blank&quot;&gt;https://www.wifislax.com&lt;/a&gt; 西班牙 wifi 审计系统，国内汉化版为无线革新 5.1.1 Wifislax-WRC
&lt;a href=&quot;https://cn.elcomsoft.com/ewsa.html&quot; target=&quot;_blank&quot;&gt;https://cn.elcomsoft.com/ewsa.html&lt;/a&gt; ewsa，wifi 嗅探，握手包密码还原，EWSA-173-HC1UW-L3EGT-FFJ3O-SOQB3
&lt;a href=&quot;https://www.passcape.com&quot; target=&quot;_blank&quot;&gt;https://www.passcape.com&lt;/a&gt; wifipr，握手包密码还原，另外还有许多商业版 windows 下密码还原工具
&lt;a href=&quot;https://github.com/MisterBianco/BoopSuite&quot; target=&quot;_blank&quot;&gt;https://github.com/MisterBianco/BoopSuite&lt;/a&gt; 无线网络审计工具，支持 2-5GHZ 频段
&lt;a href=&quot;https://github.com/aircrack-ng/aircrack-ng&quot; target=&quot;_blank&quot;&gt;https://github.com/aircrack-ng/aircrack-ng&lt;/a&gt; 由数据包嗅探器、检测器、WPA / WPA2-PSK 解密器、WEP 和用于 802.11 无线局域网的分析工具组成
&lt;a href=&quot;https://github.com/t6x/reaver-wps-fork-t6x&quot; target=&quot;_blank&quot;&gt;https://github.com/t6x/reaver-wps-fork-t6x&lt;/a&gt; wps 跑 pin 码攻击，常见 wifi 攻击
&lt;a href=&quot;https://github.com/derv82/wifite2&quot; target=&quot;_blank&quot;&gt;https://github.com/derv82/wifite2&lt;/a&gt; wifite 无线审计工具升级版，联动 aircrack-ng 与 reaver
&lt;a href=&quot;https://github.com/savio-code/fern-wifi-cracker&quot; target=&quot;_blank&quot;&gt;https://github.com/savio-code/fern-wifi-cracker&lt;/a&gt; 无线安全审计工具
&lt;a href=&quot;https://github.com/P0cL4bs/WiFi-Pumpkin&quot; target=&quot;_blank&quot;&gt;https://github.com/P0cL4bs/WiFi-Pumpkin&lt;/a&gt; 无线安全渗透测试套件
&lt;a href=&quot;https://github.com/entropy1337/infernal-twin&quot; target=&quot;_blank&quot;&gt;https://github.com/entropy1337/infernal-twin&lt;/a&gt; 自动化无线攻击工具 Infernal-Wireless
&lt;a href=&quot;https://github.com/m4n3dw0lf/PytheM&quot; target=&quot;_blank&quot;&gt;https://github.com/m4n3dw0lf/PytheM&lt;/a&gt; Python 网络/渗透测试工具
&lt;a href=&quot;https://github.com/InfamousSYN/rogue&quot; target=&quot;_blank&quot;&gt;https://github.com/InfamousSYN/rogue&lt;/a&gt; 无线网络攻击工具包
&lt;a href=&quot;https://github.com/cSploit/android&quot; target=&quot;_blank&quot;&gt;https://github.com/cSploit/android&lt;/a&gt; 手机 WiFi 渗透工具框架，可以使用 msf
&lt;a href=&quot;https://github.com/chrisk44/Hijacker&quot; target=&quot;_blank&quot;&gt;https://github.com/chrisk44/Hijacker&lt;/a&gt; 手机 wifi 测试工具
&lt;a href=&quot;https://andrax-pentest.org/&quot; target=&quot;_blank&quot;&gt;https://andrax-pentest.org/&lt;/a&gt; kali hunter 手机渗透测试系统
&lt;a href=&quot;https://www.zimperium.com/zanti-mobile-penetration-testing&quot; target=&quot;_blank&quot;&gt;https://www.zimperium.com/zanti-mobile-penetration-testing&lt;/a&gt; 手机 wifi 渗透工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;数据取回隐秘传输&lt;a href=&quot;#数据取回隐秘传输&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/TryCatchHCF/Cloakify&quot; target=&quot;_blank&quot;&gt;https://github.com/TryCatchHCF/Cloakify&lt;/a&gt; 躲避 DLP/MLS 数据泄露防护系统，突破数据白名单控制，躲避 AV 检测进行数据盗取
&lt;a href=&quot;https://github.com/sensepost/DET&quot; target=&quot;_blank&quot;&gt;https://github.com/sensepost/DET&lt;/a&gt; 使用单个或多个通道同时执行数据取回
&lt;a href=&quot;https://github.com/Arno0x/DNSExfiltrator&quot; target=&quot;_blank&quot;&gt;https://github.com/Arno0x/DNSExfiltrator&lt;/a&gt; 利用 DNS 解析进行数据隐秘传输的工具
&lt;a href=&quot;https://github.com/ytisf/PyExfil&quot; target=&quot;_blank&quot;&gt;https://github.com/ytisf/PyExfil&lt;/a&gt; 用于数据取回的 Python 软件包
&lt;a href=&quot;https://github.com/Arno0x/ReflectiveDnsExfiltrator&quot; target=&quot;_blank&quot;&gt;https://github.com/Arno0x/ReflectiveDnsExfiltrator&lt;/a&gt; 反射 DNS 解析隐蔽通道进行数据泄露&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;硬件安全&lt;a href=&quot;#硬件安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/unprovable/PentestHardware&quot; target=&quot;_blank&quot;&gt;https://github.com/unprovable/PentestHardware&lt;/a&gt; 硬件渗透测试实用手册
&lt;a href=&quot;https://ducktoolkit.com/&quot; target=&quot;_blank&quot;&gt;https://ducktoolkit.com/&lt;/a&gt; 橡皮鸭、HID 键盘模拟器
&lt;a href=&quot;https://github.com/insecurityofthings/jackit&quot; target=&quot;_blank&quot;&gt;https://github.com/insecurityofthings/jackit&lt;/a&gt; 用于 Mousejack 的开发代码
&lt;a href=&quot;https://github.com/samyk/magspoof&quot; target=&quot;_blank&quot;&gt;https://github.com/samyk/magspoof&lt;/a&gt; 信用卡信息盗取
&lt;a href=&quot;https://github.com/mame82/P4wnP1_aloa&quot; target=&quot;_blank&quot;&gt;https://github.com/mame82/P4wnP1_aloa&lt;/a&gt; 在树莓派 Raspberry Pi 上安装常用的测试组件，打造移动测试平台
&lt;a href=&quot;https://www.freebuf.com/geek/195631.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/geek/195631.html&lt;/a&gt; 成为物理黑客吧！利用树莓派实现 P4wnP1 项目进行渗透测试
&lt;a href=&quot;https://github.com/mame82/P4wnP1&quot; target=&quot;_blank&quot;&gt;https://github.com/mame82/P4wnP1&lt;/a&gt; 在树莓派安装网络劫持键盘注入(WHID)工具
&lt;a href=&quot;https://github.com/ebursztein/malusb&quot; target=&quot;_blank&quot;&gt;https://github.com/ebursztein/malusb&lt;/a&gt; 创建跨平台的 HID 欺骗 payload，并在 Windows 和 OSX 上建立反向 TCP-shell
&lt;a href=&quot;https://github.com/Orange-Cyberdefense/fenrir-ocd&quot; target=&quot;_blank&quot;&gt;https://github.com/Orange-Cyberdefense/fenrir-ocd&lt;/a&gt; 主要功能和用途是绕过有线 802.1x 保护并使你能够访问目标网络
&lt;a href=&quot;https://github.com/360PegasusTeam/GhostTunnel&quot; target=&quot;_blank&quot;&gt;https://github.com/360PegasusTeam/GhostTunnel&lt;/a&gt; 可在隔离环境下使用 HID 生成隐蔽后门，释放有效负载后删除自身
&lt;a href=&quot;https://github.com/LennyLeng/RadioEye&quot; target=&quot;_blank&quot;&gt;https://github.com/LennyLeng/RadioEye&lt;/a&gt; RFID 配合常见的 NFC 使用
&lt;a href=&quot;https://github.com/Proxmark/proxmark3/&quot; target=&quot;_blank&quot;&gt;https://github.com/Proxmark/proxmark3/&lt;/a&gt; RFID 神器 PM3
&lt;a href=&quot;http://www.freebuf.com/news/others/605.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/news/others/605.html&lt;/a&gt; RFID Hacking–资源大合集
&lt;a href=&quot;https://github.com/UnicornTeam/HackCube-Special&quot; target=&quot;_blank&quot;&gt;https://github.com/UnicornTeam/HackCube-Special&lt;/a&gt; 独角兽实验室硬件渗透测试平台&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;IoT 安全&lt;a href=&quot;#iot-安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/w3h/icsmaster&quot; target=&quot;_blank&quot;&gt;https://github.com/w3h/icsmaster&lt;/a&gt; 整合工控安全资源
&lt;a href=&quot;https://github.com/V33RU/IoTSecurity101&quot; target=&quot;_blank&quot;&gt;https://github.com/V33RU/IoTSecurity101&lt;/a&gt; IoT 工控安全与物联网安全学习的一些文章和资源
&lt;a href=&quot;http://www.freebuf.com/ics-articles&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/ics-articles&lt;/a&gt; 工控相关
&lt;a href=&quot;http://www.freebuf.com/sectool/174567.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/sectool/174567.html&lt;/a&gt; 工业控制系统（ICS）安全专家必备的测试工具和安全资源
&lt;a href=&quot;http://www.freebuf.com/articles/ics-articles/178822.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/ics-articles/178822.html&lt;/a&gt; 浅析煤炭企业如何进行工控安全建设
&lt;a href=&quot;http://www.freebuf.com/articles/network/178251.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/network/178251.html&lt;/a&gt; 工控安全现场实施经验谈之工控系统如何加强主机防护
&lt;a href=&quot;https://github.com/hslatman/awesome-industrial-control-system-security&quot; target=&quot;_blank&quot;&gt;https://github.com/hslatman/awesome-industrial-control-system-security&lt;/a&gt; 工控系统安全方向优秀资源收集仓库
&lt;a href=&quot;https://github.com/adi0x90/attifyos&quot; target=&quot;_blank&quot;&gt;https://github.com/adi0x90/attifyos&lt;/a&gt; IoT 集成安全测试系统，带有一些常用的软件
&lt;a href=&quot;https://github.com/moki-ics/moki&quot; target=&quot;_blank&quot;&gt;https://github.com/moki-ics/moki&lt;/a&gt; 一键配置类似 kali 的工控渗透测试系统的脚本，
&lt;a href=&quot;https://gitlab.com/expliot_framework/expliot&quot; target=&quot;_blank&quot;&gt;https://gitlab.com/expliot_framework/expliot&lt;/a&gt; py3，工控安全漏洞测试框架
&lt;a href=&quot;https://github.com/dark-lbp/isf&quot; target=&quot;_blank&quot;&gt;https://github.com/dark-lbp/isf&lt;/a&gt; py2,工控中类似 msf 的测试框架
&lt;a href=&quot;https://github.com/enddo/smod&quot; target=&quot;_blank&quot;&gt;https://github.com/enddo/smod&lt;/a&gt; py2，使用了 scapy 模块，主要针对 modbus 协议测试
&lt;a href=&quot;https://github.com/shodan-labs/iotdb&quot; target=&quot;_blank&quot;&gt;https://github.com/shodan-labs/iotdb&lt;/a&gt; nmap 配合 shodan API 扫描 IoT 设备
&lt;a href=&quot;https://github.com/XHermitOne/icscanner&quot; target=&quot;_blank&quot;&gt;https://github.com/XHermitOne/icscanner&lt;/a&gt; 带界面的 ics 扫描器
&lt;a href=&quot;https://github.com/yanlinlin82/plcscan&quot; target=&quot;_blank&quot;&gt;https://github.com/yanlinlin82/plcscan&lt;/a&gt; 通过 TCP/102 和 TCP/502 识别互联网上 PLC 设备和其他 Modbus 设备
&lt;a href=&quot;https://github.com/nsacyber/GRASSMARLIN&quot; target=&quot;_blank&quot;&gt;https://github.com/nsacyber/GRASSMARLIN&lt;/a&gt; NSA 旗下 ICS/SCADA 态势感知
&lt;a href=&quot;https://github.com/nezza/scada-stuff&quot; target=&quot;_blank&quot;&gt;https://github.com/nezza/scada-stuff&lt;/a&gt; 对 SCADA/ICS 设备进行逆向与攻击&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;摄像头安全&lt;a href=&quot;#摄像头安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/woj-ciech/kamerka&quot; target=&quot;_blank&quot;&gt;https://github.com/woj-ciech/kamerka&lt;/a&gt; 配合 shodan API 扫描到的摄像头地理位置显示在地图上
&lt;a href=&quot;https://github.com/Ullaakut/cameradar&quot; target=&quot;_blank&quot;&gt;https://github.com/Ullaakut/cameradar&lt;/a&gt; GO,针对摄像头 RTSP 协议渗透测试，附弱口令字典
&lt;a href=&quot;https://github.com/Ullaakut/camerattack&quot; target=&quot;_blank&quot;&gt;https://github.com/Ullaakut/camerattack&lt;/a&gt; GO,摄像头远程禁用
&lt;a href=&quot;https://github.com/NIteshx2/UltimateSecurityCam&quot; target=&quot;_blank&quot;&gt;https://github.com/NIteshx2/UltimateSecurityCam&lt;/a&gt; py3，摄像头监测外来人员软件，有防欺骗设置&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;路由安全&lt;a href=&quot;#路由安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://stascorp.com&quot; target=&quot;_blank&quot;&gt;http://stascorp.com&lt;/a&gt; RouterScan 毛子开发的路由器漏洞利用工具，界面化很强大
&lt;a href=&quot;https://github.com/threat9/routersploit&quot; target=&quot;_blank&quot;&gt;https://github.com/threat9/routersploit&lt;/a&gt; py3，仿 msf 路由器漏洞利用框架
&lt;a href=&quot;https://github.com/jh00nbr/Routerhunter-2.0&quot; target=&quot;_blank&quot;&gt;https://github.com/jh00nbr/Routerhunter-2.0&lt;/a&gt; 已停止更新，路由器漏洞扫描利用
&lt;a href=&quot;https://github.com/googleinurl/RouterHunterBR&quot; target=&quot;_blank&quot;&gt;https://github.com/googleinurl/RouterHunterBR&lt;/a&gt; php，路由器设备漏洞扫描利用
&lt;a href=&quot;https://github.com/scu-igroup/telnet-scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/scu-igroup/telnet-scanner&lt;/a&gt; Telnet 服务密码撞库&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;物联网安全&lt;a href=&quot;#物联网安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/RUB-NDS/PRET&quot; target=&quot;_blank&quot;&gt;https://github.com/RUB-NDS/PRET&lt;/a&gt; 打印机攻击框架
&lt;a href=&quot;https://github.com/rapid7/IoTSeeker&quot; target=&quot;_blank&quot;&gt;https://github.com/rapid7/IoTSeeker&lt;/a&gt; 物联网设备默认密码扫描检测工具
&lt;a href=&quot;https://github.com/schutzwerk/CANalyzat0r&quot; target=&quot;_blank&quot;&gt;https://github.com/schutzwerk/CANalyzat0r&lt;/a&gt; 专有汽车协议的安全分析工具包
&lt;a href=&quot;https://github.com/pasta-auto&quot; target=&quot;_blank&quot;&gt;https://github.com/pasta-auto&lt;/a&gt; 智能汽车测试&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Fuzz 模糊测试漏洞挖掘&lt;a href=&quot;#fuzz-模糊测试漏洞挖掘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.freebuf.com/articles/rookie/169413.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/rookie/169413.html&lt;/a&gt; 一系列用于 Fuzzing 学习的资源汇总
&lt;a href=&quot;https://github.com/secfigo/Awesome-Fuzzing&quot; target=&quot;_blank&quot;&gt;https://github.com/secfigo/Awesome-Fuzzing&lt;/a&gt; Fuzz 相关学习资料
&lt;a href=&quot;https://github.com/fuzzdb-project/fuzzdb&quot; target=&quot;_blank&quot;&gt;https://github.com/fuzzdb-project/fuzzdb&lt;/a&gt; fuzz 资料数据库
&lt;a href=&quot;https://github.com/ivanfratric/winafl&quot; target=&quot;_blank&quot;&gt;https://github.com/ivanfratric/winafl&lt;/a&gt; AFL for fuzzing Windows binaries,原创技术分析 | AFL 漏洞挖掘技术漫谈
&lt;a href=&quot;https://github.com/attekett/NodeFuzz&quot; target=&quot;_blank&quot;&gt;https://github.com/attekett/NodeFuzz&lt;/a&gt; a fuzzer harness for web browsers and browser like applications.
&lt;a href=&quot;https://github.com/google/oss-fuzz&quot; target=&quot;_blank&quot;&gt;https://github.com/google/oss-fuzz&lt;/a&gt; Continuous Fuzzing for Open Source Software
&lt;a href=&quot;http://blog.topsec.com.cn/ad_lab/alphafuzzer/&quot; target=&quot;_blank&quot;&gt;http://blog.topsec.com.cn/ad_lab/alphafuzzer/&lt;/a&gt; 以文件格式为主的漏洞挖掘工具
&lt;a href=&quot;https://bbs.ichunqiu.com/thread-24898-1-1.html&quot; target=&quot;_blank&quot;&gt;https://bbs.ichunqiu.com/thread-24898-1-1.html&lt;/a&gt; Test404 -HTTP Fuzzer V3.0
&lt;a href=&quot;https://github.com/xmendez/wfuzz&quot; target=&quot;_blank&quot;&gt;https://github.com/xmendez/wfuzz&lt;/a&gt; py，Web 安全模糊测试工具，模块化可处理 burp 所抓请求和响应报文
&lt;a href=&quot;https://github.com/1N3/BlackWidow&quot; target=&quot;_blank&quot;&gt;https://github.com/1N3/BlackWidow&lt;/a&gt; 基于 Python 实现的 Web 爬虫，用于收集目标网站的情报信息并对 OWASP 漏洞进行模糊测试
&lt;a href=&quot;https://github.com/bunzen/pySSDeep&quot; target=&quot;_blank&quot;&gt;https://github.com/bunzen/pySSDeep&lt;/a&gt; py，一个基于模糊哈希（Fuzzy Hashing）算法的工具。go，glaslos/ssdeep；C，ssdeep-project/ssdeep
&lt;a href=&quot;https://github.com/googleprojectzero/winafl&quot; target=&quot;_blank&quot;&gt;https://github.com/googleprojectzero/winafl&lt;/a&gt; AFL 针对 Windows 二进制进行测试&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;安全防护&lt;a href=&quot;#安全防护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/baidu/AdvBox&quot; target=&quot;_blank&quot;&gt;https://github.com/baidu/AdvBox&lt;/a&gt; Advbox 是支持多种深度学习平台的 AI 模型安全工具箱，既支持白盒和黑盒算法生成对抗样本，衡量 AI 模型鲁棒性，也支持# 常见的防御算法
&lt;a href=&quot;https://github.com/quoscient/octopus&quot; target=&quot;_blank&quot;&gt;https://github.com/quoscient/octopus&lt;/a&gt; 区块链智能合约安全分析工具
&lt;a href=&quot;https://github.com/Cyb3rWard0g/HELK&quot; target=&quot;_blank&quot;&gt;https://github.com/Cyb3rWard0g/HELK&lt;/a&gt; 具有高级分析功能的威胁狩猎 ELK
&lt;a href=&quot;https://github.com/trimstray/otseca&quot; target=&quot;_blank&quot;&gt;https://github.com/trimstray/otseca&lt;/a&gt; linux 系统审计工具，可以导出系统配置，生成报表
&lt;a href=&quot;https://github.com/BugScanTeam/DNSLog&quot; target=&quot;_blank&quot;&gt;https://github.com/BugScanTeam/DNSLog&lt;/a&gt; 一款基于 django 监控 DNS 解析记录和 HTTP 访问记录的工具，可以配合盲注、xss、解析对方真实 ip 使用
&lt;a href=&quot;https://github.com/mwrlabs/dref&quot; target=&quot;_blank&quot;&gt;https://github.com/mwrlabs/dref&lt;/a&gt; DNS 重绑定利用框架
&lt;a href=&quot;https://github.com/chengr28/Pcap_DNSProxy/blob/master/README.zh-Hans.md&quot; target=&quot;_blank&quot;&gt;https://github.com/chengr28/Pcap_DNSProxy/blob/master/README.zh-Hans.md&lt;/a&gt; Pcap_DNSProxy 是一个基于 WinPcap/LibPcap 用于过滤 DNS 投毒污染的工具
&lt;a href=&quot;https://github.com/PlagueScanner/PlagueScanner&quot; target=&quot;_blank&quot;&gt;https://github.com/PlagueScanner/PlagueScanner&lt;/a&gt; 使用 python 实现的集成 ClamAV、ESET、Bitdefender 的反病毒引擎
&lt;a href=&quot;https://github.com/m4rco-/dorothy2&quot; target=&quot;_blank&quot;&gt;https://github.com/m4rco-/dorothy2&lt;/a&gt; 一款木马、僵尸网络分析框架
&lt;a href=&quot;http://github.com/jumpserver/jumpserver&quot; target=&quot;_blank&quot;&gt;http://github.com/jumpserver/jumpserver&lt;/a&gt; 基于 Python3 的开源堡垒机
&lt;a href=&quot;https://github.com/github/glb-director&quot; target=&quot;_blank&quot;&gt;https://github.com/github/glb-director&lt;/a&gt; 负载均衡组件 GLB，数据解析使用了 dpdk
&lt;a href=&quot;https://github.com/processhacker/processhacker&quot; target=&quot;_blank&quot;&gt;https://github.com/processhacker/processhacker&lt;/a&gt; 监控系统资源、软件调试、检测恶意软件，管理进程
&lt;a href=&quot;https://github.com/TKCERT/mail-security-tester&quot; target=&quot;_blank&quot;&gt;https://github.com/TKCERT/mail-security-tester&lt;/a&gt; 检测邮件防护与过滤系统的测试框架
&lt;a href=&quot;https://github.com/chaitin/sqlchop-http-proxy&quot; target=&quot;_blank&quot;&gt;https://github.com/chaitin/sqlchop-http-proxy&lt;/a&gt; 利用 HTTP 反向代理，内置 SQLChop 作为 SQL 注入攻击检测模块，可以拦截 SQL 注入流量而放行正常流量
&lt;a href=&quot;https://github.com/OWASP/SecureTea-Project&quot; target=&quot;_blank&quot;&gt;https://github.com/OWASP/SecureTea-Project&lt;/a&gt; 当有人私自触碰电脑鼠标或触摸板，进行报警&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;代码审计应用测试&lt;a href=&quot;#代码审计应用测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.waitalone.cn/seay-source-code-auditv2.html&quot; target=&quot;_blank&quot;&gt;https://www.waitalone.cn/seay-source-code-auditv2.html&lt;/a&gt; Seay 源代码审计系统 2.1 版本
&lt;a href=&quot;https://github.com/pyupio/safety&quot; target=&quot;_blank&quot;&gt;https://github.com/pyupio/safety&lt;/a&gt; 检查所有已安装 Python 包, 查找已知的安全漏洞
&lt;a href=&quot;https://github.com/pumasecurity/puma-scan&quot; target=&quot;_blank&quot;&gt;https://github.com/pumasecurity/puma-scan&lt;/a&gt; 实时代码审计，vs 插件
&lt;a href=&quot;https://github.com/wufeifei/cobra&quot; target=&quot;_blank&quot;&gt;https://github.com/wufeifei/cobra&lt;/a&gt; 白盒代码安全审计系统
&lt;a href=&quot;https://github.com/OneSourceCat/phpvulhunter&quot; target=&quot;_blank&quot;&gt;https://github.com/OneSourceCat/phpvulhunter&lt;/a&gt; 静态 php 代码审计
&lt;a href=&quot;https://github.com/ripsscanner/rips&quot; target=&quot;_blank&quot;&gt;https://github.com/ripsscanner/rips&lt;/a&gt; 基于 php 的 php 代码审计工具
&lt;a href=&quot;https://github.com/Qihoo360/phptrace&quot; target=&quot;_blank&quot;&gt;https://github.com/Qihoo360/phptrace&lt;/a&gt; 跟踪、分析 PHP 运行情况的工具
&lt;a href=&quot;https://github.com/ajinabraham/NodeJsScan&quot; target=&quot;_blank&quot;&gt;https://github.com/ajinabraham/NodeJsScan&lt;/a&gt; Node.JS 应用代码审计
&lt;a href=&quot;https://github.com/ctxis/beemka&quot; target=&quot;_blank&quot;&gt;https://github.com/ctxis/beemka&lt;/a&gt; 针对 Electron App 的漏洞利用工具包
&lt;a href=&quot;https://github.com/doyensec/electronegativity&quot; target=&quot;_blank&quot;&gt;https://github.com/doyensec/electronegativity&lt;/a&gt; Electron 应用代码审计，App 的错误配置和安全问题
&lt;a href=&quot;https://github.com/shengqi158/pyvulhunter&quot; target=&quot;_blank&quot;&gt;https://github.com/shengqi158/pyvulhunter&lt;/a&gt; Python 应用审计
&lt;a href=&quot;https://github.com/securego/gosec&quot; target=&quot;_blank&quot;&gt;https://github.com/securego/gosec&lt;/a&gt; Go 语言源码安全分析工具
&lt;a href=&quot;https://github.com/GoSSIP-SJTU/TripleDoggy&quot; target=&quot;_blank&quot;&gt;https://github.com/GoSSIP-SJTU/TripleDoggy&lt;/a&gt; 基于 clang 的 c/c++/object-c 源代码检测框架，有大量接口可以被调用
&lt;a href=&quot;https://github.com/ga0/pyprotect&quot; target=&quot;_blank&quot;&gt;https://github.com/ga0/pyprotect&lt;/a&gt; 给 python 代码加密，防止逆向
&lt;a href=&quot;https://github.com/presidentbeef/brakeman&quot; target=&quot;_blank&quot;&gt;https://github.com/presidentbeef/brakeman&lt;/a&gt; Ruby on Rails 应用静态代码分析
&lt;a href=&quot;https://github.com/python-security/pyt&quot; target=&quot;_blank&quot;&gt;https://github.com/python-security/pyt&lt;/a&gt; 用于检测 Python Web 应用程序中的安全漏洞的静态分析工具
&lt;a href=&quot;https://github.com/m4ll0k/WPSploit&quot; target=&quot;_blank&quot;&gt;https://github.com/m4ll0k/WPSploit&lt;/a&gt; WordPress 插件代码安全审计
&lt;a href=&quot;https://github.com/elcodigok/wphardening&quot; target=&quot;_blank&quot;&gt;https://github.com/elcodigok/wphardening&lt;/a&gt; 加强任何 WordPress 安装的安全&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;大数据平台安全&lt;a href=&quot;#大数据平台安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/shouc/BDA&quot; target=&quot;_blank&quot;&gt;https://github.com/shouc/BDA&lt;/a&gt; 针对 hadoop/spark/mysql 等大数据平台的审计与检测
&lt;a href=&quot;https://github.com/wavestone-cdt/hadoop-attack-library&quot; target=&quot;_blank&quot;&gt;https://github.com/wavestone-cdt/hadoop-attack-library&lt;/a&gt; hadoop 测试方式和工具集&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;蜜罐安全&lt;a href=&quot;#蜜罐安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/paralax/awesome-honeypots&quot; target=&quot;_blank&quot;&gt;https://github.com/paralax/awesome-honeypots&lt;/a&gt; 蜜罐开源技术收集
&lt;a href=&quot;https://github.com/threatstream/mhn&quot; target=&quot;_blank&quot;&gt;https://github.com/threatstream/mhn&lt;/a&gt; 现代蜜网，集成了多种蜜罐的安装脚本，可以快速部署、使用，也能够快速的从节点收集数据
&lt;a href=&quot;https://github.com/dtag-dev-sec/tpotce&quot; target=&quot;_blank&quot;&gt;https://github.com/dtag-dev-sec/tpotce&lt;/a&gt; T-POT，里面使用 docker 技术实现多个蜜罐组合，配合 ELK 进行研究与数据捕获
&lt;a href=&quot;https://www.freebuf.com/sectool/190840.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/sectool/190840.html&lt;/a&gt; T-Pot 多蜜罐平台使用心法
&lt;a href=&quot;https://github.com/n3uz/t-pot-autoinstall&quot; target=&quot;_blank&quot;&gt;https://github.com/n3uz/t-pot-autoinstall&lt;/a&gt; 将 fork 的 T-POT 蜜罐的一键安装脚本替换为国内加速镜像&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;Web 蜜罐内网监测&lt;a href=&quot;#web-蜜罐内网监测&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/micheloosterhof/cowrie&quot; target=&quot;_blank&quot;&gt;https://github.com/micheloosterhof/cowrie&lt;/a&gt; py2，使用 ELK（ElasticSearch，LogStash，Kibana）进行数据分析，目前支持 ssh，telnet，sftp 等协议
&lt;a href=&quot;https://github.com/mushorg/snare&quot; target=&quot;_blank&quot;&gt;https://github.com/mushorg/snare&lt;/a&gt; py3，web 安全蜜罐，可克隆指定 Web 页面
&lt;a href=&quot;https://github.com/honeynet/beeswarm&quot; target=&quot;_blank&quot;&gt;https://github.com/honeynet/beeswarm&lt;/a&gt; py，使用 agent 探针与蜜罐进行实时交互来引诱攻击者
&lt;a href=&quot;https://github.com/thinkst/opencanary&quot; target=&quot;_blank&quot;&gt;https://github.com/thinkst/opencanary&lt;/a&gt; PY2,SNMP\RDP\SAMBA 蜜罐
&lt;a href=&quot;https://github.com/p1r06u3/opencanary_web&quot; target=&quot;_blank&quot;&gt;https://github.com/p1r06u3/opencanary_web&lt;/a&gt; PY,TORNADO,内网低交互蜜罐。支持自动化安装，目前支持常见的 16 中协议，现为探针/蜜罐-管理的架构，可以考虑二次开发为探针-沙盒-管理的架构
&lt;a href=&quot;https://github.com/p1r06u3/opencanary_web&quot; target=&quot;_blank&quot;&gt;https://github.com/p1r06u3/opencanary_web&lt;/a&gt;
&lt;a href=&quot;https://github.com/Cymmetria&quot; target=&quot;_blank&quot;&gt;https://github.com/Cymmetria&lt;/a&gt; 知名欺骗防御蜜罐组织。Struct、weblogic、telnet、Cisco ASA、Micros 等仿真蜜罐
&lt;a href=&quot;https://github.com/Cymmetria/honeycomb&quot; target=&quot;_blank&quot;&gt;https://github.com/Cymmetria/honeycomb&lt;/a&gt; Cymmetria 公司开源蜜罐框架，低交互
&lt;a href=&quot;https://github.com/honeytrap/honeytrap&quot; target=&quot;_blank&quot;&gt;https://github.com/honeytrap/honeytrap&lt;/a&gt; 可扩展蜜罐框架，支持探针部署与高交互蜜罐
&lt;a href=&quot;https://gosecure.net/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera/&quot; target=&quot;_blank&quot;&gt;https://gosecure.net/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera/&lt;/a&gt; RDP MITM，打造可记录图像和按键的 RDP 蜜罐（&lt;a href=&quot;https://github.com/gosecure/pyrdp%EF%BC%89&quot; target=&quot;_blank&quot;&gt;https://github.com/gosecure/pyrdp）&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;摄像头蜜罐&lt;a href=&quot;#摄像头蜜罐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/alexbredo/honeypot-camera&quot; target=&quot;_blank&quot;&gt;https://github.com/alexbredo/honeypot-camera&lt;/a&gt; py，摄像头蜜罐。tornado 模拟 WEB 服务，图片代替视频，可以考虑后期多加点图片和按钮
&lt;a href=&quot;https://github.com/EasyDarwin/EasyIPCamera&quot; target=&quot;_blank&quot;&gt;https://github.com/EasyDarwin/EasyIPCamera&lt;/a&gt; C，RTSP 服务器组件用以构建摄像头蜜罐&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;工控蜜罐&lt;a href=&quot;#工控蜜罐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/sjhilt/GasPot&quot; target=&quot;_blank&quot;&gt;https://github.com/sjhilt/GasPot&lt;/a&gt; 模拟油电燃气工控系统
&lt;a href=&quot;https://github.com/djformby/GRFICS&quot; target=&quot;_blank&quot;&gt;https://github.com/djformby/GRFICS&lt;/a&gt; IoT 工业仿真系统模拟框架，采用 MODBUS 协议对 PLC 虚拟机监视和控制
&lt;a href=&quot;https://github.com/RabitW/IoTSecurityNAT&quot; target=&quot;_blank&quot;&gt;https://github.com/RabitW/IoTSecurityNAT&lt;/a&gt; IoT 测试系统，方便快速接入各种设备，进行安全测试
&lt;a href=&quot;https://github.com/mushorg/conpot&quot; target=&quot;_blank&quot;&gt;https://github.com/mushorg/conpot&lt;/a&gt; 针对 ICS/SCADA 的低交互工控蜜罐，模拟 Modbus 和 S7comm&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;逆向相关&lt;a href=&quot;#逆向相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.peerlyst.com/posts/resource-learning-how-to-reverse-malware-a-guide&quot; target=&quot;_blank&quot;&gt;https://www.peerlyst.com/posts/resource-learning-how-to-reverse-malware-a-guide&lt;/a&gt; 恶意软件逆向指南和工具的集合
&lt;a href=&quot;https://github.com/ReFirmLabs/binwalk&quot; target=&quot;_blank&quot;&gt;https://github.com/ReFirmLabs/binwalk&lt;/a&gt; 二进制 pwn 文件自动化逆向，拥有多种插件
&lt;a href=&quot;https://github.com/angr/angr&quot; target=&quot;_blank&quot;&gt;https://github.com/angr/angr&lt;/a&gt; 一个具有动态符号执行和静态分析的二进制分析工具
&lt;a href=&quot;https://github.com/endgameinc/xori&quot; target=&quot;_blank&quot;&gt;https://github.com/endgameinc/xori&lt;/a&gt; 自定义反汇编框架
&lt;a href=&quot;https://down.52pojie.cn/&quot; target=&quot;_blank&quot;&gt;https://down.52pojie.cn/&lt;/a&gt; 吾爱破解爱盘工具包
&lt;a href=&quot;https://github.com/blacknbunny/peanalyzer32&quot; target=&quot;_blank&quot;&gt;https://github.com/blacknbunny/peanalyzer32&lt;/a&gt; PE 文件分析和反汇编工具
&lt;a href=&quot;https://github.com/DominicBreuker/pspy&quot; target=&quot;_blank&quot;&gt;https://github.com/DominicBreuker/pspy&lt;/a&gt; 不用 root 权限就可以监控进程运行&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;CTF 相关&lt;a href=&quot;#ctf-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://ctf-wiki.github.io/ctf-wiki/&quot; target=&quot;_blank&quot;&gt;https://ctf-wiki.github.io/ctf-wiki/&lt;/a&gt; CTFwiki，Misc/Crypto/Web/Assembly/Executable/Reverse/Pwn/Android/ICS
&lt;a href=&quot;https://github.com/adon90/pentest_compilation&quot; target=&quot;_blank&quot;&gt;https://github.com/adon90/pentest_compilation&lt;/a&gt; ctf 比赛与 OSCP 考试中常见的知识点和命令
&lt;a href=&quot;https://github.com/gabemarshall/microctfs&quot; target=&quot;_blank&quot;&gt;https://github.com/gabemarshall/microctfs&lt;/a&gt; 小型 ctf 镜像 docker
&lt;a href=&quot;https://github.com/giantbranch/pwn_deploy_chroot&quot; target=&quot;_blank&quot;&gt;https://github.com/giantbranch/pwn_deploy_chroot&lt;/a&gt; 部署多个 pwn 题到一个 docker 容器中
&lt;a href=&quot;https://github.com/facebook/fbctf&quot; target=&quot;_blank&quot;&gt;https://github.com/facebook/fbctf&lt;/a&gt; CTF 比赛框架
&lt;a href=&quot;https://github.com/0Chencc/CTFCrackTools&quot; target=&quot;_blank&quot;&gt;https://github.com/0Chencc/CTFCrackTools&lt;/a&gt; CTF 工具集成包
&lt;a href=&quot;https://github.com/guyoung/CaptfEncoder&quot; target=&quot;_blank&quot;&gt;https://github.com/guyoung/CaptfEncoder&lt;/a&gt; CTF 密码编码全家桶，还有小程序版本
&lt;a href=&quot;https://github.com/Gallopsled/pwntools&quot; target=&quot;_blank&quot;&gt;https://github.com/Gallopsled/pwntools&lt;/a&gt; pwn 类型，二进制利用框架
&lt;a href=&quot;https://github.com/ChrisTheCoolHut/Zeratool&quot; target=&quot;_blank&quot;&gt;https://github.com/ChrisTheCoolHut/Zeratool&lt;/a&gt; pwn 类型，二进制利用框架
&lt;a href=&quot;https://github.com/ChrisTheCoolHut/Rocket-Shot&quot; target=&quot;_blank&quot;&gt;https://github.com/ChrisTheCoolHut/Rocket-Shot&lt;/a&gt; pwn，自动攻击脚本
&lt;a href=&quot;https://0xrick.github.io/lists/stego/&quot; target=&quot;_blank&quot;&gt;https://0xrick.github.io/lists/stego/&lt;/a&gt; 隐写术工具集，Steganography – A list of useful tools and resources
&lt;a href=&quot;https://github.com/DominicBreuker/stego-toolkit&quot; target=&quot;_blank&quot;&gt;https://github.com/DominicBreuker/stego-toolkit&lt;/a&gt; 隐写工具包
&lt;a href=&quot;https://github.com/bugsafe/WeReport&quot; target=&quot;_blank&quot;&gt;https://github.com/bugsafe/WeReport&lt;/a&gt; WeReport 报告助手
&lt;a href=&quot;https://github.com/PELock/CrackMeZ3S-CTF-CrackMe-Tutorial&quot; target=&quot;_blank&quot;&gt;https://github.com/PELock/CrackMeZ3S-CTF-CrackMe-Tutorial&lt;/a&gt; 为 CTF 比赛编写 CrackMe 软件&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;计算机与移动设备取证调查&lt;a href=&quot;#计算机与移动设备取证调查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.freebuf.com/articles/rookie/195107.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/articles/rookie/195107.html&lt;/a&gt; 记一次微信数据库解密过程。微信的加密数据库的解密密码是由“设备的 IMEI(MEID)+用户的 uin，进行 MD5，然后取其前 7 位小写字母”构成的
&lt;a href=&quot;https://www.audacityteam.org/&quot; target=&quot;_blank&quot;&gt;https://www.audacityteam.org/&lt;/a&gt; 音频文件和波形图处理工具
&lt;a href=&quot;http://www.sweetscape.com/010editor/&quot; target=&quot;_blank&quot;&gt;http://www.sweetscape.com/010editor/&lt;/a&gt; 识别不同文件格式（模板）的 16 进制编辑器，具有文件修复功能
&lt;a href=&quot;http://www.magicexif.com/&quot; target=&quot;_blank&quot;&gt;http://www.magicexif.com/&lt;/a&gt; 将照片图像中的 exif 信息数据化
&lt;a href=&quot;http://mediaarea.net/MediaInfo&quot; target=&quot;_blank&quot;&gt;http://mediaarea.net/MediaInfo&lt;/a&gt; 类似 exiftool 来查看内容区域和元数据信息
&lt;a href=&quot;https://www.sno.phy.queensu.ca/~phil/exiftool/&quot; target=&quot;_blank&quot;&gt;https://www.sno.phy.queensu.ca/~phil/exiftool/&lt;/a&gt; 检查图像文件的 exif 元数据
&lt;a href=&quot;https://www.gimp.org/&quot; target=&quot;_blank&quot;&gt;https://www.gimp.org/&lt;/a&gt; Gimp 提供了转换各类图像文件可视化数据的功能，还可以用于确认文件是否是一个图像文件
&lt;a href=&quot;https://github.com/volatilityfoundation/volatility&quot; target=&quot;_blank&quot;&gt;https://github.com/volatilityfoundation/volatility&lt;/a&gt; windows 内存取证分析
&lt;a href=&quot;https://github.com/gleeda/memtriage&quot; target=&quot;_blank&quot;&gt;https://github.com/gleeda/memtriage&lt;/a&gt; Windows 内存取证分析
&lt;a href=&quot;https://github.com/SekoiaLab/Fastir_Collector&quot; target=&quot;_blank&quot;&gt;https://github.com/SekoiaLab/Fastir_Collector&lt;/a&gt; Windows 取证/信息收集，不限于内存，注册表，文件信息等
&lt;a href=&quot;https://github.com/Viralmaniar/Remote-Desktop-Caching%E2%80%93&quot; target=&quot;_blank&quot;&gt;https://github.com/Viralmaniar/Remote-Desktop-Caching–&lt;/a&gt; RDP 信息复原，png 图片格式
&lt;a href=&quot;https://github.com/comaeio/LiveCloudKd&quot; target=&quot;_blank&quot;&gt;https://github.com/comaeio/LiveCloudKd&lt;/a&gt; C，针对 Hyper-V 的内存取证
–&lt;a href=&quot;https://github.com/sevagas/swap_digger&quot; target=&quot;_blank&quot;&gt;https://github.com/sevagas/swap_digger&lt;/a&gt; 针对 Linux swap 进行取证分析的工具
&lt;a href=&quot;http://extundelete.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://extundelete.sourceforge.net/&lt;/a&gt; linux 下的文件恢复
&lt;a href=&quot;https://github.com/viaforensics/android-forensics&quot; target=&quot;_blank&quot;&gt;https://github.com/viaforensics/android-forensics&lt;/a&gt; 安卓取证 App 和框架，可以对安卓设备内各种信息进行提取
&lt;a href=&quot;https://github.com/davidmcgrew/joy&quot; target=&quot;_blank&quot;&gt;https://github.com/davidmcgrew/joy&lt;/a&gt; 用来捕获和分析内外网流量数据的包，主要用于进行网络调查、安全监控和取证
&lt;a href=&quot;https://github.com/USArmyResearchLab/Dshell&quot; target=&quot;_blank&quot;&gt;https://github.com/USArmyResearchLab/Dshell&lt;/a&gt; 可扩展的网络取证分析框架，支持快速开发插件与解析网络数据包捕获
&lt;a href=&quot;http://qpdf.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;http://qpdf.sourceforge.net/&lt;/a&gt; 查看 pdf 文件并整理提取信息
&lt;a href=&quot;http://zipinfo.com/&quot; target=&quot;_blank&quot;&gt;http://zipinfo.com/&lt;/a&gt; 在无需提取的情况下列出了 zip 文件的内容信息
&lt;a href=&quot;http://f00l.de/pcapfix/&quot; target=&quot;_blank&quot;&gt;http://f00l.de/pcapfix/&lt;/a&gt; pcap 文件修复
&lt;a href=&quot;https://www.cgsecurity.org/wiki/TestDisk&quot; target=&quot;_blank&quot;&gt;https://www.cgsecurity.org/wiki/TestDisk&lt;/a&gt; 磁盘分区修复
&lt;a href=&quot;https://github.com/decalage2/oletools&quot; target=&quot;_blank&quot;&gt;https://github.com/decalage2/oletools&lt;/a&gt; py，用于分析 MS OLE2 文件（结构化存储，复合文件二进制格式）和 MS Office 文档
&lt;a href=&quot;https://www.xplico.org/download&quot; target=&quot;_blank&quot;&gt;https://www.xplico.org/download&lt;/a&gt; 内存取证
&lt;a href=&quot;https://github.com/google/bochspwn-reloaded&quot; target=&quot;_blank&quot;&gt;https://github.com/google/bochspwn-reloaded&lt;/a&gt; Bochspwn Reloaded（内核信息泄漏检测）工具
&lt;a href=&quot;https://github.com/abrignoni/DFIR-SQL-Query-Repo&quot; target=&quot;_blank&quot;&gt;https://github.com/abrignoni/DFIR-SQL-Query-Repo&lt;/a&gt; 收集用于数据取证的 SQL 查询模板
&lt;a href=&quot;https://www.freebuf.com/news/193684.html&quot; target=&quot;_blank&quot;&gt;https://www.freebuf.com/news/193684.html&lt;/a&gt; iOS 取证技巧：在无损的情况下完整导出 SQLite 数据库&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;移动安全&lt;a href=&quot;#移动安全&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Brucetg/App_Security&quot; target=&quot;_blank&quot;&gt;https://github.com/Brucetg/App_Security&lt;/a&gt; App 安全学习资源
&lt;a href=&quot;https://github.com/rovo89/Xposed&quot; target=&quot;_blank&quot;&gt;https://github.com/rovo89/Xposed&lt;/a&gt; 随心所欲修改安卓手机系统
&lt;a href=&quot;https://github.com/android-hacker/VirtualXposed&quot; target=&quot;_blank&quot;&gt;https://github.com/android-hacker/VirtualXposed&lt;/a&gt; 基于 VirtualApp 和 epic 在非 ROOT 环境下运行 Xposed 模块的实现
&lt;a href=&quot;https://github.com/MobSF/Mobile-Security-Framework-MobSF&quot; target=&quot;_blank&quot;&gt;https://github.com/MobSF/Mobile-Security-Framework-MobSF&lt;/a&gt; 移动安全审计框架。android、ios、win
&lt;a href=&quot;https://github.com/WooyunDota/DroidSSLUnpinning&quot; target=&quot;_blank&quot;&gt;https://github.com/WooyunDota/DroidSSLUnpinning&lt;/a&gt; 安卓证书锁定解除的工具
&lt;a href=&quot;https://github.com/nccgroup/house&quot; target=&quot;_blank&quot;&gt;https://github.com/nccgroup/house&lt;/a&gt; 运行时手机 App 分析工具包, 带 Web GUI
&lt;a href=&quot;https://github.com/UltimateHackers/Diggy&quot; target=&quot;_blank&quot;&gt;https://github.com/UltimateHackers/Diggy&lt;/a&gt; 从 Apk 文件中提取 URLs 的工具
&lt;a href=&quot;https://github.com/nettitude/scrounger&quot; target=&quot;_blank&quot;&gt;https://github.com/nettitude/scrounger&lt;/a&gt; iOS 和 Android 移动应用程序渗透测试框架
&lt;a href=&quot;https://github.com/XekriCorp/LeakVM&quot; target=&quot;_blank&quot;&gt;https://github.com/XekriCorp/LeakVM&lt;/a&gt; 安卓应用安全测试框架
&lt;a href=&quot;https://github.com/zsdlove/ApkVulCheck&quot; target=&quot;_blank&quot;&gt;https://github.com/zsdlove/ApkVulCheck&lt;/a&gt; 安卓漏洞扫描工具
&lt;a href=&quot;https://github.com/samyk/frisky&quot; target=&quot;_blank&quot;&gt;https://github.com/samyk/frisky&lt;/a&gt; 针对 ios/macOS 应用的嗅探/修改/逆向/注入等工具
&lt;a href=&quot;https://github.com/GeoSn0w/OsirisJailbreak12&quot; target=&quot;_blank&quot;&gt;https://github.com/GeoSn0w/OsirisJailbreak12&lt;/a&gt; IOS12 不完全越狱
&lt;a href=&quot;https://github.com/chaitin/passionfruit&quot; target=&quot;_blank&quot;&gt;https://github.com/chaitin/passionfruit&lt;/a&gt; iOS 应用逆向与分析工具，可以大大加速 iOS 应用安全分析过程&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;防火墙规则、Waf、CDN 相关&lt;a href=&quot;#防火墙规则wafcdn-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/baidu/openrasp&quot; target=&quot;_blank&quot;&gt;https://github.com/baidu/openrasp&lt;/a&gt; RASP,Runtime Application Self-Protection，实时应用自我保护，更智能，针对每个语言定制
&lt;a href=&quot;https://github.com/snort3/snort3&quot; target=&quot;_blank&quot;&gt;https://github.com/snort3/snort3&lt;/a&gt; snort 算是最出名的开源 ids 入侵检测
&lt;a href=&quot;https://github.com/chaitin/yanshi&quot; target=&quot;_blank&quot;&gt;https://github.com/chaitin/yanshi&lt;/a&gt; 长亭偃师（yanshi）,雷池（SafeLine）防火墙核心引擎使用到的代码生成工具
&lt;a href=&quot;https://github.com/SpiderLabs/ModSecurity&quot; target=&quot;_blank&quot;&gt;https://github.com/SpiderLabs/ModSecurity&lt;/a&gt; C，跨平台 WAF engine for Apache, IIS and Nginx
&lt;a href=&quot;https://github.com/klaubert/waf-fle&quot; target=&quot;_blank&quot;&gt;https://github.com/klaubert/waf-fle&lt;/a&gt; ModSecurity Web 控制台
&lt;a href=&quot;https://github.com/xsec-lab/x-waf&quot; target=&quot;_blank&quot;&gt;https://github.com/xsec-lab/x-waf&lt;/a&gt; 适用于中小企业的云 waf
&lt;a href=&quot;https://github.com/jx-sec/jxwaf&quot; target=&quot;_blank&quot;&gt;https://github.com/jx-sec/jxwaf&lt;/a&gt; 基于 openrestynginx+lua 开发，独创的业务逻辑防护引擎和机器学习引擎，解决传统 WAF 无法对业务安全进行防护的痛点
&lt;a href=&quot;https://github.com/loveshell/ngx_lua_waf&quot; target=&quot;_blank&quot;&gt;https://github.com/loveshell/ngx_lua_waf&lt;/a&gt; 基于 lua-nginx-moduleopenresty 的 web 应用防火墙
&lt;a href=&quot;https://github.com/Janusec/janusec&quot; target=&quot;_blank&quot;&gt;https://github.com/Janusec/janusec&lt;/a&gt; 基于 Golang 开发的应用安全网关，具备 WAF、CC 攻击防御、证书私钥加密、负载均衡、统一 Web 化管理等功能。
&lt;a href=&quot;https://github.com/SpiderLabs/owasp-modsecurity-crs&quot; target=&quot;_blank&quot;&gt;https://github.com/SpiderLabs/owasp-modsecurity-crs&lt;/a&gt; a set of generic attack detection rules for use with ModSecurity or compatible web application firewalls
&lt;a href=&quot;https://github.com/kirillwow/ids_bypass&quot; target=&quot;_blank&quot;&gt;https://github.com/kirillwow/ids_bypass&lt;/a&gt; IDS Bypass 脚本
&lt;a href=&quot;https://github.com/milo2012/ipv4bypass&quot; target=&quot;_blank&quot;&gt;https://github.com/milo2012/ipv4bypass&lt;/a&gt; 利用 ipV6 地址绕过 waf
&lt;a href=&quot;https://github.com/3xp10it/bypass_waf&quot; target=&quot;_blank&quot;&gt;https://github.com/3xp10it/bypass_waf&lt;/a&gt; 防火墙绕过脚本
&lt;a href=&quot;https://github.com/m0rtem/CloudFail&quot; target=&quot;_blank&quot;&gt;https://github.com/m0rtem/CloudFail&lt;/a&gt; 针对 Cloudfail,查找位于 CDN 后面网站的真实 IP
&lt;a href=&quot;https://github.com/Nitr4x/whichCDN&quot; target=&quot;_blank&quot;&gt;https://github.com/Nitr4x/whichCDN&lt;/a&gt; CDN 识别、检测
&lt;a href=&quot;https://github.com/3xp10it/xcdn&quot; target=&quot;_blank&quot;&gt;https://github.com/3xp10it/xcdn&lt;/a&gt; 尝试找出 cdn 背后的真实 ip，3xp10it.github.io 博客&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;入侵检测&lt;a href=&quot;#入侵检测&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Neo23x0/Loki&quot; target=&quot;_blank&quot;&gt;https://github.com/Neo23x0/Loki&lt;/a&gt; 一款 APT 入侵痕迹扫描器
&lt;a href=&quot;https://github.com/ossec/ossec-hids&quot; target=&quot;_blank&quot;&gt;https://github.com/ossec/ossec-hids&lt;/a&gt; 开源 hids 堡垒机
&lt;a href=&quot;https://github.com/grayddq/HIDS&quot; target=&quot;_blank&quot;&gt;https://github.com/grayddq/HIDS&lt;/a&gt; hids 基于主机型入侵检测系统，一个人的安全部
&lt;a href=&quot;https://github.com/ysrc/yulong-hids&quot; target=&quot;_blank&quot;&gt;https://github.com/ysrc/yulong-hids&lt;/a&gt; 驭龙 HIDS 是一款由 YSRC 开源的入侵检测系统
&lt;a href=&quot;https://github.com/DianrongSecurity/AgentSmith-HIDS&quot; target=&quot;_blank&quot;&gt;https://github.com/DianrongSecurity/AgentSmith-HIDS&lt;/a&gt; 点融开源 HIDS，开源部分为主机情报收集工具
&lt;a href=&quot;https://github.com/Tencent/HaboMalHunter&quot; target=&quot;_blank&quot;&gt;https://github.com/Tencent/HaboMalHunter&lt;/a&gt; 哈勃分析系统，linux 系统病毒分析及安全测试
&lt;a href=&quot;https://github.com/JPCERTCC/LogonTracer&quot; target=&quot;_blank&quot;&gt;https://github.com/JPCERTCC/LogonTracer&lt;/a&gt; 根据 win 登陆记录日志来分析并用图形化展示恶意登陆行为
&lt;a href=&quot;https://github.com/anwi-wips/anwi&quot; target=&quot;_blank&quot;&gt;https://github.com/anwi-wips/anwi&lt;/a&gt; 无线 IDS, 基于低成本的 Wi-Fi 模块(ESP8266)
&lt;a href=&quot;https://github.com/Security-Onion-Solutions/security-onion&quot; target=&quot;_blank&quot;&gt;https://github.com/Security-Onion-Solutions/security-onion&lt;/a&gt; 基于 ubuntu 用于入侵检测，网络安全监控和日志管理，采用分布式架构
&lt;a href=&quot;https://github.com/jpcertcc/sysmonsearch&quot; target=&quot;_blank&quot;&gt;https://github.com/jpcertcc/sysmonsearch&lt;/a&gt; 将 Sysmon 的日志结果可视化
&lt;a href=&quot;http://m.imooc.com/article/21236&quot; target=&quot;_blank&quot;&gt;http://m.imooc.com/article/21236&lt;/a&gt; 快速自检电脑是否被黑客入侵过(Windows 版)
&lt;a href=&quot;http://www.freebuf.com/articles/system/157597.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/articles/system/157597.html&lt;/a&gt; 快速自检电脑是否被黑客入侵过（Linux 版）
&lt;a href=&quot;http://www.freebuf.com/rookie/179638.html&quot; target=&quot;_blank&quot;&gt;http://www.freebuf.com/rookie/179638.html&lt;/a&gt; 服务器入侵溯源小技巧整理
&lt;a href=&quot;https://github.com/zhanghaoyil/Hawk-I&quot; target=&quot;_blank&quot;&gt;https://github.com/zhanghaoyil/Hawk-I&lt;/a&gt; 基于无监督机器学习算法从 Web 日志中自动提取攻击 Payload&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;恶意文件测与样本分析&lt;a href=&quot;#恶意文件测与样本分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/open-power-workgroup/Hospital&quot; target=&quot;_blank&quot;&gt;https://github.com/open-power-workgroup/Hospital&lt;/a&gt; 全国莆田系医院名单
&lt;a href=&quot;https://github.com/chenerlich/FCL&quot; target=&quot;_blank&quot;&gt;https://github.com/chenerlich/FCL&lt;/a&gt; 恶意代码使用的命令行收集
&lt;a href=&quot;https://paper.seebug.org/421&quot; target=&quot;_blank&quot;&gt;https://paper.seebug.org/421&lt;/a&gt; 常见软件合集与恶意软件分析
&lt;a href=&quot;https://github.com/sapphirex00/Threat-Hunting&quot; target=&quot;_blank&quot;&gt;https://github.com/sapphirex00/Threat-Hunting&lt;/a&gt; apt 恶意软件样本
&lt;a href=&quot;https://www.malware-traffic-analysis.net/&quot; target=&quot;_blank&quot;&gt;https://www.malware-traffic-analysis.net/&lt;/a&gt; 恶意软件样本
&lt;a href=&quot;http://dasmalwerk.eu/&quot; target=&quot;_blank&quot;&gt;http://dasmalwerk.eu/&lt;/a&gt; 恶意软件样本
&lt;a href=&quot;https://github.com/ytisf/theZoo&quot; target=&quot;_blank&quot;&gt;https://github.com/ytisf/theZoo&lt;/a&gt; 恶意软件样本
&lt;a href=&quot;https://github.com/mstfknn/malware-sample-library&quot; target=&quot;_blank&quot;&gt;https://github.com/mstfknn/malware-sample-library&lt;/a&gt; 恶意软件样本
&lt;a href=&quot;http://99.248.235.4/Library/&quot; target=&quot;_blank&quot;&gt;http://99.248.235.4/Library/&lt;/a&gt; 恶意软件样本库。ladder
&lt;a href=&quot;https://github.com/robbyFux/Ragpicker&quot; target=&quot;_blank&quot;&gt;https://github.com/robbyFux/Ragpicker&lt;/a&gt; 恶意软件信息爬取汇总分析
&lt;a href=&quot;https://github.com/phage-nz/ph0neutria&quot; target=&quot;_blank&quot;&gt;https://github.com/phage-nz/ph0neutria&lt;/a&gt; 恶意软件信息爬取汇总分析
&lt;a href=&quot;https://github.com/JR0driguezB/malware_configs&quot; target=&quot;_blank&quot;&gt;https://github.com/JR0driguezB/malware_configs&lt;/a&gt; 常见恶意配置文件
&lt;a href=&quot;https://github.com/sfaci/masc&quot; target=&quot;_blank&quot;&gt;https://github.com/sfaci/masc&lt;/a&gt; 扫描网站中的恶意软件, 以及其他一些网站维护功能
&lt;a href=&quot;https://github.com/Neo23x0/munin&quot; target=&quot;_blank&quot;&gt;https://github.com/Neo23x0/munin&lt;/a&gt; 依据文件 Hash 从各种在线恶意软件扫描服务提取信息的工具
&lt;a href=&quot;https://github.com/1lastBr3ath/drmine&quot; target=&quot;_blank&quot;&gt;https://github.com/1lastBr3ath/drmine&lt;/a&gt; 自动化检测网页是否包含挖矿脚本的工具
&lt;a href=&quot;https://github.com/KasperskyLab/klara&quot; target=&quot;_blank&quot;&gt;https://github.com/KasperskyLab/klara&lt;/a&gt; 卡巴斯基开源基于 Yara 的分布式恶意软件扫描系统,
&lt;a href=&quot;https://github.com/botherder/kraken&quot; target=&quot;_blank&quot;&gt;https://github.com/botherder/kraken&lt;/a&gt; go，实现的 Yara 恶意软件扫描器
&lt;a href=&quot;https://github.com/alexandreborges/malwoverview&quot; target=&quot;_blank&quot;&gt;https://github.com/alexandreborges/malwoverview&lt;/a&gt; simple，将恶意文件进行快速分类
&lt;a href=&quot;https://github.com/joxeankoret/pigaios&quot; target=&quot;_blank&quot;&gt;https://github.com/joxeankoret/pigaios&lt;/a&gt; 直接对比源代码与编译的二进制文件
&lt;a href=&quot;https://github.com/viper-framework&quot; target=&quot;_blank&quot;&gt;https://github.com/viper-framework&lt;/a&gt; py2，二进制分析和管理框架，对恶意文件进行分析
&lt;a href=&quot;https://github.com/netxfly/sec_check&quot; target=&quot;_blank&quot;&gt;https://github.com/netxfly/sec_check&lt;/a&gt; 通过信息采集（账户、连接、端口等）与 yara 扫描进行安全检测
&lt;a href=&quot;https://github.com/nao-sec/tknk_scanner&quot; target=&quot;_blank&quot;&gt;https://github.com/nao-sec/tknk_scanner&lt;/a&gt; yara 引擎为基础的恶意软件识别框架
&lt;a href=&quot;https://github.com/felixweyne/ProcessSpawnControl&quot; target=&quot;_blank&quot;&gt;https://github.com/felixweyne/ProcessSpawnControl&lt;/a&gt; powershell,对恶意程序进行检测与监控
&lt;a href=&quot;https://github.com/Aurore54F/JaSt&quot; target=&quot;_blank&quot;&gt;https://github.com/Aurore54F/JaSt&lt;/a&gt; 使用语法检测恶意/混淆的 JS 文件，&lt;a href=&quot;https://www.blackhoodie.re/assets/archive/JaSt_blackhoodie.pdf&quot; target=&quot;_blank&quot;&gt;https://www.blackhoodie.re/assets/archive/JaSt_blackhoodie.pdf&lt;/a&gt;
&lt;a href=&quot;http://edr.sangfor.com.cn/&quot; target=&quot;_blank&quot;&gt;http://edr.sangfor.com.cn/&lt;/a&gt; win，Linux 下恶意软件、webshell 检测查杀工具
&lt;a href=&quot;http://www.clamav.net/downloads&quot; target=&quot;_blank&quot;&gt;http://www.clamav.net/downloads&lt;/a&gt; 病毒查杀软件
&lt;a href=&quot;http://www.chkrootkit.org/&quot; target=&quot;_blank&quot;&gt;http://www.chkrootkit.org/&lt;/a&gt; rootkit 检测工具
&lt;a href=&quot;http://rootkit.nl/projects/rootkit_hunter.html&quot; target=&quot;_blank&quot;&gt;http://rootkit.nl/projects/rootkit_hunter.html&lt;/a&gt; rootkit 检测工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;恶意文件检测之 Webshell 查杀扫描&lt;a href=&quot;#恶意文件检测之-webshell-查杀扫描&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;http://www.safedog.cn/&quot; target=&quot;_blank&quot;&gt;http://www.safedog.cn/&lt;/a&gt; 安全狗 web 防火墙
&lt;a href=&quot;http://d99net.net/&quot; target=&quot;_blank&quot;&gt;http://d99net.net/&lt;/a&gt; win，啊 D 出品 D 盾 _ 防火墙，包含 waf 与 webshel 检测功能
&lt;a href=&quot;https://github.com/he1m4n6a/findWebshell&quot; target=&quot;_blank&quot;&gt;https://github.com/he1m4n6a/findWebshell&lt;/a&gt; py，webshell 检查工具，可后期添加后门指纹，很强大
&lt;a href=&quot;https://github.com/ym2011/ScanBackdoor&quot; target=&quot;_blank&quot;&gt;https://github.com/ym2011/ScanBackdoor&lt;/a&gt; 一款简洁的 Webshell 扫描工具
&lt;a href=&quot;https://github.com/erevus-cn/scan_webshell&quot; target=&quot;_blank&quot;&gt;https://github.com/erevus-cn/scan_webshell&lt;/a&gt; webshell 扫描工具
&lt;a href=&quot;https://github.com/yassineaddi/BackdoorMan&quot; target=&quot;_blank&quot;&gt;https://github.com/yassineaddi/BackdoorMan&lt;/a&gt; 可对指定目录进行 php webshell 检测
&lt;a href=&quot;https://github.com/nbs-system/php-malware-finder&quot; target=&quot;_blank&quot;&gt;https://github.com/nbs-system/php-malware-finder&lt;/a&gt; 一款高效率 PHP-webshell 扫描工具
&lt;a href=&quot;https://github.com/emposha/PHP-Shell-Detector&quot; target=&quot;_blank&quot;&gt;https://github.com/emposha/PHP-Shell-Detector&lt;/a&gt; 测试效率高达 99%的 webshell 检测工具
&lt;a href=&quot;https://github.com/emposha/Shell-Detector&quot; target=&quot;_blank&quot;&gt;https://github.com/emposha/Shell-Detector&lt;/a&gt; Webshell 扫描工具，支持 php/perl/asp/aspx webshell 扫描&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;压力测试与 DDOS 相关&lt;a href=&quot;#压力测试与-ddos-相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/ywjt/Dshield&quot; target=&quot;_blank&quot;&gt;https://github.com/ywjt/Dshield&lt;/a&gt; DDOS 防护
&lt;a href=&quot;https://github.com/NewEraCracker/LOIC/&quot; target=&quot;_blank&quot;&gt;https://github.com/NewEraCracker/LOIC/&lt;/a&gt; 一个为 Windows 设计的网络压力测试工具现已支持 Mac OS——译者注
&lt;a href=&quot;https://github.com/649/Memcrashed-DDoS-Exploit&quot; target=&quot;_blank&quot;&gt;https://github.com/649/Memcrashed-DDoS-Exploit&lt;/a&gt; 利用 Memcached 服务器的 DDoS 攻击工具, 向 Memcached 服务器发送伪造的 UDP 数据包使其向攻击目标回复大量数据包
&lt;a href=&quot;https://github.com/jseidl/GoldenEye&quot; target=&quot;_blank&quot;&gt;https://github.com/jseidl/GoldenEye&lt;/a&gt; py，DOS 测试
&lt;a href=&quot;https://github.com/mschwager/dhcpwn&quot; target=&quot;_blank&quot;&gt;https://github.com/mschwager/dhcpwn&lt;/a&gt; DHCP IP 资源耗尽攻击工具
&lt;a href=&quot;https://github.com/Microsoft/Ethr&quot; target=&quot;_blank&quot;&gt;https://github.com/Microsoft/Ethr&lt;/a&gt; GO,跨平台,TCP, UDP, HTTP, HTTPS 压力测试工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;匿名信息保护洋葱路由 TorBrowser&lt;a href=&quot;#匿名信息保护洋葱路由-torbrowser&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/leitbogioro/Fuck_Aliyun&quot; target=&quot;_blank&quot;&gt;https://github.com/leitbogioro/Fuck_Aliyun&lt;/a&gt; 关闭阿里云监控服务
&lt;a href=&quot;https://github.com/Nummer/Destroy-Windows-10-Spying&quot; target=&quot;_blank&quot;&gt;https://github.com/Nummer/Destroy-Windows-10-Spying&lt;/a&gt; DWS 关闭 windows 监控服务
&lt;a href=&quot;https://github.com/Rizer0/Log-killer&quot; target=&quot;_blank&quot;&gt;https://github.com/Rizer0/Log-killer&lt;/a&gt; 日志清除，Windows/Linux 服务器中的所有
&lt;a href=&quot;https://github.com/360-A-Team/EventCleaner&quot; target=&quot;_blank&quot;&gt;https://github.com/360-A-Team/EventCleaner&lt;/a&gt; 日志擦除工具
&lt;a href=&quot;https://github.com/s-rah/onionscan&quot; target=&quot;_blank&quot;&gt;https://github.com/s-rah/onionscan&lt;/a&gt; darkweb 暗网爬虫
&lt;a href=&quot;https://github.com/globaleaks/Tor2web&quot; target=&quot;_blank&quot;&gt;https://github.com/globaleaks/Tor2web&lt;/a&gt; darkweb 暗网代理服务器，将 onion 的服务变为普通的服务
&lt;a href=&quot;https://github.com/milesrichardson/docker-onion-nmap&quot; target=&quot;_blank&quot;&gt;https://github.com/milesrichardson/docker-onion-nmap&lt;/a&gt; 使用 nmap 扫描 Tor 网络上隐藏的”onion”服务
&lt;a href=&quot;https://github.com/GouveaHeitor/nipe&quot; target=&quot;_blank&quot;&gt;https://github.com/GouveaHeitor/nipe&lt;/a&gt; 一个使所有流量通过 Tor 网络发出的脚本
&lt;a href=&quot;https://github.com/trimstray/multitor&quot; target=&quot;_blank&quot;&gt;https://github.com/trimstray/multitor&lt;/a&gt; 启用多个 tor 通道转发流量，并设置负载均衡&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;爬虫相关&lt;a href=&quot;#爬虫相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/alphardex/looter&quot; target=&quot;_blank&quot;&gt;https://github.com/alphardex/looter&lt;/a&gt; 轻量型爬虫框架，类比 Scrapy
&lt;a href=&quot;https://github.com/luyishisi/Anti-Anti-Spider&quot; target=&quot;_blank&quot;&gt;https://github.com/luyishisi/Anti-Anti-Spider&lt;/a&gt; 过反爬虫
&lt;a href=&quot;https://github.com/xchaoinfo/fuck-login&quot; target=&quot;_blank&quot;&gt;https://github.com/xchaoinfo/fuck-login&lt;/a&gt; 模拟登录一些常见的网站
&lt;a href=&quot;https://github.com/Maicius/InterestingCrawler&quot; target=&quot;_blank&quot;&gt;https://github.com/Maicius/InterestingCrawler&lt;/a&gt; 抓取 QQ 空间说说内容并进行分析
&lt;a href=&quot;https://github.com/xjr7670/QQzone_crawler&quot; target=&quot;_blank&quot;&gt;https://github.com/xjr7670/QQzone_crawler&lt;/a&gt; QQ 空间动态爬虫，利用 cookie 登录获取所有可访问好友空间的动态保存到本地&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在线自服务与工具&lt;a href=&quot;#在线自服务与工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Kickball/awesome-selfhosted&quot; target=&quot;_blank&quot;&gt;https://github.com/Kickball/awesome-selfhosted&lt;/a&gt; awesome 系列之自服务应用
&lt;a href=&quot;https://github.com/littlecodersh/itchat&quot; target=&quot;_blank&quot;&gt;https://github.com/littlecodersh/itchat&lt;/a&gt; 微信个人号接口、微信机器人及命令行微信
&lt;a href=&quot;https://github.com/sym233/core-values-encoder&quot; target=&quot;_blank&quot;&gt;https://github.com/sym233/core-values-encoder&lt;/a&gt; js,社会主义核心价值观加密，&lt;a href=&quot;https://sym233.github.io/core-values-encoder/&quot; target=&quot;_blank&quot;&gt;https://sym233.github.io/core-values-encoder/&lt;/a&gt;
&lt;a href=&quot;https://github.com/valentinxxx/nginxconfig.io/&quot; target=&quot;_blank&quot;&gt;https://github.com/valentinxxx/nginxconfig.io/&lt;/a&gt; 在线 nginx 配置文件生成，demo 网址 &lt;a href=&quot;https://nginxconfig.io&quot; target=&quot;_blank&quot;&gt;https://nginxconfig.io&lt;/a&gt;
&lt;a href=&quot;https://github.com/asciimoo/searx&quot; target=&quot;_blank&quot;&gt;https://github.com/asciimoo/searx&lt;/a&gt; 搭建一个自己的搜索引擎,DEMO 网址 &lt;a href=&quot;https://searx.me/&quot; target=&quot;_blank&quot;&gt;https://searx.me/&lt;/a&gt;
&lt;a href=&quot;http://sc.ftqq.com/3.version&quot; target=&quot;_blank&quot;&gt;http://sc.ftqq.com/3.version&lt;/a&gt; server 酱微信通知
&lt;a href=&quot;https://osint.link&quot; target=&quot;_blank&quot;&gt;https://osint.link&lt;/a&gt; Open Source Intelligence (OSINT) Tools &amp;amp; Resources
&lt;a href=&quot;https://www.wolframalpha.com&quot; target=&quot;_blank&quot;&gt;https://www.wolframalpha.com&lt;/a&gt; 根据问题直接给出答案的网站
shodan.io 互联网感知引擎
fofa.so 白帽汇 NOSEC
&lt;a href=&quot;https://www.oshadan.com&quot; target=&quot;_blank&quot;&gt;https://www.oshadan.com&lt;/a&gt; 傻蛋联网设备搜索 _ 湖南安数网络
zoomeye.org 知道创宇互联网感知引擎
&lt;a href=&quot;https://sms.cngrok.com/receiving-sms&quot; target=&quot;_blank&quot;&gt;https://sms.cngrok.com/receiving-sms&lt;/a&gt; 收码接码
&lt;a href=&quot;https://www.pdflibr.com/&quot; target=&quot;_blank&quot;&gt;https://www.pdflibr.com/&lt;/a&gt; 收码接码
&lt;a href=&quot;https://www.fakenamegenerator.com&quot; target=&quot;_blank&quot;&gt;https://www.fakenamegenerator.com&lt;/a&gt; 多国身份信息模拟器
&lt;a href=&quot;https://recruitin.net&quot; target=&quot;_blank&quot;&gt;https://recruitin.net&lt;/a&gt; Easily use Google to search profiles on LinkedIn
&lt;a href=&quot;https://www.truthfinder.com&quot; target=&quot;_blank&quot;&gt;https://www.truthfinder.com&lt;/a&gt; 美国公民信息查询
&lt;a href=&quot;https://verify-email.org&quot; target=&quot;_blank&quot;&gt;https://verify-email.org&lt;/a&gt; 邮件真实性验证
&lt;a href=&quot;https://safeweb.norton.com&quot; target=&quot;_blank&quot;&gt;https://safeweb.norton.com&lt;/a&gt; 诺顿网站安全检测
&lt;a href=&quot;http://www.vuln.cn/tools/ftp&quot; target=&quot;_blank&quot;&gt;http://www.vuln.cn/tools/ftp&lt;/a&gt; 在线 FTP 登录
&lt;a href=&quot;http://www.link114.cn/title/&quot; target=&quot;_blank&quot;&gt;http://www.link114.cn/title/&lt;/a&gt; 批量查询网站标题
&lt;a href=&quot;https://www.whatweb.net/&quot; target=&quot;_blank&quot;&gt;https://www.whatweb.net/&lt;/a&gt; 在线 web 指纹识别
&lt;a href=&quot;https://hackertarget.com/ip-tools/&quot; target=&quot;_blank&quot;&gt;https://hackertarget.com/ip-tools/&lt;/a&gt; 提供 api，ip 相关工具、在线扫描器
&lt;a href=&quot;http://www.webscan.cc/&quot; target=&quot;_blank&quot;&gt;http://www.webscan.cc/&lt;/a&gt; 同 IP 网站查询,C 段查询,IP 反查域名,C 段旁注,旁注工具
&lt;a href=&quot;https://www.phpinfo.me/bing.php&quot; target=&quot;_blank&quot;&gt;https://www.phpinfo.me/bing.php&lt;/a&gt; 在线旁站查询|C 段查询|必应接口 C 段查询
&lt;a href=&quot;https://www.phpinfo.me/domain/&quot; target=&quot;_blank&quot;&gt;https://www.phpinfo.me/domain/&lt;/a&gt; 在线子域名爆破
&lt;a href=&quot;https://www.dnsdb.io&quot; target=&quot;_blank&quot;&gt;https://www.dnsdb.io&lt;/a&gt; DNS 查询,子域名查询,IP 查询,A 记录查询,域名解析,旁站查询
&lt;a href=&quot;https://dnsdumpster.com/&quot; target=&quot;_blank&quot;&gt;https://dnsdumpster.com/&lt;/a&gt; dns recon and research, find and lookup dns records
&lt;a href=&quot;http://ip.chaxun.la/&quot; target=&quot;_blank&quot;&gt;http://ip.chaxun.la/&lt;/a&gt; ip 反查域名—查询啦
&lt;a href=&quot;https://habo.qq.com&quot; target=&quot;_blank&quot;&gt;https://habo.qq.com&lt;/a&gt; 在线恶意文件检测
&lt;a href=&quot;https://www.virustotal.com&quot; target=&quot;_blank&quot;&gt;https://www.virustotal.com&lt;/a&gt; 恶意软件检测
&lt;a href=&quot;http://r.virscan.org/&quot; target=&quot;_blank&quot;&gt;http://r.virscan.org/&lt;/a&gt; 恶意软件检测
&lt;a href=&quot;https://www.appscan.io&quot; target=&quot;_blank&quot;&gt;https://www.appscan.io&lt;/a&gt; 移动软件在线检测
&lt;a href=&quot;https://www.nomoreransom.org&quot; target=&quot;_blank&quot;&gt;https://www.nomoreransom.org&lt;/a&gt; 常见勒索软件分析还原
&lt;a href=&quot;https://www.cmd5.com/&quot; target=&quot;_blank&quot;&gt;https://www.cmd5.com/&lt;/a&gt; HASH 密码在线破解
&lt;a href=&quot;https://www.onlinehashcrack.com&quot; target=&quot;_blank&quot;&gt;https://www.onlinehashcrack.com&lt;/a&gt; 密码哈希在线破解，邮件通知&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在线办公套件&lt;a href=&quot;#在线办公套件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://sadd.io/&quot; target=&quot;_blank&quot;&gt;https://sadd.io/&lt;/a&gt; 在线操作系统
&lt;a href=&quot;https://github.com/zyx0814/dzzoffice&quot; target=&quot;_blank&quot;&gt;https://github.com/zyx0814/dzzoffice&lt;/a&gt; 在线办公套件,DEMO 网址 demo.dzzoffice.com
&lt;a href=&quot;https://github.com/RobbieHan/gistandard&quot; target=&quot;_blank&quot;&gt;https://github.com/RobbieHan/gistandard&lt;/a&gt; py，基于 Django，OA 工单办公管理系统
&lt;a href=&quot;https://github.com/pavanw3b/sh00t&quot; target=&quot;_blank&quot;&gt;https://github.com/pavanw3b/sh00t&lt;/a&gt; PY3,DJANGO，安全测试工单管理
&lt;a href=&quot;https://github.com/chaitin/strapdown-zeta&quot; target=&quot;_blank&quot;&gt;https://github.com/chaitin/strapdown-zeta&lt;/a&gt; 基于 strapdown.js，长亭二次开发开源的 Wiki 系统，支持 markdown
&lt;a href=&quot;https://etherpad.net/&quot; target=&quot;_blank&quot;&gt;https://etherpad.net/&lt;/a&gt; 在线可编辑记事本
&lt;a href=&quot;https://www.upload.ee/&quot; target=&quot;_blank&quot;&gt;https://www.upload.ee/&lt;/a&gt; 文件共享平台
&lt;a href=&quot;https://github.com/micahflee/onionshare&quot; target=&quot;_blank&quot;&gt;https://github.com/micahflee/onionshare&lt;/a&gt; 利用 onion 洋葱服务器匿名文件共享
&lt;a href=&quot;https://github.com/filebrowser/filebrowser&quot; target=&quot;_blank&quot;&gt;https://github.com/filebrowser/filebrowser&lt;/a&gt; GO,基于 Caddy 框架的网盘
&lt;a href=&quot;https://github.com/nextcloud/server&quot; target=&quot;_blank&quot;&gt;https://github.com/nextcloud/server&lt;/a&gt; php，私有云网盘，owncloud 分支
&lt;a href=&quot;https://github.com/owncloud/core&quot; target=&quot;_blank&quot;&gt;https://github.com/owncloud/core&lt;/a&gt; php，私有云网盘，界面不美观
&lt;a href=&quot;https://github.com/haiwen/seafile&quot; target=&quot;_blank&quot;&gt;https://github.com/haiwen/seafile&lt;/a&gt; C,私有云网盘，速度快，功能少
&lt;a href=&quot;https://github.com/ymfe/yapi&quot; target=&quot;_blank&quot;&gt;https://github.com/ymfe/yapi&lt;/a&gt; API 管理工具
&lt;a href=&quot;https://thyrsi.com/&quot; target=&quot;_blank&quot;&gt;https://thyrsi.com/&lt;/a&gt; 图片上传分享工具&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;隐私匿名加密&lt;a href=&quot;#隐私匿名加密&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://www.lshack.cn/118/&quot; target=&quot;_blank&quot;&gt;https://www.lshack.cn/118/&lt;/a&gt; 在线接收验证码/邮箱/粘贴板/文件传输大集合。
&lt;a href=&quot;http://bccto.me&quot; target=&quot;_blank&quot;&gt;http://bccto.me&lt;/a&gt; 一次性邮箱
&lt;a href=&quot;https://www.guerrillamail.com&quot; target=&quot;_blank&quot;&gt;https://www.guerrillamail.com&lt;/a&gt; 一次性邮箱
&lt;a href=&quot;http://24mail.chacuo.net/&quot; target=&quot;_blank&quot;&gt;http://24mail.chacuo.net/&lt;/a&gt; 一次性邮箱
&lt;a href=&quot;http://www.yopmail.com&quot; target=&quot;_blank&quot;&gt;http://www.yopmail.com&lt;/a&gt; 一次性邮箱
&lt;a href=&quot;https://yandex.com/&quot; target=&quot;_blank&quot;&gt;https://yandex.com/&lt;/a&gt; 非手机邮箱
&lt;a href=&quot;https://mail.ru/&quot; target=&quot;_blank&quot;&gt;https://mail.ru/&lt;/a&gt; 非手机邮箱
&lt;a href=&quot;https://mail.protonmail.com/login&quot; target=&quot;_blank&quot;&gt;https://mail.protonmail.com/login&lt;/a&gt; 非手机邮箱
&lt;a href=&quot;https://github.com/walkor/workerman-chat&quot; target=&quot;_blank&quot;&gt;https://github.com/walkor/workerman-chat&lt;/a&gt; php，在线聊天室，可扩展
&lt;a href=&quot;https://github.com/hack-chat&quot; target=&quot;_blank&quot;&gt;https://github.com/hack-chat&lt;/a&gt; &lt;a href=&quot;https://hack.chat/?your-channel&quot; target=&quot;_blank&quot;&gt;https://hack.chat/?your-channel&lt;/a&gt; js,在线聊天，问号后面跟你的房间名
&lt;a href=&quot;https://github.com/akaxincom/openzaly&quot; target=&quot;_blank&quot;&gt;https://github.com/akaxincom/openzaly&lt;/a&gt; java,聊天室，Akaxin 为客户端闭源
&lt;a href=&quot;https://github.com/RocketChat/Rocket.Chat&quot; target=&quot;_blank&quot;&gt;https://github.com/RocketChat/Rocket.Chat&lt;/a&gt; js,在线团队聊天服务器，&lt;a href=&quot;https://rocket.chat/install&quot; target=&quot;_blank&quot;&gt;https://rocket.chat/install&lt;/a&gt;
&lt;a href=&quot;https://telegram.org&quot; target=&quot;_blank&quot;&gt;https://telegram.org&lt;/a&gt;
&lt;a href=&quot;https://www.whatsapp.com&quot; target=&quot;_blank&quot;&gt;https://www.whatsapp.com&lt;/a&gt;
&lt;a href=&quot;https://wire.com/en&quot; target=&quot;_blank&quot;&gt;https://wire.com/en&lt;/a&gt;
&lt;a href=&quot;https://signal.org&quot; target=&quot;_blank&quot;&gt;https://signal.org&lt;/a&gt;
&lt;a href=&quot;http://www.batmessenger.com&quot; target=&quot;_blank&quot;&gt;http://www.batmessenger.com&lt;/a&gt;
&lt;a href=&quot;http://sid.co&quot; target=&quot;_blank&quot;&gt;http://sid.co&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;在线资源&lt;a href=&quot;#在线资源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/DoubleLabyrinth/navicat-keygen&quot; target=&quot;_blank&quot;&gt;https://github.com/DoubleLabyrinth/navicat-keygen&lt;/a&gt; navicat 注册机
&lt;a href=&quot;https://github.com/DoubleLabyrinth/MobaXterm-keygen&quot; target=&quot;_blank&quot;&gt;https://github.com/DoubleLabyrinth/MobaXterm-keygen&lt;/a&gt; MobaXterm 注册机
&lt;a href=&quot;http://www.zdfans.com&quot; target=&quot;_blank&quot;&gt;http://www.zdfans.com&lt;/a&gt; zd423 – 软件分享平台领跑者
&lt;a href=&quot;https://www.flaticon.com&quot; target=&quot;_blank&quot;&gt;https://www.flaticon.com&lt;/a&gt; 免费图标网站
&lt;a href=&quot;https://msdn.itellyou.cn&quot; target=&quot;_blank&quot;&gt;https://msdn.itellyou.cn&lt;/a&gt; 原生镜像
&lt;a href=&quot;https://www.freenom.com&quot; target=&quot;_blank&quot;&gt;https://www.freenom.com&lt;/a&gt; 注册免费域名，dns 解析
&lt;a href=&quot;https://codebeautify.org&quot; target=&quot;_blank&quot;&gt;https://codebeautify.org&lt;/a&gt; 在线代码美化
&lt;a href=&quot;http://patorjk.com&quot; target=&quot;_blank&quot;&gt;http://patorjk.com&lt;/a&gt; Text to ASCII Art Generator
&lt;a href=&quot;https://www.seopojie.com&quot; target=&quot;_blank&quot;&gt;https://www.seopojie.com&lt;/a&gt; SPAM,SEO
————————————————
版权声明：本文为CSDN博主「CKCsec」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
原文链接：&lt;a href=&quot;https://blog.csdn.net/qq_46717339/article/details/122366277&quot; target=&quot;_blank&quot;&gt;https://blog.csdn.net/qq_46717339/article/details/122366277&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>