闲来无事,看看一些库的源码,看看有没有新的东西。

butterknife

compiler库在编译期生成XX_ViewBindiging.java ,构造函数内完成findViewById等操作 ,Butterknife.bind() 执行时反射创建XX_ViewBindiging.java类对象,初始化view id

EventBus

annotation-processor 库在编译期间生成eventBusIndex类,对所有有@subscribe注解的方法的类进行预处理,保存起来,在inject时将eventBusIndex中保存的当前Activity类的信息拿到,避免反射。查找父类@subscribe方法时如果父类中没有,会反射白白循环遍历,消耗性能。
在发出消息后,反射调用和消息对象对应的订阅方法。

MultiDex

ART 5.0 ART虚拟机在应用安装时会将所有的.dex文件预编译成.oat,minSDKVersion >= 5.0时不需要这个库。在5.0以上机器上有环境变量,使其return,不进行任何操作。

Dalvik 4.4以下系统的 dalvik 虚拟机限制每个.dex文件最多只能有65536个方法,MultiDexclassesN.dex文件提取出来,保存在文件中,再反射将其附加到ClassLoaderpathList字段中,ClassLoader查找类时就可以查找所有.dex中的代码了。

Glide

生命周期 传参context,获取fragmentManager,通过往activity里加不可见fragment,检测activity生命周期。

lifecycle-viewmodel

在config改变时保存状态
ViewModelStore保存在FragmentActivity中。

  • Activity中通过getLastNonConfigurationInstance获取保存的ViewModelStore
  • fragment中则直接保存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@NonNull
@Override
public ViewModelStore getViewModelStore() {
if (getApplication() == null) {
throw new IllegalStateException("Your activity is not yet attached to the "
+ "Application instance. You can't request ViewModel before onCreate call.");
}
if (mViewModelStore == null) {
NonConfigurationInstances nc =
(NonConfigurationInstances) getLastNonConfigurationInstance();
if (nc != null) {
// Restore the ViewModelStore from NonConfigurationInstances
mViewModelStore = nc.viewModelStore;
}
if (mViewModelStore == null) {
mViewModelStore = new ViewModelStore();
}
}
return mViewModelStore;
}