背景:现在随着混合开发的流行,越来越多的WebApp出现。其中Cordova做的也比较不错。
当开发cordova web app的时候需要去做一些Native的工作,cordova提供了一种插件化的方式去实现,需要去开发cordova plugin 去做一些Native的事情然后通过桥接返回结果给前端。cordova plugin开发教程:http://cordova.axuer.com/plugins/。
以下针对android 的cordova plugin开发!
开发APP,有时候需要在app加载的时候去做一些初始化的操作,比如开启service,单例类的加载等,就需要在开发cordova plugin插件的时候添加Application的操作。
添加Application需要修改AndroidManifest中Application标签里面的name属性。 plugin.xml中无法修改Application中的属性,这时候要去修改Application标签的name属性
需要用到Hook。什么是Hook技术可以简单看这边文章:http://www.cnblogs.com/cryinstall/archive/2011/08/30/2280826.html
简单介绍一下:Hooks本身是一些脚本代码,可以使用任何语言(比如:nodejs、shell等),用来自定义Cordova CLI命令,位于Cordova项目的根目录hooks文件夹下。主要目的是扩展Cordova CLI框架,在应用的build生命周期中插入自定义的build构建内容
接下来介绍一下如何使用Hook去修改Application标签中的属性值:
直接上代码:
1.需要在plugin.xml中加入hook标签,如下
<hook type="after_prepare" src="scripts/android_socket.js" />
cordova官网有介绍如何使用hook技术。
标签中有两个属性 一个是type表示HOOK的类型
常用类型如下
- 添加工程所需的plugins(after_platform_add)
- 拷贝icons、splash screens等resource到各个平台(after_prepare)
- 运行单元测试(before_build)
- 替换一些配置信息,比如:api服务器地址(after_prepare)
这边的android_socket.js是一个node脚本如下:
#!/usr/bin/env node
module.exports = function(context) {
var fs = context.requireCordovaModule('fs'),
path = context.requireCordovaModule('path');
var platformRoot = path.join(context.opts.projectRoot, 'platforms/android');
var manifestFile = path.join(platformRoot, 'AndroidManifest.xml');
if (fs.existsSync(manifestFile)) {
fs.readFile(manifestFile, 'utf8', function (err,data) {
if (err) {
throw new Error('Unable to find AndroidManifest.xml: ' + err);
}
var appClass = 'cordova.plugin.socket.SocketApplication';
if (data.indexOf(appClass) == -1) {
var result = data.replace(/<application/g, '<application android:name="' + appClass + '"');
fs.writeFile(manifestFile, result, 'utf8', function (err) {
if (err) throw new Error('Unable to write into AndroidManifest.xml: ' + err);
})
}
});
}
};
意思是找到Android平台下面的AndroidManifest.xml文件修改<application android:name="' + appClass + '"'),appClass就是name的值
如果只是修改Application标签里面的name属性值 就先新建一个js文件 将上面代码拷贝进去,放在插件的目录中,然后在plugin.xml中添加hook标签指向被执行的js文件。
最后打包插件重新添加就OK啦!
Hooks能做的远远不止这些,有兴趣的可以看以下我的下一篇介绍Hooks做android安全方面的博客。