项目再github上的目录:https://github.com/chen2009277025/nodejs_apkTool

       nodejs无可厚非是新兴的后端语言,因为他的开发语言是javascript,javascript语言的自身优势,让nodejs迅速的火遍大江南北。

      很多的nodejs的开发插件如雨后春笋般的涌现出来,比如文件操作的fs,解决数据库链接的各种中间件,mysql、mongoose等等。

     但是目前我还没有发现关于nodejs解析apk的,这个需求并不是很大众,但是对于有些项目而言这个需求确实很重要的。其实实际上来讲需要安装好java环境,至少得是java1.6以上。

     android就会有一个库文件是用来读取apk中的签名和信息的库了,而我们再这里所要做的就是用nodejs去调用这些库文件,把这些操作分装成一个个的子操作,使用的人只需要关心如何和我们的中间件交互得到自己想要的数据,而不需要去关心中间做了些什么。

    

        一般的apk是用过一定的压缩格式压缩过的,我们可以通过将apk的后缀名修改成rar或者zip甚至是tar.gz然后解压提取里面的图片等的静态资源文件。

可是此时的applicationContext.xml文件是不能看的,或者它里面的class文件也是不能看到的。

此时这个apktool就有用了:

nodejs_apktool 是用nodejs写的一个对apk处理的一个工具

1.能对apk进行读取签名,读取apk内部的appkey,appid,

2.能对apk进行解包,打包

3.能写入指定的appid,appkey

       

使用:

//apkToolPath:这个是你的项目的绝对路径,比如:/users/chenjianhui/node_apktool,node_apktool是我的项目名

//sign:是项目中希望打进apk里面的签名,签名是一个和公司有关的文件,这个文件的生成可以去各大搜索引擎上就能搜到怎么生成

//sign_path:签名的路径,系统绝对路径

//sign_password:签名的密码,以防止别人给你解密的密码

//sign_align:签名的别名,这些参数在你创建签名的时候就会设置好

//apkTool的setting

apkTool.settings = {

    apkToolPath: "",

    sign: {

        sign_path: "",

        sign_password: "",

        sign_align: ""

    }

};

具体的使用请看我的测试用例里面的代码

    

/** * Created by chen on 15-7-30. */var apktool = require("../index");var fs = require("fs");apktool.settings.apkToolPath = "/Users/chenjianhui/WebstormProjects/node_apktool";//unpack apk//解压apk包apktool.apkTool_unpack("/Users/chenjianhui/Documents/apkTest/Pet.apk","/Users/chenjianhui/Documents/apkTest",function(err,result){        if(err){console.log("error:"+err);}        console.log(result)});/*//pack apk//打包apkapktool.apkTool_pack("/home/chen/youyuan_test","/home/chen/youyuan_unsign.apk",function(err,result){    if(err){console.log("error:"+err);}    console.log(result)});*///这里的参数是需要向apk中写入的渠道号,版本号,appkey,appid等信息//var params = {//    channel_name:"COM_CHANNEL_BS",//    channel_val:"default",//    permissions:[],//    appkey_name:"COM_APPKEY_BS",//    appkey:"",//    appid_name:"COM_APPID_BS",//    appid:""//}////apktool.handle_manifest("/home/chen/youyuan_test",params,function(err,result){//        if(err){console.log(err);}//        console.log(result);//})/*//读取得到apk中的版本信息//这个方法很有用,因为通过去applicationContext.xml里面找版本号是一个很不科学的办法,//而且不一定能找到apktool.getVersionOfApk("/home/chen/youyuan_test",function(err,result){})*//*重新签名apk,将apk签名成自己公司的apk,这个apk就是自己的了apktool.resigned_apk("/home/chen/youyuan_unsign.apk","/home/chen/youyuan_sign.apk","/home/chen/android.keystore","haoxin","android",function(err,result){    if(err){        console.log(err);        logger.writeErr(err);        return;    }    console.log(result);});*//*//读取签名apktool.readSign("/home/chen/youyuan_sign.apk",function(err,result){    if(err){logger.writeErr(err);return;}    console.log(result);    console.log(result.data.MD5);    console.log(result.data.SHA1);    console.log(result.data.所有者);})*//*这是解压的配置,var pack_param = {    unpack_folder:"/home/chen/haoxin_test", //解压目录    desi_dir:"/home/chen/haoxin_2"  //压缩目标};//这是需要穿进去的一些渠道号和版本好等信息var manifest_param = {    channel_name:"COM_CHANNEL_BS",    channel_val:"default",    permissions:[],    appkey_name:"COM_APPKEY_BS",    appkey:"1231",    appid_name:"COM_APPID_BS",    appid:"12121"};var sign_param = {    sign_file:"/home/chen/android.keystore",    password:"haoxin",    sign_align:"android"}apktool.handle_apk("/home/chen/youyuan.apk",pack_param,manifest_param,sign_param,function(err,result){    if(err){console.log(err);return;}    console.log(result);    console.log( result.data["所有者"]);})*/////var path = "/home/chen";////console.log(fs.existsSync(path));////获取MD5,这是获取apk MD5的方法//apktool.getMd5("/Users/chenjianhui/Documents/apkTest/Pet.apk",function(err,result){//    if(err)//    {//        console.log(err);//        return;//    }//    console.log(result);//})

        这里面还有可以修改的空间,比如我们的apk需要的 权限,由于时间的问题,我并没有给该工具新增添加或者删除权限的功能,

       如果有可能还可以将这个功能写成一个web,用户直接上传apk,手动输入自己需要的渠道号产品id等信息,手动选择需要的权限,就可以下载签名过后属于自己的apk