flutter插件里的安卓原生代码运行深度解析
简单直白一点讲,刚刚插件的安卓代码里面用到了activity和binaryMessenger(通信大哥,一般存在于flutter引擎中),这两个东西在插件里面是不会凭空产生的,只有我们自己项目的安卓主工程里面才有,再换个说法,我们知道安卓里面一切功能都是以context为基础,查看资源,打开文件,跳转页面都需要有context,插件里面的安卓代码,怎么会凭空有一个context来处理相关的逻辑,比
本文深度解析一下flutter的插件里面的安卓原生代码是如何注册运行的,和自己项目中的安卓工程是怎么关联上的
本文以image_picker插件为例,来一步步分析插件调用流程
首先梳理插件使用流程
Pubspec.yaml里面申明插件

然后pub get一下,我们就可以在代码里面调用,直接上调用的代码

Dart代码里面继续追踪(dart里面源码相信大家都会看)


好了,追踪至此,大家看到开始通过basicMessageChannel去调用安卓原生了,有经验的朋友也知道,后面需要去查看安卓原生的代码(ios,window等一样)
可以在
里面找到依赖的插件,

提示:使用as工具直接打开插件里面的android工程,不仅可以方便查看源码还可以直接debug代码,这在修改第三方插件的时候很方便
打开插件的android工程之后
全局搜索通道名称,定位代码,发现在messages.java里面有相关处理

进一步查看

我们可以清晰地看到,最后调用了api.pickImages()方法来拉起系统选择照片的窗口(
此处的api是个接口,具体实现方法在ImagePickerPlugin.java里面

吐槽:在实际查看源码过程中,代码的点击跳转会失效(有些只是声明没有实现,实现在其他文件里面),需要有耐心,自己去找到代码逻辑和真正处理的地方


追踪到这里,基本上就不用再追了,因为此处已经是安卓原生里面调用相册的基础代码了
----------------------------告一段落
以上流程相信有经验的朋友还是可以通过自己的能力一步步探索的,
但是!!!!
今天我想讲的并不是上述流程,而是更隐蔽的东西,问大家一个问题
Flutter插件里面有dart代码,也有安卓原生代码,那插件里面的安卓原生代码是怎么运行的?简单直白一点讲,刚刚插件的安卓代码里面用到了activity和binaryMessenger(通信大哥,一般存在于flutter引擎中),这两个东西在插件里面是不会凭空产生的,只有我们自己项目的安卓主工程里面才有,再换个说法,我们知道安卓里面一切功能都是以context为基础,查看资源,打开文件,跳转页面都需要有context,插件里面的安卓代码,怎么会凭空有一个context来处理相关的逻辑,比如此处的图片选择插件可以打开系统图片选择窗口
聪明的你可能一下子就想到了,我可以继续查看源码,找到此处的binaryMessenger的源头是什么,怎么产生的,恭喜你,答对了,但是比较费时间,我已经帮大家整理好了过程,虽然对实际开发可能影响并不是很大,但是弄清了这些底层框架,会有一个豁然开朗的快感
-------------------------单刀直入,开始介绍
Ps:建议大家先去了解binaryMessenger的功能,这个也很重要
我们在flutter添加插件执行pub get之后,在自己项目的安卓工程里面可以看到一个文件(平时压根不会看)
就是他

他就是本文的大男主
打开文件看看干了啥

所有的dart插件对应的安卓原生代码都会在此处被赋予生命,上述说的context,binaryMessenger等东西都是在这里面传递给了插件,让插件和安卓主功能绑定在一起,成为亲兄弟
此时你会懵逼,这个io.flutter.plugins.imagepicker.ImagePickerPlugin在哪里,因为我们代码里面可能会报错,也点不进去源码
以下推荐两个地方,一个就是自己项目的

找到插件依赖的安卓工程
第二个方法是,直接到pub.dev里面看源码



虽然找到了ImagePickerPlugin源码,但是先不要急着看,先看 flutterEngine.getPlugins().add()干了啥

1:将当前的插件类(此处为ImagePickerPlugin)的Class和实例添加到一个map里面保存(所有的插件都在这个map里面)
2: plugin.onAttachedToEngine(pluginBinding);这一步极为重要,是核心代码,也是真正赋予插件灵魂的地方
先看下pluginBinding是啥,看下图


可以看到,FlutterPluginBinding里面全是宝贝,全局的context,flutter引擎的实例,bindartMessenger可以在flutter和原生之间传递消息,下面的几个宝贝大家自己去研究
相信大家都猜到了,就是在这里,flutter框架将我们自己项目安卓主工程里面的核心部件都传给了插件里面的安卓代码,所以插件里面的安卓代码可以跳页面,打开系统文件,申请系统权限等等等等
现在我们进到ImagePickerPlugin里面看代码就心里有数了,
先看

正好和上面主功能里面的调用对应上,一个传参,一个接受参数

后续代码自己看吧,很简单了
更多推荐


所有评论(0)