使用函數計算來抽取apk信息
在之前的博客中我們看到,可以使用函數計算來實現一個自定義的圖像處理服務,這個服務是穩定、可靠、彈性伸縮的,並且它是無服務器架構,按函數的調用時間收費,節省了服務器閑置的開銷和運維成本。
使用函數計算可以方便地構建類似的微服務,比如我們可以創建一個處理android apk文件的微服務:
- 小吳將下載的apk文件上傳到OSS
- 他想分析一下這些apk應用的權限信息:
- 使用aapt工具抽取出每個apk文件的權限信息
- 將它們錄入到數據庫中(rds),方便日後查詢
步驟
1. 創建一個OSS bucket
https://oss.console.aliyun.com/index
注意創建bucket時選擇“華東2”區域。
2. 創建RDS數據庫
https://rdsnew.console.aliyun.com/
3. 創建函數計算的服務和函數
-
準備aapt工具
函數計算的運行環境是基於debian:8的鏡像,因此我們最好在同樣的環境下下載aapt工具:docker run -it -v $(pwd):/opt debian:8
- 在容器中運行
apt-get update && apt-get install -y aapt
- 將aapt及其所依賴的庫從容器中拷貝出來:
mkdir /opt/aapt
cp $(which aapt) /opt/aapt/
cp -R /usr/lib/android /opt/aapt/
-
ldd $(which aapt) | grep -v android
將其所依賴的庫也拷貝到/opt/aapt/
-
準備函數代碼
由於函數用到了mysql
這個模塊,所以需要將其安裝: -
打包上傳到OSS
將整個代碼目錄打包成zip:- 編輯
index.js
將其中的數據庫信息替換成自己真實的信息 zip -r code.zip *
- 將code.zip上傳到OSS
- 編輯
函數的關鍵代碼如下,完整的代碼包點此下載:
ossClient.get(objectName, apkPath).then(function(res) {
exec.execFile(
'/code/aapt/aapt', ['dump', 'permissions', apkPath],
{
env: {
'LD_LIBRARY_PATH': '/code/aapt:/code/aapt/android',
},
}, function(err, stdout, stderr) {
if (err) {
callback(err);
return;
}
var apkPerm = stdout;
console.log('%s permissions: %s', apkName, apkPerm);
conn.query(
'CREATE TABLE IF NOT EXISTS APK_PERM(NAME VARCHAR(50) NOT NULL, PERM TEXT, PRIMARY KEY (NAME))',
function(err) {
if (err) {
callback(err);
return;
}
conn.query(
'REPLACE INTO APK_PERM VALUES (?, ?)', [apkName, apkPerm], function(err, results) {
if (err) {
callback(err);
return;
}
console.log('insert ok: %s', results);
callback(null, 'ok');
}
);
});
});
}).catch(function(err) {
console.error('error: ', err);
callback(err);
});
4. 運行函數並查看結果
可以看到函數運行成功,接下來我們可以去RDS數據庫中確認一下:
最後更新:2017-05-26 20:01:11