Small插件化源码分析--跳转流程
我系苍王,欢迎关注的源码分析的第三节
欢迎浏览我之前的文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章,谢谢。
[Android]如何做一个崩溃率少于千分之三噶应用app(9)-Small插件化
这一节主要介绍的是Actvity间跳转流程
三.跳转流程
1.很明显small的跳转是跨模块的。
我们可以很容易就找到Small使用的跳转函数,如Small.openUri
我们在第一节的时候有介绍过,Small也是使用通用Actvity占坑方法,来欺骗Android系统启动的。
makeUri会将跳转封装为baseUri和uriString
我们看一下openUri,他会调用ApplicalicationUtils.openUri
还是会调用context.startActvity的
2.但并不是这样就完了,ApkBundleLauncher里面有InstumentationWrapper,通过onCreate的方法调用,它会反射到sInstumentation这个变量。
阅读过Activity启动流程都会找到,会调用到Instumentation的execStartActivity的方法,然后才会代理模式代理到Native层运行。
在这里我们会使用wrapIntent的方法来包装Intent,这里会把取得realClazz,是真正启动Activity的包名和名字,将realClazz的放到addCategory里面用来传递。
调用dequeStubActivity的方法,来获取占坑的Activity的名字,以此来欺骗AndroidMaifest注册的检测。
最后还是会通过反射来将该方法反射运行
3.通过包装欺骗后,很明显,当回调的时候,需要将Activity的信息替换回来(这里需要查看一下插件化的源码分析),我们之前有提示过有onCreate的时候sCallBack的反射替换
然后通过检测LAUNCH_ACTIVITY来检测启动的流程。
通过拆包unwrapIntent的方法从Category里面获取会真正的Activity名字
在sLoadedActivities里面获取会相关信息,然后反射替换Activity的信息
替换ActivityInfo的相关信息
这样就启动跳转完成了,而Activity将会享有本来的Instumentation和自定义的InstumentationWrapper全部生命周期里面的行为。
这一节就介绍到这里
下一节将会介绍InstumentaionWrapper究竟做了做了什么事情。
敬请期待!!!