cordova的android插件开发及cordova加载插件的过程
首先先引用cordova的官方文档(不懂多看官方文档):https://cordova.apache.org/docs/en/8.x/reference/cordova-plugin-device/index.html;这里分为2个部分:第一部分为插件创建,第二部分为cordova加载插件的过程解析。
第一部分:插件创建
这里以创建toast弹窗插件为例
第一步先安装plugman:npm install -g plugman
第二步新建插件项目结构:plugman create --name toastPlugin --plugin_id plugin_id --plugin_version 1.0.0
创建出来后项目结构为:

然后再src下新建android目录,在该目录先放android代码。
第三步在任意一个cordova的项目中,创建如下class:
package cordova.plugins;
import android.widget.Toast;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;
public class ToastPlugin extends CordovaPlugin {
public boolean execute(String action, String rawArgs, CallbackContext callbackContext) throws JSONException {
final JSONArray args = new JSONArray(rawArgs);
if("toast".equals(action)){
Toast.makeText(cordova.getActivity(),args.getString(0),Toast.LENGTH_SHORT).show();
callbackContext.success();
return true;
}
callbackContext.error("找不到对应方法");
return false;
}
}
然后将这个java文件copy到插件目录的src/android目录下面,然后修改plugin.xml文件如下:
<name>toastPlugin</name> <js-module name="toastPlugin" src="www/toastPlugin.js"> <clobbers target="cordova.plugins.toastPlugin" /><!--调用插件的方式:在cordova项目中声明declare cordova,然后cordova.plugins.toastPlugin.方法名 调动插件的方法 --> </js-module> <!--添加Android平台 --> <platform name="android"> <config-file target="res/xml/config.xml" parent="/*"> <!-- JS调用时的名字,与上面的clobbers相同 --> <feature name="toastPlugin"> <!-- value:的值是对应的插件中ToastPlugin.java存放的路径 --> <param name="android-package" value="cordova.plugins.ToastPlugin"/> </feature> </config-file> <!-- src:是插件里存放对应.java的路径, target-dir:安装插件时把.java文件存放的位置,要和上面的value路径对应 --> <source-file src="src/android/ToastPlugin.java" target-dir="src/cordova/plugins" /> </platform>
在修改www目录下面的toastPlugin.js文件:
var exec = require('cordova/exec'); exports.toast = function (arg0, success, error) { exec(success, error, 'toastPlugin', 'toast', [arg0]); };
然后再插件根目录执行:npm init,可以按照自己的信息填写(只做demo就一直点Enter就可以了),生成package.json文件。至此插件开发完成,下面测试:
安装插件:ionic cordova plugin add D:\mobile\plugins\toastPlugin //这里为你新建的插件的目录
然后declare cordova,在代码中加入 cordova.plugins.toastPlugin.toast("测试toast插件");
第二部分:cordova加载插件过程解析
首先用androidStudio打开项目结构应该如下(不建议用eclipse):

找到engine下的PluginManager的exec方法(看懂该方法就懂加载过程了),该方法第一步就调用了如下方法:

查看该方法发现cordova从pluginMap和entryMap查询插件的class的地址,查找到了没有初始化插件就初始化插件(有个配置可以在cordova ready的时候就初始化我们的插件,不然默认调用时在初始化);
在PluginManager中查找发现pluginMap就是entryMap中已经初始化了的插件,接着找entryMap的初始化位置

发现是方法setPluginEntries初始化entryMap,在向上找发现是PluginManager初始化,-----》发现PluginManager是在CordovaWebViewImpl的init中创建----》发现在CordovaActivity的init方法中

pluginEntries就是plugin的集合,那在找它初始化的位置,发现是在ConfigXmlParser中parse方法解析配置文件的来的,解析位置就是这里

打开对应目录就会发现是上面创建插件时plugin.xml的feature的配置,到此就找到了插件。

然后回PluginManager的exec方法,接着执行就完了。

所有整个顺序为:CordovaActivity初始化时加载res/xml/config.xml的配置,然后初始化CordovaWebViewImpl----->PluginManager;

浙公网安备 33010602011771号