看一段CP使用的代码:
咦又看到一个hook方法:
而ActivityThread对象又容易获取,mProviderMap又是它成员变量那么也容易获取,所以上面的一大坨(除了前两行)代码就为了拿到占坑的provider對应的IContentProvider对象。
当然是修改uri啦把用户调用的uri,替换为占坑provider的uri再把原本的uri作为参数拼接在占坑provider的uri后面即可。
好了直接看invoke方法:
从参数中找到uri,往下看搞了个StringBuilder首先加入占坑provider的uri,然后将目标uripkg,plugin等参数等拼接上去,替换到args中的uri然后继续走原本的流程。
假设是query方法应该就到達我们占坑provider的query方法啦。
可以看到通过传入的生成了一个新的provider,然后拿到目标uri在直接调用provider.query传入目标uri即可。
那么这个provider实际上是这个代悝类帮我们生成的:
其他的几个方法:insert、update、delete、call逻辑基本相同就不赘述了。
总结下其实就是文初的内容,可以看到VritualApk大体方案如下:
整体代码看起来还是很轻松的~
当然如果你要选择某一个插件化方案进行使用一定要了解其中的实现原理,文檔上描述的并不是所有细节很多一些属性什么的,以及由于其实现的方式造成一些特性的不支持了解源码,可以方便自己排查问题擴展,甚至写一套根据自己业务需求的插件化方案~~
再多嘴一句还是建议大多多在某一方面深入了解,不要痴迷于UI特效(上班路上看看我嘚推文就好啦~玩笑~很多特效的,了解下原理即可)~~其实我早期浪费了很多时间在上面在你掌握了自定义View的详细细节、事件分发机制这些机制后,大部分UI的编写都是时间问题
不要在上面浪费过多时间,比别人多研究几个特效并不会对自己的提升有巨大的帮助过来人,忠言逆耳~
支持我的话可以关注下我的公众号,每天都会推送新知识~
看一段CP使用的代码:
咦又看到一个hook方法:
而ActivityThread对象又容易获取,mProviderMap又是它成员变量那么也容易获取,所以上面的一大坨(除了前两行)代码就为了拿到占坑的provider對应的IContentProvider对象。
当然是修改uri啦把用户调用的uri,替换为占坑provider的uri再把原本的uri作为参数拼接在占坑provider的uri后面即可。
好了直接看invoke方法:
从参数中找到uri,往下看搞了个StringBuilder首先加入占坑provider的uri,然后将目标uripkg,plugin等参数等拼接上去,替换到args中的uri然后继续走原本的流程。
假设是query方法应该就到達我们占坑provider的query方法啦。
可以看到通过传入的生成了一个新的provider,然后拿到目标uri在直接调用provider.query传入目标uri即可。
那么这个provider实际上是这个代悝类帮我们生成的:
其他的几个方法:insert、update、delete、call逻辑基本相同就不赘述了。
总结下其实就是文初的内容,可以看到VritualApk大体方案如下:
整体代码看起来还是很轻松的~
当然如果你要选择某一个插件化方案进行使用一定要了解其中的实现原理,文檔上描述的并不是所有细节很多一些属性什么的,以及由于其实现的方式造成一些特性的不支持了解源码,可以方便自己排查问题擴展,甚至写一套根据自己业务需求的插件化方案~~
再多嘴一句还是建议大多多在某一方面深入了解,不要痴迷于UI特效(上班路上看看我嘚推文就好啦~玩笑~很多特效的,了解下原理即可)~~其实我早期浪费了很多时间在上面在你掌握了自定义View的详细细节、事件分发机制这些机制后,大部分UI的编写都是时间问题
不要在上面浪费过多时间,比别人多研究几个特效并不会对自己的提升有巨大的帮助过来人,忠言逆耳~
支持我的话可以关注下我的公众号,每天都会推送新知识~
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。