引言
我们知道Tinker实现热修复的原理是将自己的全量patch包插入到dexElements数组的前段,从而达到热修复的目的。
以下所有对源码的分析均基于Tinker 1.7.7 版本
Application代理机制
通常我们都是在Application中进行一些初始化的工作,包括tinker的初始化,那么application中所涉及到的类,在tinker初始化完成前就已经被类加载器所加载了,那么我们之前所说的通过将我们的补丁dex包插入到dexElements数组的前段的方法就不起作用了,Tinker是怎么解决这一问题的从而达到能修复Application中所使用到的类的呢?
看过tinker的官方接入文档的同学肯定知道,tinker推荐我们将自己的Application继承自ApplicationLike
,那么,我们的切入点便是这里,我们先看一下ApplicationLike
的源码(源码较长,只贴出关键部分,下同)
public abstract class ApplicationLike implements ApplicationLifeCycle {
private final Application application;
private final Intent tinkerResultIntent;
private final long applicationStartElapsedTime;
private final long applicationStartMillisTime;
private final int tinkerFlags;
private final boolean tinkerLoadVerifyFlag;
public ApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag,
long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
this.application = application;
this.tinkerFlags = tinkerFlags;
this.tinkerLoadVerifyFlag = tinkerLoadVerifyFlag;
this.applicationStartElapsedTime = applicationStartElapsedTime;
this.applicationStartMillisTime = applicationStartMillisTime;
this.tinkerResultIntent = tinkerResultIntent;
}
...
}
可以看到,ApplicationLike
并不是一个真正意义上的Android中的Application
,因为他并没有继承自Application
,仅是一个普通的类实现了ApplicationLifeCycle
这个接口,我们先看一下ApplicationLifeCycle
这个接口源码
public interface ApplicationLifeCycle {
/**
* Same as {@link Application#onCreate()}.
*/
void onCreate();
/**
* Same as {@link Application#onLowMemory()}.
*/
void onLowMemory();
/**
* Same as {@link Application#onTrimMemory(int level)}.
* @param level
*/
void onTrimMemory(int level);
/**
* Same as {@link Application#onTerminate()}.
*/
void onTerminate();
/**
* Same as {@link Application#onConfigurationChanged(Configuration newconfig)}.
*/
void onConfigurationChanged(Configuration newConfig);
/**
* Same as {@link Application#attachBaseContext(Context context)}.
*/
void onBaseContextAttached(Context base);
}
这个接口里面的几个方法,相信你一定很眼熟,没错,这几个方法均是跟Application
有关的生命周期的方法,那么为什么我们继承的是一个普通的类,并不是一个真正的Application
,app却没有崩溃并且可以正常运行呢&