永恒的码流

万物皆流,无物常驻

0%

问题

在调试应用时经常会碰到如下提示:

source code does not match the bytecode (源码与字节码不匹配)

一般发生在调试的手机或模拟器运行的SDK版本与应用编译版本compileSdkVersion不一致导致的。比如你的手机Android版本是7.1.1即SDK版本为25,而你的IDE配置的compileSdkVersion不是25而是其他的,比如28,那么在调试的过程中,跟随断点进入Android源码时,就会出现以上提示。而此时一般是没法定位具体代码的。

这是其实Android Studio的Bug,详见:

阅读全文 »

导引

主要参考以下两种组件化方案

知乎 Android 客户端组件化实践

  • 多工程多仓库。主工程通过 aar 依赖各个组件。
  • 组件划分:主工程、业务组件(完整业务)、基础组件(基础业务)、基础SDK(业务无关)
  • 组件解耦:公用代码处理、初始化(任务依赖)、通信(路由、接口、EventBus、组件 API 模块)。
  • 组件半自动拆分。
  • 联合编译完整包。动态引入组件。
  • 包含子业务线的组件的处理。子业务模块独立配置、编译和运行,组合发布。

网易友品 Android 客户端组件化演进

  • 通信:路由、服务和全局通知
  • 路由。公共路由表、注解路由地址
  • 接口。
  • 拆分流程:建Module -> 移动业务代码到Module -> 根据编译报错修改 -> 接口解耦 -> 配置独立编译功能。
  • 组件库的独立发布和维护;本地开发调试模式,开发时使用本地Module依赖,发布时使用远程ARR依赖。
阅读全文 »

前言

浏览《Effective Java 第二版》中文版,资源Gitbook Effective Java 2rd


第9条:覆盖equals时总要覆盖hashCode

在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashcode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,这样的集合包括HashMapHashSetHashtable

第18条:接口优于抽象类

通过对你导出的每个重要接口都提供一个抽象的骨架实现(skeletal implementation)类,把接口和抽象类的优点结合起来。接口的作用仍然是定义类型,但是骨架实现接管了所有与接口实现相关的工作。

阅读全文 »

Merge和Rebase

区别。参考闲谈 git merge 与 git rebase 的区别

  • merge 合并两个分支的Head;提交历史忠实地记录了实际发生过什么,关注点在真实的提交历史上面。
  • rebase 提取当前分支的修改,将其复制在了目标分支的最新提交后面;反映了项目过程中发生了什么,关注点在开发过程上面
  • 区别。merge会保留当前分支的历史记录,而rebase会改动当前分支的历史记录。
阅读全文 »

Kotlin Reference

官方文档每年需要浏览一遍。Kotlin中文网已经很全面了,更新也比较及时,这次主要看这个上的Reference,兼顾官网

需要注意的地方

  • 编码规范。与Java基本一致,需要注意的是Kotlin自己特有的语法糖,多看即可。
  • 泛型。PECS;Kotlin中数组是不型变的。
  • 委托。可使用可观察属性(observable properties)。
  • 作用域函数。一般使用applylet即可。
  • Java调用Kotlin。生成重载@JvmOverloads
  • 待加强和研究的地方。并发、协程。
阅读全文 »

序列化概念请见wikipedia

为什么需要序列化?

  1. IPC需要。多进程对应的是不同的内存区域,不能通过共享内存通信,因此传递数据的对象必须可序列化。
  2. 持久化到本地和网络传输。
阅读全文 »

问题

定义了不同的drawable-***dpi的文件夹,但只在其中某些里面放置了图片,比如在drawable-xhdpi里放置了图片,其他的文件夹里没有放置图片,那么非xhdpi的设配如何适配图片资源?如何定位图片以及如何显示?

阅读全文 »