引言
我们知道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有关的生命周期的方法,那么为什么我们继承的是一个普通的类,并不是一个真正的Applica

本文深入解析Tinker如何通过Application代理机制实现在不重启应用的情况下修复代码。通过分析源码,揭示Tinker如何创建代理Application,确保在补丁包加载后执行初始化操作,以及如何使用注解简化开发者工作流程。
最低0.47元/天 解锁文章
1672

被折叠的 条评论
为什么被折叠?



