本系列 Tinker 源码解析基于 Tinker v1.9.12
自动生成TinkerApplication
接入 Tinker 第一步就是改造 Application 。官方推荐是利用 @DefaultLifeCycle 动态生成 Application
1 | @DefaultLifeCycle(application = "tinker.sample.android.app.SampleApplication", |
那我们来解析一下 Tinker 是如何生成 Application 以及在 Application 中做了什么事?
看到 @DefaultLifeCycle 注解,我们可想而知应该是经过 processor 处理后动态生成了 Application 。
查看 Tinker 工程可以发现在 tinker-android-anno 下面有一个 AnnotationProcessor
1 | @Override |
发现它正是处理 @DefaultLifeCycle 的。
下面重要看 processDefaultLifeCycle 方法。
1 | private void processDefaultLifeCycle(Set<? extends Element> elements) { |
整个 processDefaultLifeCycle 方法看下来,其实主要在做的就是去读取一份模版,然后用注解中设置的值替换里面的一些占位符。这个模版就是 resouces/TinkerAnnoApplication.tmpl
package %PACKAGE%;
import com.tencent.tinker.loader.app.TinkerApplication;
/**
*
* Generated application for tinker life cycle
*
*/
public class %APPLICATION% extends TinkerApplication {
public %APPLICATION%() {
super(%TINKER_FLAGS%, "%APPLICATION_LIFE_CYCLE%", "%TINKER_LOADER_CLASS%", %TINKER_LOAD_VERIFY_FLAG%);
}
}
最终生成的 SampleApplication 效果:
/**
*
* Generated application for tinker life cycle
*
*/
public class SampleApplication extends TinkerApplication {
public SampleApplication() {
super(7, "tinker.sample.android.app.SampleApplicationLike", "com.tencent.tinker.loader.TinkerLoader", false);
}
}
解析 TinkerApplication
想要知道 TinkerApplication 里面干了什么?
一起看看 TinkerApplication.onCreate
1 | @Override |
第一步,调用 ensureDelegate 创建 application 代理,即 applicationLike
1 | private synchronized void ensureDelegate() { |
然后调用 invokeAppLikeOnCreate(applicationLike) 去回调 applicationLike 的 onCreate 方法。这样,applicationLike 和 application 的生命周期方法就做到同步了。另外,其余的生命周期方法也是如此来实现同步的,这里就不详细讲解了。
那么 Tinker 是什么时候加载的呢?
答案就在 attachBaseContext 中
1 | @Override |
可以看到调用了 loadTinker 方法。
1 | private void loadTinker() { |
这里的 loaderClassName 就是上面 @DefaultLifeCycle 中定义的 loaderClass 。默认的是 com.tencent.tinker.loader.TinkerLoader ,也支持用户自定义 TinkerLoader 。
所以 loadTinker 中干的事就是利用反射执行了 TinkerLoader.tryLoad 方法。
至于在 tryLoad 方法中到底做了什么事,我们等到下一篇再讲吧。