Cordova Plugin 添加Application类操作开启service 修改AndroidManifest中Application标签 name属性

背景:现在随着混合开发的流行,越来越多的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)
src表示被执行的脚本路径。

这边的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安全方面的博客。






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值