使用 APT 实现注解扫描,如果不是组件化的应用场景,并不需要实现上述缓存和插桩的逻辑,比如 ButterKnife,只需要调用一下对应的方法,完成 APT 相关代码的自动装载即可。但是如果是组件化场景,为了实现指定包名下面的类的扫描,走插桩和缓存似乎是必经之路。不过准确来说,我们是不需要插桩的,只需要 transform 阶段能够扫描到类,存储下来,然后应用启动的时候动态加载即可。所以,除了插桩之外,我们还有没有其他的可选的办法呢?当然有,比如读取到类之后写入到 json 文件里面,然后启动的时候读取 json 文件并解析出生成的类。不过,这种方式性能上会比插桩稍逊一筹。
踩坑记录:使用正则表达式匹配满足指定开头字符串的坑
需要注意的是只有使用 ^ 和 $ 的时候才需要增加这个参数,如果不限制字符串开头和结尾,不使用这个参数一样可以从整个文本中提取出满足条件的字符串。
踩坑记录:Kotlin data class 在 Map 和 Set 中无法读取的问题
Kotlin 的 data class 自动覆写了 equals() 和 hashCode() 两个方法。虽然有些时候可以给用户带来便利,但是如果使用不慎就会出现一些匪夷所思的问题,比如这里遇到的一个问题是,将一个对象作为键放到 Map (或者 Set)之后,修改了对象的一些属性之后再从 Map (或者 Set)用它作为 key 读取的时候返回的数据是 null.
更高级的 Android 启动任务调度库
在最新的 2.2 版本中,我新增了一些特性。相比于目前市面上其他的启动任务调度库,使其具备了更多的优势。这里我只介绍下经过新的版本迭代之后该项目与其他项目的不同点。
当 Adapter 遇上 Kotlin DSL,无比简单的调用方式
相对于为各种类型的数据定义 Adapter 的使用方式,以上封装方式的优势是:1. 借助 BRVAH 的优势,封装了大量的方法,进一步简化了 Adapter 的使用;2. 通过工厂和 DSL 封装,简化了调用 Adapter 的方式,你无需为数据类型定义 Adapter 文件,减少了项目中需要维护的代码和类文件数量;3. 通过以上封装,使用 Adapter 更加简洁,节省了大量的代码,提升开发效率和解放双手;4. 自由地在单一类型布局和多类型布局之间进行切换,但是少了没必要的工厂方法。
异步、非阻塞式 Android 启动任务调度库
节前面试的时候被问到 Android 启动任务依赖怎么做调度。当时随口给了一个方案,后来想想觉得有意思就自己花了一天的时间写了一个。这个库已经开源到 Github 上面。本文我们来一起看下这个库是如何设计和实现的。
个人开源库的一些更新,兼谈 Jetpack 和 Kotlin 给 Android 开发带来的新变化
最近,我准备把开发过程中总结的一些东西沉淀到自己个人开源的几个库中。最新的一些更新中运用了 Kotlin 和 Jetpack 的一些语法特性,故此总结一下。Jetpack 和 Kotlin 出来已经很久了,然而很多应用开发还停留在 MVP 以及 Java 阶段,即便使用了 Kotlin,很多人只不过是像使用 Java 一样在使用 Kotlin. 实际上,如果能够结合 Kotlin 和 Jetpack 的语法特性,可以大大提升我们日常开发的效率。下面,我以个人开源库的一些新的 Feature 的更新来说明,Jetpack 带来的新变化以及 Kotlin 的特性的运用。
2020 年,我这样在项目中使用 MVVM
最近看到了几篇与 Jetpack MVVM 有关到文章,使我不禁也想淌一下这场混水。我是在 2017 年下半年接触的 Jetpack 的那套开发工具,并且后来一直将其作为开发的主要框架。在这段时间的使用过程中,我踩过一些坑,也积累了一些经验,为了将其推广到其它到项目中又专门封装出了一个库。当然,Jetpack 所提供的组件已经比较完善,我的工作只能算是锦上添花。下面我就介绍下,现在我是如何在项目中使用 Jetpack MVVM 的。
Android 插件化框架 DynamicLoadApk 源码分析(2019)
DynamicLoadApk 的原理,其实本质就是:插件类作为一个普通的类被调用,它不归 AMS 负责。当我们启动插件的时候,实际启动的是代理类,当 AMS 回调代理类的生命周期的时候,代理类再调用插件类的各个生命周期方法。只是,对资源和类加载的部分需要注意下,因为我们需要进行自定义配置来把它们的路径指向我们的插件包。
一文说透 Android 应用架构 MVC、MVP、MVVM 和 组件化(2018)
MVC、MVP 和 MVVM 是常见的三种架构设计模式,当前 MVP 和 MVVM 的使用相对比较广泛,当然 MVC 也并没有过时之说。而所谓的组件化就是指将应用根据业务需求划分成各个模块来进行开发,每个模块又可以编译成独立的APP进行开发。理论上讲,组件化和前面三种架构设计不是一个层次的。它们之间的关系是,组件化的各个组件可以使用前面三种架构设计。我们只有了解了这些架构设计的特点之后,才能在进行开发的时候选择适合自己项目的架构模式,这也是本文的目的。