項目再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 //打包apk apktool.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