<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jason2020 (jason)</title>
    <link>http://beta.w2solo.com/jason2020</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>xiuyuantech 博客 – 免费电影在线观看的影视网站 (视飞影院 · Shiflix Cinima)</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;在这个信息爆炸的时代，你是否厌倦了在不同平台间反复切换，只为寻找一部符合心意的电影、电视剧或综艺？现在，只需访问 &lt;a href="https://shiflix.com" rel="nofollow" target="_blank"&gt;https://shiflix.com&lt;/a&gt;，一座包罗万象的线上影视宝库的大门便为您敞开。&lt;/p&gt;

&lt;p&gt;欢迎进入影视爱好者的终极乐园 —— Shiflix Cinima ! 🎬 ，官网：&lt;a href="https://shiflix.com" rel="nofollow" target="_blank"&gt;https://shiflix.com&lt;/a&gt; 。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/3189f842-eb6c-4b4e-b88e-6a187a5c7a7e.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Shiflix Cinima，是一处汇集海量高清影视资源的线上观影天地。这里不仅涵盖了电影、电视剧、综艺、动漫与短剧等多样化的内容分类，满足您全方位的娱乐需求；更以持续更新的资源库，致力于为您带来最新、最全的精彩节目。&lt;/p&gt;

&lt;p&gt;🎥 一站式全品类影视殿堂‌&lt;/p&gt;

&lt;p&gt;海量资源库‌：Shiflix Cinima 精心打造了‌电影、电视剧、综艺、动漫、短剧‌五大核心频道，全面覆盖您的观影需求。无论您是钟情于好莱坞大片的震撼视效，沉迷于长篇剧集的跌宕剧情，渴望在爆笑综艺中放松身心，还是向往二次元世界的无限幻想，甚至是追求短小精悍的短剧带来的快节奏爽感，这里应有尽有。
便捷导航体验‌：网站主页设计清晰直观，“查看更多” 入口让您轻松深入每一个影视类别，无需复杂搜索，畅快探索无尽精彩。&lt;/p&gt;

&lt;p&gt;🌟 沉浸式视听盛宴‌
为了带给您最身临其境的体验，我们强烈建议您在网站上直接预览：&lt;/p&gt;

&lt;p&gt;高光片段抢先看‌：在每个作品的详情页，我们精选了最扣人心弦的‌视频预告或高能片段‌。是动作场面的火爆刺激，还是情感爆发的细腻演绎？点击播放，瞬间点燃您的追看欲望。
精美视觉画廊‌：配合高清的‌精彩剧照、角色海报与场景海报‌，让您在按下播放键之前，就能通过视觉感受作品的风格与质感，快速找到自己的心头好。&lt;/p&gt;

&lt;p&gt;无需等待，无需犹豫。立即点击 &lt;a href="https://shiflix.com" rel="nofollow" target="_blank"&gt;https://shiflix.com&lt;/a&gt;， 开启您的专属刷片之旅吧！从经典重温到新作尝鲜，从大众流行到小众品味，Shiflix Cinima 永远是您身边最可靠、最全面的影视伙伴。期待在 Shiflix Cinima 为您开启一段愉悦的视听旅程。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/17597d4e-408a-49d5-a810-7d1404cacb2d.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 03 Apr 2026 17:52:19 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/7153</link>
      <guid>http://beta.w2solo.com/topics/7153</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 – 可参考借鉴的 Android 开发规范</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/ac41a6ea-f49c-4b0a-9f66-91776715c0de.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;参考 Google 官方 Java 代码风格规范，中文翻译参考版&lt;a href="https://gitee.com/github4k/fantasticmao_google-java-style-guide-zh_cn" rel="nofollow" target="_blank" title=""&gt;链接&lt;/a&gt;。
本文档用于指导开发人员在项目开发过程中类名、资源文件名、变量名等开发约定以及命名规范，方便工程的后期维护，提高代码整体质量、可读性。&lt;/p&gt;

&lt;p&gt;命名规范：&lt;/p&gt;

&lt;p&gt;注意：即使纯拼音命名方式也要避免采用。但 alibaba、taobao、youku、hangzhou 等国际通用的名称,可视同英文。&lt;/p&gt;

&lt;p&gt;1、包命名&lt;/p&gt;

&lt;p&gt;规则：包名全部小写，采用反域名命名规则，一级包名是顶级域名，通常为 com, edu, gov, net, org 等，二级包名，通过为公司名或部门名或者个人名，三级包名通常为项目名，四级包名为模块名或者层级名。&lt;/p&gt;

&lt;p&gt;2、类命名&lt;/p&gt;

&lt;p&gt;规则：采用大驼峰式命名法，首字母大写，尽量避免缩写，除非该缩写是众所周知的，比如 HTML，URL,如果类名称包含单词缩写，则单词缩写的每个字母均应大写。以下列举的是 android 中几种最为常用的类的命名。&lt;/p&gt;

&lt;p&gt;3、接口命名&lt;/p&gt;

&lt;p&gt;规则：命名规则与类命名一样采用大驼峰式命名法，首字母大写，多以 able, ible, er 结尾。&lt;/p&gt;

&lt;p&gt;注意：如果项目采用 MVP/MVI，所有 Model、View、Presenter/Intent 的接口都以 I 为前缀，不加后缀，其他的接口采用上述命名规则。&lt;/p&gt;

&lt;p&gt;4、方法&lt;/p&gt;

&lt;p&gt;规则：采用小驼峰命名法，首字母小写，方法名采用动词或动名词结构。方法的命名应该与方法的真正行为具有对应关系，下面给出一些方法名的动词前缀标示的建议。&lt;/p&gt;

&lt;p&gt;getXX() 获取某个属性的返回值 ；setXX()   设置某个属性值 ；initXX()   初始化方法，如初始化布局 initView() ；isXX()    判断是否 true 的方法；&lt;/p&gt;

&lt;p&gt;5、常量&lt;/p&gt;

&lt;p&gt;规则：常量使用全大写字母加下划线的方式命名。&lt;/p&gt;

&lt;p&gt;6、变量&lt;/p&gt;

&lt;p&gt;规则：采用小驼峰命名法，首字母小写。变量名应简短且能描述其用途，尽量避免拼音，无意义地缩写。除非是临时变量，否则不建议使用单个字符的变量名，如 i, j, k。对于变量命名，还有一种风格是 google 的以字母 m 为前缀（m 为 member 缩写），在 android 源码中随处可见。&lt;/p&gt;

&lt;p&gt;更多还可参考&lt;a href="https://developer.aliyun.com/ebook/7205/read?spm=a2c6h.26392459.ebook-detail.2.4e846de0oUUjdH" rel="nofollow" target="_blank" title=""&gt;阿里巴巴 Java 开发手册&lt;/a&gt;
注意：所有的 VO（值对象）统一采用标准的 lowerCamelCase 风格编写，所有的 DTO（数据传输对象）就按照接口文档中定义的字段名编写。&lt;/p&gt;


&lt;p&gt;&lt;/p&gt;
&lt;a target="_blank" href="https://www.vultr.com/?ref=8600727"&gt;&lt;img src="https://xiuyuantech.github.io/img/vultr_banner_728x90.webp" width="728" height="90" style="cursor:pointer;"&gt;&lt;/a&gt;
&lt;p&gt;&lt;/p&gt;


&lt;p&gt;7、控件变量名&lt;/p&gt;

&lt;p&gt;规则：首先需要满足第 6 条变量的规则， 模式：逻辑名 + view 缩写&lt;/p&gt;

&lt;p&gt;8、控件 ID&lt;/p&gt;

&lt;p&gt;规则：view 缩写&lt;u&gt;模块名&lt;/u&gt;逻辑名&lt;/p&gt;

&lt;p&gt;9、layout 的文件命名&lt;/p&gt;

&lt;p&gt;规则：全部小写，采用下划线命名法。layout 文件命名：组件类型&lt;u&gt;{模块&lt;/u&gt;}功能.xml&lt;/p&gt;

&lt;p&gt;10、drawable 的文件命名&lt;/p&gt;

&lt;p&gt;模式：前缀{&lt;u&gt;控件}{&lt;/u&gt;范围}{_后缀}，控件、范围、后缀可选&lt;/p&gt;

&lt;p&gt;11、动画的文件命名&lt;/p&gt;

&lt;p&gt;规则：模块名{范围}动画类型_动画方向。&lt;/p&gt;

&lt;p&gt;12、strings.xml&lt;/p&gt;

&lt;p&gt;模式：activity 名&lt;u&gt;{范围&lt;/u&gt;}逻辑名&lt;/p&gt;

&lt;p&gt;13、colors.xml&lt;/p&gt;

&lt;p&gt;模式：前缀{&lt;u&gt;控件}{&lt;/u&gt;范围}{_后缀}， 控件、范围、后缀可选。&lt;/p&gt;

&lt;p&gt;代码风格：&lt;/p&gt;

&lt;p&gt;原则&lt;/p&gt;

&lt;p&gt;不要直接忽略 Exceptions&lt;/p&gt;

&lt;p&gt;import 采用完全限定名&lt;/p&gt;

&lt;p&gt;if 括号风格&lt;/p&gt;

&lt;p&gt;使用空格来缩进：使用 4 个空格缩进来代表块，而绝不使用 tab 键； 使用 8 个空格来代表行包裹，包括函数调用。&lt;/p&gt;

&lt;p&gt;注释规范：&lt;/p&gt;

&lt;p&gt;类注释&lt;/p&gt;

&lt;p&gt;每个类完成后应该有作者姓名和联系方式的注释，对自己的代码负责。具体可以在 AS 中自己配制，Settings → Editor → File and Code Templates → Includes → File Header，输入自定义信息。&lt;/p&gt;

&lt;p&gt;方法注释&lt;/p&gt;

&lt;p&gt;每一个成员方法（包括自定义成员方法、覆盖方法、属性方法）的方法头都必须做方法头注释。
在方法前一行输入/** + 回车或者设置 Fix doc comment(Settings → Keymap → Fix doc comment) 快捷键，AS 便会帮你生成模板，我们只需要补全参数即可。&lt;/p&gt;

&lt;p&gt;块注释&lt;/p&gt;

&lt;p&gt;块注释与其周围的代码在同一缩进级别。它们可以是/* … /风格，也可以是// …风格 (//后最好带一个空格）。
对于多行的/ … /注释，后续行必须从开始， 并且与前一行的&lt;em&gt;对齐。注释不要封闭在由星号或其它字符绘制的框架里。Tip：在写多行注释时，如果你希望在必要时能重新换行 (即注释像段落风格一样)，那么使用/&lt;/em&gt; ... */。&lt;/p&gt;

&lt;p&gt;资源文件注释  例如 ： &amp;lt;!--红色 --&amp;gt;  &lt;/p&gt;

&lt;p&gt;总结：&lt;/p&gt;

&lt;p&gt;好的命名规则能够提高代码质量，使得新人加入时降低理解难度；&lt;/p&gt;

&lt;p&gt;规矩终究是死的，适合团队的才是最好的；&lt;/p&gt;

&lt;p&gt;命名规范需要团队齐心协力来维护，在团队里谁都不可能独善其身；&lt;/p&gt;

&lt;p&gt;刚刚开始可能会有些不习惯，持之以恒，总会成功的。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/da1a0f22-d30b-422f-87f3-64e462334421.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;原文地址：&lt;a href="https://xiuyuantech.github.io/2026/03/19/android-rule/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2026/03/19/android-rule/&lt;/a&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 20 Mar 2026 17:46:56 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/7084</link>
      <guid>http://beta.w2solo.com/topics/7084</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 – 谷歌官方 Jetpack 库学习记录</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/22c7457f-6e18-4a1a-87eb-768eb45662ec.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Jetpack 包含一系列 Android 库，它们都采用最佳做法并在 Android 应用中提供向后兼容性。
Jetpack 库可以单独使用，也可以组合使用，以满足应用的不同需求。
例如：
WorkManager - 满足您的后台调度需求。
Room - 实现数据存储持久性。
Navigation - 管理应用导航流程。
CameraX - 满足相机应用需求。&lt;/p&gt;

&lt;p&gt;实现方式
所有 Jetpack 组件都可在 Google Maven 代码库中找到。 在应用中使用
Jetpack 库：打开 settings.gradle 文件，将 google() 代码库添加到 dependencyResolutionManagement { repositories
{…}} 块中，如下所示：&lt;/p&gt;

&lt;p&gt;dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        jcenter()
    }
}&lt;/p&gt;

&lt;p&gt;如需详细了解如何使用 Jetpack，请查看以下页面：&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.android.google.cn/topic/libraries/architecture?hl=zh-cn" rel="nofollow" target="_blank" title=""&gt;Android 架构组件&lt;/a&gt;
&lt;a href="https://developer.android.google.cn/jetpack/androidx/explorer?hl=zh-cn" rel="nofollow" target="_blank" title=""&gt;Jetpack 组件的完整列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/598b79d8-f5e9-4bd2-b203-bd16cfae00f2.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;从零到一搭建
我的 Demo 采用 MVVM 的设计模式，框架图如下：&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/c12661bc-b624-4593-863f-6cba994e80b1.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Jetpack 组件：&lt;/p&gt;

&lt;p&gt;Navigation：一个用于管理 Fragment 切换的工具类，可视化、可绑定控件、支持动画等是其优点。
Data Binding：不用说，都知道，加速 MVVM 的创建。
Lifecycle：虽然我没有写文章介绍，但是不代表它的作用不够强大，他是我们能够处理 Activity 和 Fragment 的生命周期的重要原因，在 AndroidX 的 Fragment 和 Activity 已经对 Lifecycle 提供了默认支持。&lt;/p&gt;

&lt;p&gt;ViewModel：当做 MVVM 的 ViewModel 层，并具有声明周期意识的处理和 UI 相关的数据。
LiveData：同 RxJava 的作用一样，对数据进行监听，优点就是无需处理生命周期、无内存泄漏等。
Room：强大的 ORM 数据库框架。
Paging：易于使用的数据分页库，支持 RecyclerView。
WorkManager：灵活、简单、延迟和保证执行的后台任务处理库&lt;/p&gt;

&lt;p&gt;使用踩坑&lt;/p&gt;

&lt;p&gt;LiveData
优点：对数据进行监听，拥有可观察、生命周期感知、、无内存泄漏等的特点。 缺点：&lt;/p&gt;

&lt;p&gt;只能在主线程中订阅和移除观察者
数据丢失问题,在数据生产速度 &amp;gt; 数据消费速度时，LiveData 无法观察者能够接收到全部数据。比如在子线程大量 postValue 数据但主线程消费跟不上时，中间就会有一部分数据被忽略。
在 Fragment 中出现 LiveData 同样数据多次回调的问题,针对这个问题，Google 一位大神在 Stack Overflow 实现了一个复写类 SingleLiveEvent.
observeForever 和 removeObserver 方法要配套使用,否则会导致内存泄漏问题
LiveData 天生就是粘性的,当我们重复订阅的时候,会返回最后一次结果. UnPeek-LiveData 开源库可以解决这个问题。 LiveData 的替代者： RxJava： RxJava
是第三方组织 ReactiveX 开发的组件，Rx 是一个包括 Java、Go 等语言在内的多语言数据流框架。功能强大是它的优势，支持大量丰富的操作符，也支持线程切换和背压。然而 Rx
的学习门槛过高，对开发反而是一种新的负担，也会带来误用的风险。 Kotlin Flow： Kotlin Flow 是基于 Kotlin 协程基础能力搭建的一套数据流框架，从功能复杂性上看是介于
LiveData 和 RxJava 之间的解决方案。Kotlin Flow 拥有比 LiveData 更丰富的能力，但裁剪了 RxJava 大量复杂的操作符，做得更加精简。并且在 Kotlin
协程的加持下，Kotlin Flow 目前是 Google 主推的数据流框架。&lt;/p&gt;

&lt;p&gt;Room
数据库加密不友好，推荐使用 saferoom 开源库适配
数据库版本升级迁移不友好，仅支持增删列字段，增删索引必须删除表重新创建; 新增字段必须添加默认值,建议项目创建时就添加默认值,索引一个字段单独使用普通索引,不建议使用联合索引即 Index(字段 1,字段 2);&lt;/p&gt;

&lt;p&gt;Paging
仅适合加载查看数据的场景，不适合增删改的场景且无增删改方法。一旦增删改之后,Paging 分页逻辑将失去作用。
界面不可见后一段时间切回来时会重新加载数据。 解决方法： 1) 对 PagingFlow 添加 cacheIn(viewModelScope)。 2) 不使用 CoroutineLiveData，直接用
lifecycleScope.launchWhenCreated 和 flow 来接收 PagingData 数据。&lt;/p&gt;

&lt;p&gt;WorkManager
适配 android12，版本必须在 2.7.1 之上
定时任务不一定准时执行，但一定会执行&lt;/p&gt;

&lt;p&gt;总结
1.Android Jetpack 组件中的很多库都对其他库提供了支持，比如 Room 和 Paging 就对 LiveData 提供了支持。
2.向后兼容：基本上每个组件都对低版本提供了支持。支持 RxJava：由于 RxJava 强大的生态环境，几乎和数据相关的组件都对 RxJava 提供了支持。
3.减少代码量：以 Data Binding + ViewModel + LiveData 或 RxJava 构建的 MVVM 模式能够显著减少代码量，比较平时使用的 MVP 模式也会更加方便，无需主动更新 UI。
4.无需捆绑：Android Jetpack 系列组件可以无需捆绑使用，你如果只想用里面的单个库，那么就可以仅仅依赖一个库。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/cf2da15b-819e-4c37-819d-7c0c76d5531d.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 23 Jan 2026 19:01:06 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6848</link>
      <guid>http://beta.w2solo.com/topics/6848</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 – 独立开发必会的组件化架构开发</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/9a606d6c-39fb-496b-9cf0-8325923ac42c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;前言&lt;/p&gt;

&lt;p&gt;在 Android 开发中，组件化‌是将一个大型应用程序拆分成多个独立的组件，每个组件都是一个相对独立、可复用的单元。
组件化强调的是减少组件之间的耦合，提高代码的可维护性和可测试性。
每个组件可以独立开发、测试和编译，组件之间通过定义接口和调用 API 的方式进行通信和交。
组件化的优势包括：
‌提高开发效率‌：解耦，多个小团队可以并行开发不同的组件。
‌提高代码复用性‌：不同的组件可以通过接口和 API 进行通信和交互。
‌提高系统稳定性‌：每个组件可以独立运行，一个组件的崩溃不会影响整个系统‌。&lt;/p&gt;

&lt;p&gt;模块化、插件化区别&lt;/p&gt;

&lt;p&gt;1.‌模块化‌是将一个应用程序按照功能或业务领域划分为多个相互独立、低耦合的模块。每个模块专注于实现特定的功能或解决特定的问题。模块化强调的是功能的分离和模块之间的独立性。&lt;/p&gt;

&lt;p&gt;模块化的优势包括：
‌清晰的结构‌：使得代码结构更清晰、易于理解和维护。
‌促进重用和扩展‌：模块化的设计可以促进代码的重用和扩展‌。&lt;/p&gt;

&lt;p&gt;2.插件化‌是将一个应用程序拆分成多个独立的插件，每个插件可以独立开发、测试、编译和发布。插件化强调的是功能的动态加载和卸载，以及功能的动态更新。&lt;/p&gt;

&lt;p&gt;插件化的优势包括：
‌功能扩展‌：通过加载和卸载插件，可以动态地扩展宿主应用程序的功能。
‌灵活性‌：插件可以独立开发和测试，不需要修改宿主应用程序的代码。
‌动态更新‌：插件可以在运行时动态加载和卸载，实现功能的动态更新‌。&lt;/p&gt;

&lt;p&gt;企业大多常用组件化架构进行开发，也仅有国内部分企业使用插件化开发。不过随着 Android 版本迭代更新，权限越来越严格插件化将受到限制。&lt;/p&gt;

&lt;p&gt;问题&lt;/p&gt;

&lt;p&gt;组件分层：怎么将一个项目分成多个组件、组件间的依赖关系是怎么样的?&lt;/p&gt;

&lt;p&gt;组件单独运行和集成调试：组件是如何独立运行和集成调试的？&lt;/p&gt;

&lt;p&gt;组件间通信:主项目与组件、组件与组件之间如何通信的?&lt;/p&gt;

&lt;p&gt;业务组件不能反向依赖壳工程，如何获取 Application 实例、如何获取 Application onCreate() 回调（用于任务初始化）?&lt;/p&gt;

&lt;p&gt;&lt;img src="https://xiuyuantech.github.io/img/module_architecture.webp" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;根据上面的组件化架构图，组件分为 基础组件、业务功能组件、业务组件。&lt;/p&gt;

&lt;p&gt;基础组件，不用多说，就是基础功能，例如网络请求、日志框架、图片加载，这些与业务毫无关联，可用于公司所有项目，是底层最稳定的组件。&lt;/p&gt;

&lt;p&gt;业务功能组件，主要是供业务组件依赖使用，例如 分享、支付组件，通常是一个完整的功能，是较为最稳定的组件。&lt;/p&gt;

&lt;p&gt;业务组件，完整的业务块，例如前面提到京东的 “首页”、“分类”、“发现”、“购物车”、“我的”。&lt;/p&gt;

&lt;p&gt;项目搭建&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;单工程方案&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gradle.properties / 新增config.gradle 中配置 &lt;/span&gt;
&lt;span class="n"&gt;isDebug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="n"&gt;独立调试&lt;/span&gt;

&lt;span class="c1"&gt;//app/library build.gradle中配置,若在config.gradle中配置则需要添加 apply from:"config.gradle"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDebug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toBoolean&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
    &lt;span class="c1"&gt;//构建后输出一个 APK 安装包&lt;/span&gt;
    &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;android&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;application&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//构建后输出 ARR 包&lt;/span&gt;
    &lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;android&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;library&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;defaultConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDebug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toBoolean&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="c1"&gt;//独立调试的时候才能设置applicationId&lt;/span&gt;
            &lt;span class="n"&gt;applicationId&lt;/span&gt; &lt;span class="s"&gt;"com.demo.module.collect"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;sourceSets&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isDebug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toBoolean&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;//独立调试&lt;/span&gt;
                &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;srcFile&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;AndroidManifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xml&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;//集成调试&lt;/span&gt;
                &lt;span class="n"&gt;manifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;srcFile&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;AndroidManifest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xml&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;多工程方案
多工程方案，业务组件以 library module 形式存在于独立的工程。
&lt;code&gt;java
// settings.gradle 中配置 
include ":app"，
include ":app_pay"，
&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src="https://xiuyuantech.github.io/img/module_demo_capture.jpg" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;总结&lt;/p&gt;

&lt;p&gt;总之任何项目开发组件化都是在项目发展到一定规模后必定要使用的技术，学习至完全掌握是非常必要的。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/94078393-8d2e-4bb4-be7e-b788c0230192.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Thu, 01 Jan 2026 19:22:56 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6758</link>
      <guid>http://beta.w2solo.com/topics/6758</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 注解处理器 APT (Annotation Processing Tool)</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/77377fbe-b4c6-497c-8670-4ef96893d059.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;注解处理器是一种处理注解的工具，确切的说它是 javac 的一个工具，它用来在编译时扫描和处理注解。
注解处理器以 Java 代码 (或者编译过的字节码) 作为输入,生成.java 文件作为输出,减少手动的代码输入。
简单来说就是在编译期,通过注解生成.java 文件。比如我们经常用的轮子 Dagger2, ButterKnife,
EventBus 都在用，我们要紧跟潮流来看看 APT 技术的来龙去脉。&lt;/p&gt;

&lt;p&gt;实现方式
创建 Android Module 命名为 app
创建 Java library Module 命名为 apt-annotation
创建 Java library Module 命名为 apt-processor 依赖 apt-annotation
创建 Android library Module 命名为 apt-library 依赖 apt-annotation、auto-service
可选 compileOnly files(org.gradle.internal.jvm.Jvm.current().getToolsJar())&lt;/p&gt;

&lt;p&gt;注意不可都放在一个 Module 中，放在一个 Module 中不会生效!&lt;/p&gt;

&lt;p&gt;功能主要分为三个部分&lt;/p&gt;

&lt;p&gt;apt-annotation：存放自定义注解
apt-processor：注解处理器，根据 apt-annotation 中的注解，在编译期生成 xxx.java 代码
apt-library：工具类，实现业务逻辑的绑定。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://xiuyuantech.github.io/img/android-apt.webp" alt="结构图"&gt;&lt;/p&gt;

&lt;p&gt;apt-annotation (自定义注解)&lt;/p&gt;

&lt;p&gt;&lt;a href="/Retention" class="user-mention" title="@Retention"&gt;&lt;i&gt;@&lt;/i&gt;Retention&lt;/a&gt;(RetentionPolicy.CLASS)：表示编译时注解
&lt;a href="/Target" class="user-mention" title="@Target"&gt;&lt;i&gt;@&lt;/i&gt;Target&lt;/a&gt;(ElementType.FIELD)：表示注解范围为类成员（构造方法、方法、成员变量）&lt;/p&gt;

&lt;p&gt;&lt;a href="/Retention" class="user-mention" title="@Retention"&gt;&lt;i&gt;@&lt;/i&gt;Retention&lt;/a&gt;： 定义被保留的时间长短
RetentionPoicy.SOURCE、RetentionPoicy.CLASS、RetentionPoicy.RUNTIME
&lt;a href="/Target" class="user-mention" title="@Target"&gt;&lt;i&gt;@&lt;/i&gt;Target&lt;/a&gt;： 定义所修饰的对象范围
TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE 等&lt;/p&gt;

&lt;p&gt;apt-processor (注解处理器)&lt;/p&gt;

&lt;p&gt;添加依赖&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;annotation&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;service:&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rc4&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;annotationProcessor&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;service:&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rc4&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;compileOnly&lt;/span&gt; &lt;span class="nf"&gt;files&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gradle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;internal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jvm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Jvm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;current&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getToolsJar&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="c1"&gt;//optional&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;自定义处理器 BindViewProcessor&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@AutoService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Processor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BindViewProcessor&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AbstractProcessor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Messager&lt;/span&gt; &lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Trees&lt;/span&gt; &lt;span class="n"&gt;trees&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;TreeMaker&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ProcessingEnvironment&lt;/span&gt; &lt;span class="n"&gt;processingEnv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processingEnv&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;messager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;processingEnv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMessager&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;trees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Trees&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processingEnv&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Context&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nc"&gt;JavacProcessingEnvironment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;processingEnv&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getContext&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;maker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TreeMaker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TypeElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;RoundEnvironment&lt;/span&gt; &lt;span class="n"&gt;roundEnv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;roundEnv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processingOver&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Element&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;roundEnv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRootElements&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Element&lt;/span&gt; &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKind&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;ElementKind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CLASS&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="nc"&gt;JCTree&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;trees&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTree&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCClassDecl&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(((&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCClassDecl&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                                    &lt;span class="s"&gt;"WebAppInterface"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                                &lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Insert&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
                                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                            &lt;span class="o"&gt;}&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Insert&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;TreeTranslator&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Messager&lt;/span&gt; &lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;TreeMaker&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Insert&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Messager&lt;/span&gt; &lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;TreeMaker&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Table&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;messager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maker&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="nd"&gt;@Override&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;visitMethodDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCMethodDecl&lt;/span&gt; &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visitMethodDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;isVisited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mods&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mods&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCAnnotation&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mods&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCAnnotation&lt;/span&gt; &lt;span class="n"&gt;annotation&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;annotation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;annotationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"JavascriptInterface"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;isVisited&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isVisited&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="n"&gt;invokeMethod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nil&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                        &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Select&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Ident&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mWebActivity"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                                &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                                        &lt;span class="s"&gt;"getCurrentUrl"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nil&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCVariableDecl&lt;/span&gt; &lt;span class="n"&gt;statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;makeVarDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Modifiers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"surl"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;memberAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"java.lang.String"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;invokeMethod&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="n"&gt;invokeMethod1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Apply&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memberAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"java.lang"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                                &lt;span class="s"&gt;".String"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;memberAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"java.lang.String"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                        &lt;span class="n"&gt;memberAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.dxdxmm.app.component.web.WebBridgeHelperKt"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                                &lt;span class="s"&gt;".isHostVerify"&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Ident&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"surl"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                                &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Literal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;())));&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCVariableDecl&lt;/span&gt; &lt;span class="n"&gt;statement1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;makeVarDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Modifiers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"verify"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TypeIdent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TypeTag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BOOLEAN&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;invokeMethod1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCIf&lt;/span&gt; &lt;span class="n"&gt;statement2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;If&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Ident&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"verify"&lt;/span&gt;&lt;span class="o"&gt;)),&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Skip&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCReturn&lt;/span&gt; &lt;span class="n"&gt;statement3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Return&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Literal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCReturn&lt;/span&gt; &lt;span class="n"&gt;statement4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Return&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Literal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

                &lt;span class="nc"&gt;ListBuffer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCStatement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;statements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ListBuffer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;init&amp;gt;"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restype&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"String"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                            &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement4&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restype&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"boolean"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                            &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;append&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;statement3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                        &lt;span class="o"&gt;}&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCBlock&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Block&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;statements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MethodDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getModifiers&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                        &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()),&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;restype&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;typarams&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;thrown&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;jcMethodDecl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultValue&lt;/span&gt;
                &lt;span class="o"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;note&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCVariableDecl&lt;/span&gt; &lt;span class="nf"&gt;makeVarDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCModifiers&lt;/span&gt; &lt;span class="n"&gt;modifiers&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                                 &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="n"&gt;vartype&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                                 &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VarDef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;modifiers&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
                    &lt;span class="n"&gt;vartype&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;init&lt;/span&gt;
            &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="nf"&gt;memberAccess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;componentArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"\\."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;JCTree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JCExpression&lt;/span&gt; &lt;span class="n"&gt;expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Ident&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;componentArray&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]));&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;componentArray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Select&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;componentArray&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]));&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;note&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;messager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Diagnostic&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Kind&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOTE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getSupportedAnnotationTypes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;HashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;supportTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedHashSet&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;supportTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WebModule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCanonicalName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;supportTypes&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;SourceVersion&lt;/span&gt; &lt;span class="nf"&gt;getSupportedSourceVersion&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;SourceVersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;latestSupported&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;init：初始化。可以得到 ProcessingEnviroment，ProcessingEnviroment 提供很多有用的工具类 Elements, Types 和 Filer
getSupportedAnnotationTypes：指定这个注解处理器是注册给哪个注解的，这里说明是注解 BindView
getSupportedSourceVersion：指定使用的 Java 版本，通常这里返回 SourceVersion.latestSupported()
process：可以在这里写扫描、评估和处理注解的代码，生成 Java 文件&lt;/p&gt;

&lt;p&gt;Messager : 日志打印类，有利于分析
Trees : 抽象语法树
TreeMaker : 抽象语法树操作类
Name.Table : 命名表,可根据名称找到对应的方法，变量，类
TreeTranslator : 抽象语法树转换器,可修改方法，变量，类&lt;/p&gt;

&lt;p&gt;其他类不熟悉的自行查询，这里就不一一介绍了。&lt;/p&gt;

&lt;p&gt;完成了 Processor 的部分，基本就大功告成了。&lt;/p&gt;

&lt;p&gt;apt-library 工具类 可选&lt;/p&gt;

&lt;p&gt;在 App Module 的 build.gradle 中添加依赖&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="nf"&gt;project&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;annotation&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建注解工具类 BindViewTools&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BindViewTools&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;clazz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;bindViewClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clazz&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"_ViewBinding"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bindViewClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bind"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bindViewClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;activity&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ClassNotFoundException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IllegalAccessException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InstantiationException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;NoSuchMethodException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InvocationTargetException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;```&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;
&lt;span class="n"&gt;通过javapoet生成代码&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;

&lt;span class="n"&gt;添加依赖&lt;/span&gt;
&lt;span class="err"&gt;```&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;
&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;squareup&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;javapoet:&lt;/span&gt;&lt;span class="mf"&gt;1.10&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建 ClassCreatorProxy&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ClassCreatorProxy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//省略部分代码...&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * 创建Java代码
     * @return
     */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;TypeSpec&lt;/span&gt; &lt;span class="nf"&gt;generateJavaCode2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;TypeSpec&lt;/span&gt; &lt;span class="n"&gt;bindingClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;TypeSpec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;classBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mBindingClassName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addModifiers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PUBLIC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generateMethods2&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bindingClass&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * 加入Method
     */&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;MethodSpec&lt;/span&gt; &lt;span class="nf"&gt;generateMethods2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ClassName&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ClassName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bestGuess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mTypeElement&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getQualifiedName&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;MethodSpec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt; &lt;span class="n"&gt;methodBuilder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MethodSpec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"bind"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addModifiers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PUBLIC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;returns&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addParameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"host"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mVariableElementMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;VariableElement&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mVariableElementMap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSimpleName&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asType&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;methodBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"host."&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;")(((android.app.Activity)host).findViewById( "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"));"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;methodBuilder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;


    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getPackageName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mPackageName&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用自定义注解&lt;/p&gt;

&lt;p&gt;使用工具类时：&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestActivity&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppCompatActivity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@BindView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;TextView&lt;/span&gt; &lt;span class="n"&gt;textView&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Nullable&lt;/span&gt; &lt;span class="nc"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;BindViewTools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不使用工具类,只修改某个方法时：&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@BindView&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestActivity&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppCompatActivity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;TextView&lt;/span&gt; &lt;span class="n"&gt;textView&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@Nullable&lt;/span&gt; &lt;span class="nc"&gt;Bundle&lt;/span&gt; &lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onCreate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;savedInstanceState&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setContentView&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@JavascriptInterface&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;

    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/da119cc2-0e48-452f-8785-b337b2a5e77f.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 12 Dec 2025 18:51:13 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6640</link>
      <guid>http://beta.w2solo.com/topics/6640</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 自定义帧动画</title>
      <description>&lt;p&gt;xiuyuantech 博客：&lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/4f69fa91-a95a-44c3-8f58-befc8bc9d473.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;帧动画非常容易理解，其实就是简单的由 N 张静态图片收集起来，然后我们通过控制依次显示 这些图片，因为人眼"视觉残留"的原因，
会让我们造成动画的"错觉"，跟放电影的原理一样！&lt;/p&gt;

&lt;p&gt;Android 中实现帧动画，有如下两种方式：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;代码方式 &lt;/p&gt;

&lt;p&gt;通过 AnimationDrawable 的 addFrame(Drawable frame, int duration) : 添加一帧，并设置该帧显示的持续时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;xml 方式&lt;/p&gt;

&lt;p&gt;在 Drawable 资源文件中创建帧动画 xml 文件 frame_animation.xml。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;优点：目前这两种方式适合场景简单，图片资源较少的情况。
当动画要求酷炫复杂时，使用这两种方式会导致内存异常！&lt;/p&gt;

&lt;p&gt;缺点：同时加载多张图片，占用内存资源比较大。&lt;/p&gt;

&lt;p&gt;代码详情请参考文章 - &lt;a href="https://xiuyuantech.github.io/2020/10/24/optimise-frame-animation/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2020/10/24/optimise-frame-animation/&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/f61ae68c-4709-42b3-991e-5682e13fe95a.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 14 Nov 2025 18:42:30 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6557</link>
      <guid>http://beta.w2solo.com/topics/6557</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 教你自定义 View 组件</title>
      <description>&lt;p&gt;xiuyuantech 博客：&lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/afab2b28-f948-4635-8f7e-8a967b449373.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;作为 Android 开发工程师一定会遇到一些特殊或者酷炫 UI 需求，当系统提供的 View 无法实现时，我们可以通过自定义 View 来实现。
自定义 View 大概可以分为组合 View、继承系统已有 View 组件 (例如 TextView) 和继承 View 或者 ViewGroup 三大类。&lt;/p&gt;

&lt;p&gt;想要实现自定义 View 需要了解哪些东西呢，请下面&lt;/p&gt;

&lt;p&gt;
 1、 生命周期
 2、 坐标系
 3、自定义属性
&lt;/p&gt;

&lt;p&gt;详情请参考这个博客文章 - &lt;a href="https://xiuyuantech.github.io/2020/06/28/how-to-customize-view/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2020/06/28/how-to-customize-view/&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/660ae138-452f-4f06-8c25-e1078791546d.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 07 Nov 2025 18:48:37 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6539</link>
      <guid>http://beta.w2solo.com/topics/6539</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 – 还有人学习 Android 吗</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/b32b4ad4-ebfc-40e2-b41f-14825368ac72.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;不得不说，前几年的移动端的开发很火，而现在明显降温了，对人才的要求也越来越苛刻，但我并不认同，因为我看到各大招聘网站 Android 跟 iOS 开发的职位跟其他岗位的招聘比并没有少，所以所谓的「饱和」只是一种从「疯狂」到「正常」的错觉而已。&lt;/p&gt;

&lt;p&gt;这个也是很多人的疑问，说投了很多简历，都没有回应，总感觉今年工作特别难找。这个在这里解释下原因：&lt;/p&gt;

&lt;p&gt;1.从 15 年下半年开始，中国经济特别差，企业亏损严重，股票大跌，投资人手上也没多少现金了，所以看到 16 年下半年很多公司倒闭，老板跑路，如果你仔细观察，应该能发现小城市经济更差。&lt;/p&gt;

&lt;p&gt;2.因为移动开发前几年的火爆，导致很多新兴的培训机构大举招聘移动开发，所以这几年你会发现培训 iOS、Android 开发的人特别多，质量也是越来越差，现在很多培训的都是伪造简历来求职，所以你会发现应届生、没工作经验的人找工作较难些，因为没工作经验的初级太多了，而现在企业也优先选择有工作经验的，现在再也不像几年前招不到人需要自己培养了，现在可选的人一大把，我为什么要先招进来再培养你呢？&lt;/p&gt;

&lt;p&gt;所以综上，真的别杞人忧天，沉下心来学好基础，提升技能比什么都重要，如果你找不到工作，只能说你学的还不够好，或者能力还不达标，并不能说明没有这个岗位的招聘，以个人能力的不行来否定整个市场的需求是弱者的行为！&lt;/p&gt;

&lt;p&gt;参考这个博客文章 - &lt;a href="https://xiuyuantech.github.io/2020/06/20/how-to-learn-android/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2020/06/20/how-to-learn-android/&lt;/a&gt;，或许对你有所帮助。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/448efd58-54b7-4995-8c32-d1c8a441d59e.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 24 Oct 2025 18:26:22 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6453</link>
      <guid>http://beta.w2solo.com/topics/6453</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 – 状态栏 和 NavigationBar 栏 Height 避坑</title>
      <description>&lt;p&gt;xiuyuantech 博客： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/14c755fa-273c-48bd-9c83-e21fb559fbc8.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Android 状态栏相关的文章网上一大堆，但是讲解导航栏的文章大多有系统兼容性问题。
xiuyuantech 博客将讲解如何准确获取导航栏高度，并且兼容性更好。现在大部分的手机都没有底部虚拟导航键了，但是还是有些手机厂商依然在发布带虚拟导航键的手机。既然有，开发者就得去适配，我遇到比较麻烦的一个问题是获取屏幕（除了虚拟导航键以外的内容显示区域）高度（content）。当时想着网上查找资料，判断是否有导航键。但是没有找到有效的方法。最后只能转变思路，通过 debug、看源码来获取高度来判断是否有导航键。具体参考这个博客文章 - &lt;a href="https://xiuyuantech.github.io/2020/05/23/android-navigationbar/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2020/05/23/android-navigationbar/&lt;/a&gt;，或许对你有所帮助。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/fad63020-3d4a-409c-bb1f-c4bd6a231d9d.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 17 Oct 2025 18:45:02 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6414</link>
      <guid>http://beta.w2solo.com/topics/6414</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 截屏 MediaProjection 避坑</title>
      <description>&lt;p&gt;xiuyuantech 博客 ： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/4267eb0a-05b0-4b3f-b381-2ad372e35ebe.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Android 5.0 以上提供了 MediaProjection，方便截屏录屏等功能。在工作过程中一般系统提供的 API 即可以满足我们的需求，但是特殊的情况下无法满足本文将通过 MediaProjection 实现截屏功能以及解决遇到的问题。经过查阅资料以及官方文档，从 Android 5.0 开始官方提供了系统级的 MediaProjection API。MediaProjection 不仅可以进行系统级的截屏还支持屏幕录制。常规的写法或者网上的代码可以实现截屏功能，但是生成的图片会有黑边的问题。解决方法参考文章 - &lt;a href="https://xiuyuantech.github.io/2020/05/04/android-screenshot-media-projection/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2020/05/04/android-screenshot-media-projection/&lt;/a&gt;，或许对你有所帮助。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/6d9a5c7d-db43-447d-8772-af81f5b7149d.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 10 Oct 2025 18:43:22 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6376</link>
      <guid>http://beta.w2solo.com/topics/6376</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 无障碍服务 Accessibility 之 Talkback</title>
      <description>&lt;p&gt;xiuyuantech 博客 ： &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/9daaf65a-b826-4c0d-a43b-3050267b869d.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Android 应用的目标应该是让所有人都可以使用，包括具有无障碍功能需求的人。但某些使用 Android 设备的用户具有不同于他人的无障碍功能需求。为了帮助具有共同的无障碍功能需求的特定人群，Android 框架为开发者创建无障碍服务提供了相关功能。由于某些特殊情况无法满足如 TV 端，在聚焦的时候焦点、语音无法对应上，如果你遇到这样的伪问题，赶快来看看这个技术文章吧 - &lt;a href="https://xiuyuantech.github.io/2025/05/02/android-talkback/" rel="nofollow" target="_blank" title=""&gt;无障碍服务 Accessibility&lt;/a&gt; ，或许对你有所帮助。&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/4929053f-ccab-4be7-a1f5-23083f618e26.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Tue, 30 Sep 2025 17:24:07 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6348</link>
      <guid>http://beta.w2solo.com/topics/6348</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 如何才能稳定进行 google 搜索</title>
      <description>&lt;p&gt;搜索引擎最大最好用的便是 google，但国内被封锁如何才能使用呢？&lt;/p&gt;

&lt;p&gt;看完下面这个篇 xiuyuantech 博客再决定，里面有详细介绍。&lt;/p&gt;

&lt;p&gt;xiuyuantech 博客：&lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt;
&lt;img src="https://img.way2solo.com/photo/jason2020/c65ff4d2-e19a-4a16-b23d-b38175f1e5d7.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;想要 google 搜索通常是需要翻墙，网上免费的软件和线路大多数是不稳定的。&lt;/p&gt;

&lt;p&gt;那么我们是自建 VPS 还是购买 VPN 呢 ，看完这篇博客再决定，直达链接：&lt;a href="https://xiuyuantech.github.io/2025/08/16/how-to-buy-vpn/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2025/08/16/how-to-buy-vpn/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;业务咨询：&lt;a href="https://soloist.pages.dev" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/63a1575b-587f-4ed1-874b-85185117ee24.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 19 Sep 2025 17:53:38 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6306</link>
      <guid>http://beta.w2solo.com/topics/6306</guid>
    </item>
    <item>
      <title>xiuyuantech 博客 - 新能源车 or 燃油车</title>
      <description>&lt;p&gt;xiuyuantech 博客：&lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目前如火如荼的新能源车诡病很多，很多人在买车大的时候都不知道该买哪种车比较好。&lt;/p&gt;

&lt;p&gt;现在 xiuyuantech 博客给大家分析如下：&lt;/p&gt;

&lt;p&gt;博客直达链接：&lt;a href="https://xiuyuantech.github.io/2025/08/10/life-newcar/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/2025/08/10/life-newcar/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/f976ae65-e861-4635-a0cb-149c92a30813.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 12 Sep 2025 17:41:25 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6286</link>
      <guid>http://beta.w2solo.com/topics/6286</guid>
    </item>
    <item>
      <title>XiuyuanTech 博客 —— 深度与实用并存的技术分享平台</title>
      <description>&lt;p&gt;&lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt;, 全栈技术专栏全景指南，涉及 Android/iOS/Vue2/小程序/SpringBoot/Uniapp/Flutter 技术解析和案例分享，聚焦高效开发与性能优化。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xiuyuantech.github.io/"&gt;XiuyuanTech&lt;/a&gt; 博客 是一个专注于分享前沿技术实践与深度思考，聚焦前沿技术实践的高质量个人博客，内容涵盖人工智能、软件开发、系统架构等领域。博主以扎实的技术功底和清晰的逻辑分析，为读者提供原理解析 + 实战代码 + 架构设计‌的高质量的技术文章，适合开发者、工程师及技术爱好者阅读学习。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/49744f6c-5c03-4487-83fe-7a65af88c0bd.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;一、多端技术体系与核心内容‌&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;移动端开发‌&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;‌Android 性能攻坚‌&lt;/p&gt;

&lt;p&gt;内存泄漏治理：LeakCanary 实战与 Hprof 分析技巧
渲染优化：SurfaceView 与 TextureView 应用场景解析
多线程架构：HandlerThread 与协程的混合编程模型&lt;/p&gt;

&lt;p&gt;‌iOS 深度优化‌&lt;/p&gt;

&lt;p&gt;Objective-C 与 Swift 混编陷阱：内存管理策略对比
CoreAnimation 性能调优：离屏渲染检测与修复方案
网络层设计：基于 URLSession 的断点续传实现&lt;/p&gt;

&lt;p&gt;‌2. 前端技术栈‌&lt;/p&gt;

&lt;p&gt;‌Vue2 企业级实践‌&lt;/p&gt;

&lt;p&gt;响应式原理深度解析：Object.defineProperty 的监听局限
Webpack 打包优化：Tree Shaking 与 Code Splitting 实战
状态管理方案：Vuex 模块化设计与持久化策略&lt;/p&gt;

&lt;p&gt;‌小程序开发进阶‌&lt;/p&gt;

&lt;p&gt;性能优化：setData 调用频率控制与差分更新算法
安全防护：反编译加固与敏感数据加密方案
多平台适配：Taro 框架条件编译技巧&lt;/p&gt;

&lt;p&gt;‌3. 跨平台与后端技术‌&lt;/p&gt;

&lt;p&gt;‌Flutter 混合开发‌&lt;/p&gt;

&lt;p&gt;PlatformView 与原生组件的通信性能瓶颈突破
Isolate 线程模型：Dart 并发编程实践指南
热更新方案：动态化代码加载与版本回滚机制&lt;/p&gt;

&lt;p&gt;‌Uniapp 实战要点‌&lt;/p&gt;

&lt;p&gt;原生插件开发：Android/iOS 双端能力扩展
渲染性能优化：减少节点层级的样式设计原则
多端差异处理：条件编译与运行时环境判断&lt;/p&gt;

&lt;p&gt;‌SpringBoot 高并发设计‌&lt;/p&gt;

&lt;p&gt;JVM 调优：G1 垃圾回收器参数配置实战
分布式锁：Redisson 与 Zookeeper 方案对比
接口安全：OAuth2.0 与 JWT 的集成实践&lt;/p&gt;

&lt;p&gt;二、多端技术体系与核心内容&lt;/p&gt;

&lt;p&gt;‌Android 线程同步难题‌：Handler 内存泄漏的弱引用解决方案
‌Vue2 响应式缺陷‌：数组变异方法的 hack 实现原理
‌小程序启动优化‌：分包预下载与主包体积控制策略
‌Flutter 热重载失效‌：状态保持与 Widget 树重建的平衡点
‌Uniapp 原生交互‌：JSBridge 通信协议的封装设计&lt;/p&gt;

&lt;p&gt;三、商务合作：&lt;a href="https://soloist.pages.dev/" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/a276ca1f-4c7b-4253-b208-0531d8eb3324.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Thu, 28 Aug 2025 10:49:21 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6195</link>
      <guid>http://beta.w2solo.com/topics/6195</guid>
    </item>
    <item>
      <title>ArkUI-X：鸿蒙生态的跨平台开发新方案解析</title>
      <description>&lt;p&gt;来自&lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt; ：&lt;/p&gt;

&lt;p&gt;ArkUI-X 是华为推出的跨平台 UI 开发框架，基于 ArkUI 扩展至 OpenHarmony、Android、iOS 等多平台，支持 “一次开发，多端部署”。其核心特性包括：&lt;/p&gt;

&lt;p&gt;‌声明式语法‌：简化 UI 开发流程，提升代码可读性。
‌高效渲染‌：平台一致性渲染机制，保障性能体验。
‌动态化支持‌：运行时按需加载模块（如 HSP），优化包体积。
‌模块化设计对比‌&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/144f5202-837a-45cb-aa1c-32fd15640722.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;类型  功能描述    适用场景
HAP 鸿蒙能力包，主模块/功能模块独立  应用基础功能与入口
HSP 动态共享包，代码资源复用    多模块共用逻辑
HAR 静态共享包，发布为二方/三方库 跨工程共享组件与资源
开发实践与避坑‌&lt;/p&gt;

&lt;p&gt;‌MVVM 架构‌：通过&lt;a href="/State" class="user-mention" title="@State"&gt;&lt;i&gt;@&lt;/i&gt;State&lt;/a&gt;、&lt;a href="/Observed" class="user-mention" title="@Observed"&gt;&lt;i&gt;@&lt;/i&gt;Observed&lt;/a&gt;等装饰器实现数据驱动 UI，推荐使用&lt;a href="/ohos" class="user-mention" title="@ohos"&gt;&lt;i&gt;@&lt;/i&gt;ohos&lt;/a&gt;/router 管理跨平台路由。
‌常见问题‌：
‌Image 长按失效‌：需关闭.draggable(false) 属性。
‌安全区域适配‌：需同时设置固定宽高与 expandSafeArea 属性。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/be3415ec-ce39-4852-aca3-99b7024e3d35.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;‌现状与挑战‌
当前 ArkUI-X 仍处迭代阶段，存在第三方库支持不足、跨平台兼容性差异（如 iOS 帧率较低）等问题，但作为鸿蒙 “纯血” 战略的关键工具，未来潜力值得期待。&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Thu, 31 Jul 2025 19:25:52 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/6058</link>
      <guid>http://beta.w2solo.com/topics/6058</guid>
    </item>
    <item>
      <title>个人独立开发官网 - https://soloist.pages.dev/</title>
      <description>&lt;p&gt;个人独立开发官网 - soloist 正式发布啦。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jason2020/99b61217-1ddd-4541-a4a9-0307196bb8e6.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://soloist.pages.dev/" rel="nofollow" target="_blank"&gt;https://soloist.pages.dev/&lt;/a&gt;&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Wed, 23 Apr 2025 14:24:01 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/5720</link>
      <guid>http://beta.w2solo.com/topics/5720</guid>
    </item>
    <item>
      <title>博客更新啦 - https://xiuyuantech.github.io/</title>
      <description>&lt;p&gt;博客更新啦 - &lt;a href="https://xiuyuantech.github.io/" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io/&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;欢迎各位莅临指导，涉及 Android 初级、高级开发。&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Mon, 07 Apr 2025 10:12:30 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/5656</link>
      <guid>http://beta.w2solo.com/topics/5656</guid>
    </item>
    <item>
      <title>新人报道，个人独立开发如何推广- https://xiuyuantech.github.io</title>
      <description>&lt;p&gt;新人报道，个人独立开发如何推广- &lt;a href="https://xiuyuantech.github.io" rel="nofollow" target="_blank"&gt;https://xiuyuantech.github.io&lt;/a&gt;。&lt;/p&gt;</description>
      <author>jason2020</author>
      <pubDate>Fri, 28 Mar 2025 14:16:48 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/5623</link>
      <guid>http://beta.w2solo.com/topics/5623</guid>
    </item>
  </channel>
</rss>
