UNPKG

bananalyzer

Version:

A simple tool for windows 10, that downloads APKs from Google playstore, analyzes them, and lists all the Google and Huawei SDKs (kits) that are integrated, along with other metadata

244 lines (243 loc) 12.2 kB
'use strict'; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.saveResult = exports.getRowFromApp = exports.HEADERS = void 0; var debug_1 = __importDefault(require("debug")); var path_1 = __importDefault(require("path")); var xlsx_1 = __importDefault(require("xlsx")); var consts_1 = require("../consts"); var debug = (0, debug_1.default)('bananalyzer:excleHelper'); var HEADER_PACKAGE_NAME = 'Package name'; // var HEADER_VERSION_NAME = 'Version name'; var HEADER_APK_CREATION_DATE = 'APK creation date'; var HEADER_GOOGLE_PLAY_UPDATE_DATE = 'Google Play update date'; var HEADER_HUAWEI_APP_ID = 'Huawei App Id'; var HEADER_GMS_KITS = 'GMS kits (low accuracy)'; var HEADER_HMS_KITS = 'HMS kits (medium accuracy)'; var HEADER_SDKS = 'SDKs'; var HEADER_HUAWEI_METADATAS = 'Huawei Metadatas'; var HEADER_GOOGLE_METADATAS = 'Google Metadatas'; var HEADER_GOOGLE_PERMISSIONS = 'Google Permissions'; var HEADER_HUAWEI_PERMISSIONS = 'Huawei Permissions'; var HEADER_GOOGLE_ACTIVITIES = 'Google activities'; var HEADER_HUAWEI_ACTIVITIES = 'Huawei activities'; var HEADER_GOOGLE_SERVICES = 'Google Services'; var HEADER_HUAWEI_SERVICES = 'Huawei Services'; var HEADER_GOOGLE_MESSAGING_SERVICES = 'Google Messaging Services'; var HEADER_HUAWEI_MESSAGING_SERVICES = 'Huawei Messaging Services'; var HEADER_OTHERS = 'Others'; // 3- write to excel file exports.HEADERS = [ HEADER_PACKAGE_NAME, HEADER_VERSION_NAME, HEADER_GOOGLE_PLAY_UPDATE_DATE, HEADER_APK_CREATION_DATE, HEADER_HUAWEI_APP_ID, HEADER_GMS_KITS, HEADER_HMS_KITS, HEADER_SDKS, HEADER_GOOGLE_METADATAS, HEADER_HUAWEI_METADATAS, HEADER_GOOGLE_PERMISSIONS, HEADER_HUAWEI_PERMISSIONS, HEADER_GOOGLE_ACTIVITIES, HEADER_HUAWEI_ACTIVITIES, HEADER_GOOGLE_SERVICES, HEADER_HUAWEI_SERVICES, HEADER_GOOGLE_MESSAGING_SERVICES, HEADER_HUAWEI_MESSAGING_SERVICES, HEADER_OTHERS, ]; var getRowFromApp = function (app) { var appAsRow = {}; var asString = function (arr) { return (arr || []).join(',\n'); }; appAsRow[HEADER_PACKAGE_NAME] = app.packageName; appAsRow[HEADER_VERSION_NAME] = app.versionName; appAsRow[HEADER_GOOGLE_PLAY_UPDATE_DATE] = app.storeUploadDate; appAsRow[HEADER_APK_CREATION_DATE] = app.apkCreationTime; appAsRow[HEADER_HUAWEI_APP_ID] = app.huaweiAppId; appAsRow[HEADER_GMS_KITS] = (app['GMS'] || []).join(' | '); appAsRow[HEADER_HMS_KITS] = (app['HMS'] || []).join(' | '); var domainSdks = app.sdkPerDomain.map(function (d) { if (d.sdks.length == 0) return ""; var ds = d.sdks.map(function (sdk) { return "".concat(sdk.name, " ").concat(sdk.version == '0' ? '' : sdk.version); }); return "\n[".concat(d.domain, "] ").concat(ds.join(', ')); }); appAsRow[HEADER_SDKS] = domainSdks.join(''); appAsRow[HEADER_GOOGLE_METADATAS] = asString(app.googleMetadata); appAsRow[HEADER_HUAWEI_METADATAS] = asString(app.huaweiMetadata); appAsRow[HEADER_GOOGLE_PERMISSIONS] = asString(app.googlePermissions); appAsRow[HEADER_HUAWEI_PERMISSIONS] = asString(app.huaweiPermissions); appAsRow[HEADER_GOOGLE_ACTIVITIES] = asString(app.googleActivities); appAsRow[HEADER_HUAWEI_ACTIVITIES] = asString(app.huaweiActivities); appAsRow[HEADER_GOOGLE_SERVICES] = asString(app.googleServices); appAsRow[HEADER_HUAWEI_SERVICES] = asString(app.huaweiServices); appAsRow[HEADER_GOOGLE_MESSAGING_SERVICES] = asString(app.googleMessagingServices); appAsRow[HEADER_HUAWEI_MESSAGING_SERVICES] = asString(app.huaweiMessagingServices); appAsRow[HEADER_OTHERS] = asString(app.others || []); return appAsRow; }; exports.getRowFromApp = getRowFromApp; var saveResult = function (apps, resultPath) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(void 0, void 0, void 0, function () { var data, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: data = []; apps.forEach(function (app) { return __awaiter(void 0, void 0, void 0, function () { var row; return __generator(this, function (_a) { row = (0, exports.getRowFromApp)(app); data.push(row); return [2 /*return*/]; }); }); }); _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, writeExcel(data, resultPath)]; case 2: _a.sent(); resolve(true); return [3 /*break*/, 4]; case 3: e_1 = _a.sent(); debug(e_1); reject(e_1); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); })]; }); }); }; exports.saveResult = saveResult; /** * this script write data into an excel file * @param {array} data array of data to write into excel, inner object keys must match the values of @param headers, * example: data = [ * { columnA: 1, columnB: 2, columnC: 3 }, * { columnA: 4, columnB: 5, columnC: 6 }, * { columnA: 7, columnB: 8, columnC: 9 } * ] * @param {array} resultPath excel path * @return {Promise} */ var writeExcel = function (data, resultPath) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(void 0, void 0, void 0, function () { var exportFileName, sheetName, workbook, emptySheet, worksheet, existingData, wscols; return __generator(this, function (_a) { exportFileName = path_1.default.basename(resultPath); sheetName = exportFileName.replace('.xlsx', ''); if (sheetName.length > 30) sheetName = sheetName.substring(0, 30); try { workbook = xlsx_1.default.readFile(resultPath); } catch (e) { debug(exportFileName + ' not found, will be created'); emptySheet = xlsx_1.default.utils.json_to_sheet([]); workbook = xlsx_1.default.utils.book_new(); xlsx_1.default.utils.book_append_sheet(workbook, emptySheet, sheetName); try { xlsx_1.default.writeFileXLSX(workbook, resultPath); } catch (e) { reject(e); } } // get the first sheet sheetName = workbook.SheetNames[0]; worksheet = workbook.Sheets[sheetName]; existingData = xlsx_1.default.utils.sheet_to_json(worksheet); data = __spreadArray(__spreadArray([], existingData, true), data, true); worksheet = xlsx_1.default.utils.sheet_add_json(worksheet, data, { header: exports.HEADERS }); wscols = [ { wch: 30 }, { wch: 20 }, { wch: 25 }, { wch: 25 }, { wch: 20 }, { wch: 40 }, { wch: 40 }, { wch: 60 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, { wch: 50 }, // other ]; if (!consts_1.IS_PROD && wscols.length != exports.HEADERS.length) { console.error(new Error("Missing column width, headers=".concat(exports.HEADERS.length, " wscols=").concat(wscols.length))); } worksheet['!cols'] = wscols; // worksheet = excel.utils.book(worksheet, data, { headers }); try { xlsx_1.default.writeFileXLSX(workbook, resultPath); } catch (e) { reject(e); } resolve(true); return [2 /*return*/]; }); }); })]; }); }); };