UNPKG

app-info-parser2

Version:

Exact info from apk or ipa file.

99 lines (82 loc) 4.12 kB
'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var Zip = require('./zip'); var _require = require('./utils'), mapInfoResource = _require.mapInfoResource, findApkInfoIcon = _require.findApkInfoIcon, getBase64FromBuffer = _require.getBase64FromBuffer; var ManifestName = /^androidmanifest\.xml$/; var ResourceName = /^resources\.arsc$/; var ManifestXmlParser = require('./xml-parser/manifest'); var ResourceFinder = require('./resource-finder'); var ApkParser = function (_Zip) { _inherits(ApkParser, _Zip); function ApkParser(file) { _classCallCheck(this, ApkParser); var _this = _possibleConstructorReturn(this, (ApkParser.__proto__ || Object.getPrototypeOf(ApkParser)).call(this, file)); if (!(_this instanceof ApkParser)) { var _ret; return _ret = new ApkParser(file), _possibleConstructorReturn(_this, _ret); } return _this; } _createClass(ApkParser, [{ key: 'parse', value: async function parse() { try { var buffers = await this.getEntries([ManifestName, ResourceName]); if (!buffers[ManifestName]) { throw new Error('AndroidManifest.xml can\'t be found.'); } // 解析 manifest var apkInfo = this._parseManifest(buffers[ManifestName]); // 解析 resourcemap var resourceMap = void 0; if (!buffers[ResourceName]) { resourceMap = {}; } else { // 解析 resourcemap resourceMap = this._parseresourceMap(buffers[ResourceName]); } // 结合resourcemap再次解析apkInfo apkInfo = mapInfoResource(apkInfo, resourceMap); // 获取icon base64值 try { var iconBuffer = await this.getEntry(findApkInfoIcon(apkInfo)); apkInfo.icon = getBase64FromBuffer(iconBuffer); } catch (err) { apkInfo.icon = null; } return apkInfo; } catch (e) { throw e; } } }, { key: '_parseManifest', value: function _parseManifest(buffer) { try { var parser = new ManifestXmlParser(buffer, { ignore: ['application.activity', 'application.service', 'application.receiver', 'application.provider', 'permission-group'] }); return parser.parse(); } catch (e) { throw new Error('Parse AndroidManifest.xml error: ', e); } } }, { key: '_parseresourceMap', value: function _parseresourceMap(buffer) { try { return new ResourceFinder().processResourceTable(buffer); } catch (e) { throw new Error('Parser resources.arsc error: ' + e); } } }]); return ApkParser; }(Zip); module.exports = ApkParser;