From bdc9b0d205f509753d86bbbc66243f6e89ffc393 Mon Sep 17 00:00:00 2001 From: LEORChn Date: Wed, 6 May 2020 22:20:18 +0800 Subject: [PATCH 1/2] Add support for Chrome43, base on the NodeJS version --- axml_Chrome43/android.R.attr.js | 60 +++ axml_Chrome43/axml_ECMAScript5_readonly.js | 416 ++++++++++++++++++ axml_Chrome43/index.html | 57 +++ ...Space_64Bit_Support_1.0.3032_gg_signed.apk | Bin 0 -> 50504 bytes 4 files changed, 533 insertions(+) create mode 100644 axml_Chrome43/android.R.attr.js create mode 100644 axml_Chrome43/axml_ECMAScript5_readonly.js create mode 100644 axml_Chrome43/index.html create mode 100644 axml_Chrome43/testcase/Parallel_Space_64Bit_Support_1.0.3032_gg_signed.apk diff --git a/axml_Chrome43/android.R.attr.js b/axml_Chrome43/android.R.attr.js new file mode 100644 index 0000000..f576077 --- /dev/null +++ b/axml_Chrome43/android.R.attr.js @@ -0,0 +1,60 @@ +var android_R_attr = { + toString: function(name, value){ + var names = ''; + android_R_attr[name].foreach(function(e){ + if((value & e[0]) == e[0]){ + if(e[0] == 0 && names.length > 0){ // 0值键可以输出,但是要求在此之前没有输出任何东西,比如想要匹配 protectionLevel 中的 normal,那么就要求不能匹配比他优先级更高的值 + return; // 当之前已经输出过其他键时,跳过输出0值键 + } + if(names.length > 0) names += '|'; // 第二个以及之后输出的,添加一个分隔符然后再连接 + names += e[1]; + value ^= e[0]; // 异或该值,使其更低优先级的值不可匹配。比如 protectionLevel 在匹配 signatureOrSystem 之后不可再匹配 signature 和 dangerous + } + }); + return names; + }, + 'android:configChanges': [ // 使用或运算符连接。https://developer.android.com/reference/android/R.attr?hl=zh-cn#configChanges + [0x40000000, 'fontScale'], + [ 0x4000, 'colorMode'], + [ 0x2000, 'layoutDirection'], + [ 0x1000, 'density'], + [ 0x800, 'smallestScreenSize'], + [ 0x400, 'screenSize'], + [ 0x200, 'uiMode'], + [ 0x100, 'screenLayout'], + [ 0x80, 'orientation'], + [ 0x40, 'navigation'], + [ 0x20, 'keyboardHidden'], + [ 0x10, 'keyboard'], + [ 8, 'touchscreen'], + [ 4, 'locale'], + [ 2, 'mnc'], + [ 1, 'mcc'] + ], + 'android:protectionLevel': [ // 使用或运算符连接。https://developer.android.com/reference/android/R.attr?hl=zh-cn#protectionLevel + [0x1000000, 'retailDemo'], + [ 0x800000, 'companion'], + [ 0x200000, 'appPredictor'], + [ 0x100000, 'incidentReportApprover'], + [ 0x80000, 'configurator'], + [ 0x40000, 'documenter'], + [ 0x20000, 'wellbeing'], + [ 0x10000, 'textClassifier'], + [ 0x8000, 'vendorPrivileged'], + [ 0x4000, 'oem'], + [ 0x2000, 'runtime'], + [ 0x1000, 'instant'], + [ 0x800, 'setup'], + [ 0x400, 'preinstalled'], + [ 0x200, 'verifier'], + [ 0x100, 'installer'], + [ 0x80, 'pre23'], + [ 0x40, 'appop'], + [ 0x20, 'development'], + [ 0x10, 'system'], // the name: "privileged" deprecated in api23 + [ 3, 'signatureOrSystem'], // 常用 + [ 2, 'signature'], // 常用 + [ 1, 'dangerous'], // 常用 + [ 0, 'normal'] // 常用 + ] +}; diff --git a/axml_Chrome43/axml_ECMAScript5_readonly.js b/axml_Chrome43/axml_ECMAScript5_readonly.js new file mode 100644 index 0000000..30c9df9 --- /dev/null +++ b/axml_Chrome43/axml_ECMAScript5_readonly.js @@ -0,0 +1,416 @@ +/* Android Manifest Reader */ +"use strict"; + +function abort(message) { + throw ('Failure: ' + message); +} + +function le32_get(array, offset) { + return (array[offset + 3] << 24) | (array[offset + 2] << 16) | (array[offset + 1] << 8) | array[offset]; +} + +function le16_get(array, offset) { + return (array[offset + 1] << 8) | array[offset]; +} + +function parse_manifest_header(array, offset) { + const header = { + magic: le16_get(array, offset), + self_size: le16_get(array, offset + 2), + file_size: le32_get(array, offset + 4) + }; + + if (header.magic !== 0x0003 || header.self_size !== 8) { + abort('unrecognized manifest header'); + } + + return header; +} + +function parse_string_pool(array, offset) { + const header = { + magic: le16_get(array, offset), + self_size: le16_get(array, offset + 2), + chunk_size: le32_get(array, offset + 4), + nstrings: le32_get(array, offset + 8), + nstyles: le32_get(array, offset + 12), + flags: le32_get(array, offset + 16), + strings_offset: le32_get(array, offset + 20), + styles_offset: le32_get(array, offset + 24) + }; + + if (header.magic !== 0x0001 || header.self_size !== 28) { + abort('unrecognized string pool header'); + } + + if (header.nstyles !== 0 || header.styles_offset !== 0) { + abort('styles are not supported'); + } + + offset += header.strings_offset; + + const pool = []; + + for (let i = 0; i < header.nstrings; i++) { + const slen = le16_get(array, offset) * 2; + offset += 2; + var str = utf16ToUtf8(String.fromCharCode.apply(null, array.slice(offset, offset + slen))); + pool.push({ + index: i, + length: slen, + value: str + }); + offset += slen + 2; + } + + return { + header: header, + pool: pool + }; +} + +function parse_resource_pool(array, offset) { + const header = { + magic: le16_get(array, offset), + self_size: le16_get(array, offset + 2), + chunk_size: le32_get(array, offset + 4), + }; + + if (header.magic !== 0x0180 || header.self_size !== 8) { + abort('unrecognized resource pool header'); + } + + const nresources = (header.chunk_size - header.self_size) / 4; + offset += header.self_size; + + const pool = []; + + for (let i = 0; i < nresources; i++) { + pool.push({ + value: le32_get(array, offset) + }); + offset += 4; + } + + return { + header: header, + pool: pool + }; +} + +function bind_resource_ids(string_pool, resource_pool) { + let bound = 0; + + for (let i = 0; i < resource_pool.pool.length; i++) { + if (i >= string_pool.pool.length) { + abort('resource range exceeded'); + } + + string_pool.pool[i].resource_id = resource_pool.pool[i].value; + bound++; + } + console.log('bound ' + bound + ' resource ids.'); +} + +function type2str(type) { + switch (type) { + case 0x01000008: + return 'id_ref'; + case 0x02000008: + return 'attr_ref'; + case 0x03000008: + return 'string'; + case 0x05000008: + return 'dimen'; + case 0x06000008: + return 'fraction'; + case 0x10000008: + return 'int'; + case 0x04000008: + return 'float'; + case 0x11000008: + return 'flags'; + case 0x12000008: + return 'bool'; + case 0x1c000008: + return 'color'; + case 0x1d000008: + return 'color2'; + default: + return "" + type; + } +} + +function parse_attribute(array, offset, string_pool) { + const result = { + namespace: le32_get(array, offset), + name: le32_get(array, offset + 4), + value: le32_get(array, offset + 8), + type: type2str(le32_get(array, offset + 12)), + resource_id: le32_get(array, offset + 16) + }; + + result.name_string = get_string_from_pool(string_pool, result.name); + + if (result.type === 0x03000008) { // type string + result.value_string = get_string_from_pool(string_pool, result.value); + } + + return result; +} + +function parse_attributes(tag, array, offset, string_pool) { + for (let i = 0; i < tag.attributes_count; i++) { + tag.attributes.push(parse_attribute(array, offset + 36 + i * 20, string_pool)); + } +} + +function get_string_from_pool(string_pool, index) { + if (index >= string_pool.header.nstrings) { + console.log('string index ' + index + ' out of range'); + return '(unknown)'; + } + + return string_pool.pool[index].value; +} + +function parse_xml_tag(array, offset, string_pool) { + let id = le32_get(array, offset); + + switch (id) { + case 0x00100100: + case 0x00100101: + return { + role: id === 0x00100100 ? 'start-ns' : 'end-ns', + chunk_size: le32_get(array, offset + 4), + line: le32_get(array, offset + 8), + comment: le32_get(array, offset + 12), + prefix: le32_get(array, offset + 16), + namespace: le32_get(array, offset + 20) + }; + case 0x00100102: + const tag = { + role: 'start-tag', + chunk_size: le32_get(array, offset + 4), + line: le32_get(array, offset + 8), + comment: le32_get(array, offset + 12), + namespace: le32_get(array, offset + 16), + name: le32_get(array, offset + 20), + name_string: get_string_from_pool(string_pool, le32_get(array, offset + 20)), + attributes_size: le32_get(array, offset + 24), + attributes_count: le32_get(array, offset + 28), + attribute_id: le32_get(array, offset + 32), + attributes: [] + }; + parse_attributes(tag, array, offset, string_pool); + return tag; + case 0x00100104: + return { + role: 'text', + chunk_size: le32_get(array, offset + 4), + line: le32_get(array, offset + 8), + comment: le32_get(array, offset + 12), + string_id: le32_get(array, offset + 16), + unused1: le32_get(array, offset + 20), + unused2: le32_get(array, offset + 24) + }; + case 0x00100103: + return { + role: 'end-tag', + chunk_size: le32_get(array, offset + 4), + line: le32_get(array, offset + 8), + comment: le32_get(array, offset + 12), + namespace: le32_get(array, offset + 16), + name: le32_get(array, offset + 20), + name_string: get_string_from_pool(string_pool, le32_get(array, offset + 20)) + }; + default: + abort('unrecognized tag found'); + } +} + +function decompress_xml(source) { + const array = source; + let offset = 0; + + const manifest = parse_manifest_header(array, offset); + offset += manifest.self_size; + + console.log('file size: ' + manifest.file_size + ' bytes.'); + + const string_pool = parse_string_pool(array, offset); + offset += string_pool.header.chunk_size; + + // console.log('parsed string pool.'); + + const resource_pool = parse_resource_pool(array, offset); + offset += resource_pool.header.chunk_size; + + // console.log('parsed resource pool.'); + + bind_resource_ids(string_pool, resource_pool); + + const xml = []; + + while (offset < array.length) { + const tag = parse_xml_tag(array, offset, string_pool); + xml.push(tag); + offset += tag.chunk_size; + } + + // console.log('parsed xml document.'); + + const result = { + string_pool: string_pool.pool, + xml: xml + }; + + // console.log('done xml decompressing.'); + return result; +} + +function parse_to_xml(source){ + if(source.constructor.name != 'Array'){ + source = arr(source); + } + var j = decompress_xml(source); + + pl(j); // preview + + // ===== ===== ===== ===== + + // convert to custom json format, for convert to xml later + var s = j.string_pool, + doc = { + ns: [], // namespace pool + }, + cur_tag = doc; + var first_start_tag = true; + j.xml.foreach(function(e){ + switch(e.role){ + case 'start-ns': + doc.ns[e.namespace] = { + name: s[e.prefix].value, + url: s[e.namespace].value + }; + break; + case 'start-tag': + var t = {}; + t.__parent = cur_tag; + t.name = (e.namespace == -1? '': doc.ns[e.namespace].name + ':') + e.name_string; + if('attributes' in e){ + t.attr = []; + e.attributes.foreach(function(f){ + var a = {}; + a.name = (f.namespace == -1? '': doc.ns[f.namespace].name + ':') + f.name_string; + switch(f.type){ + case 'int': + a.value = f.resource_id; + break; + case 'string': + a.value = s[f.value].value; + break; + case 'bool': + a.value = f.value == 0? 'false': 'true'; + break; + case 'id_ref': + a.value = '@' + f.resource_id.toString(16); + break; + case 'flags': + a.value = android_R_attr.toString(a.name, f.resource_id); + break; + default: + pl('uncase value type: '+f.type); + } + t.attr.push(a); + }); + } + if(!('_children' in cur_tag)){ + cur_tag._children = []; + } + cur_tag._children.push(t); + cur_tag = t; + break; + case 'end-tag': + cur_tag = cur_tag.__parent; + break; + } + }); + + // push namespace to the root node + var rootnode = doc._children[0]; + if(!('attr' in rootnode)) rootnode.attr = []; + doc.ns.foreach(function(e){ + if(!e) return; + rootnode.attr.push({ + name: 'xmlns:' + e.name, + value: e.url + }); + }); + + pl(doc); // preview + + // ===== ===== ===== ===== + + // convert the custom json to xml + var dom = '', + processor = function(e){ + var attr = ''; + if('attr' in e){ + e.attr.foreach(function(f){ + attr += ` ${f.name}="${f.value}"`; // 先拼接节点属性 + }); + } + var firstline = '<' + e.name + attr, // 拼接节点头部(不确定有没有子节点所以先放着) + childline = '', + lastline = ''; + if('_children' in e && e._children.length > 0){ + firstline += '>'; // 确定有子节点,补充节点头部 + lastline = ``; // 由于有子节点,那么节点尾部就是这样的 + e._children.foreach(function(f){ + childline += processor(f); // 拼接子节点(递归) + }); + }else{ + lastline = ' />'; // 由于没有子节点,那么节点尾部是这样的 + } + return firstline + childline + lastline; + }; + var output = dom + processor(doc._children[0]); + + // return output; + ft('textarea')[0].innerText = output; +} + +function utf16ToUtf8(s){ + if(!s) return; + + var i, code, ret = [], len = s.length; + for(i = 0; i < len; i++){ + code = s.charCodeAt(i); + if(code > 0x0 && code <= 0x7f){ + // 单字节 + // UTF-16 0000 - 007F + // UTF-8 0xxxxxxx + ret.push(s.charAt(i)); + }else if(code >= 0x80 && code <= 0x7ff){ + // 双字节 + // UTF-16 0080 - 07FF + // UTF-8 110xxxxx 10xxxxxx + ret.push( + String.fromCharCode(0xc0 | ((code >> 6) & 0x1f)), // 110xxxxx + String.fromCharCode(0x80 | (code & 0x3f)) // 10xxxxxx + ); + }else if(code >= 0x800 && code <= 0xffff){ + // 三字节 + // UTF-16 0800 - FFFF + // UTF-8 1110xxxx 10xxxxxx 10xxxxxx + ret.push( + String.fromCharCode(0xe0 | ((code >> 12) & 0xf)), // 1110xxxx + String.fromCharCode(0x80 | ((code >> 6) & 0x3f)), // 10xxxxxx + String.fromCharCode(0x80 | (code & 0x3f)) // 10xxxxxx + ); + } + } + + return ret.join(''); +} diff --git a/axml_Chrome43/index.html b/axml_Chrome43/index.html new file mode 100644 index 0000000..870f866 --- /dev/null +++ b/axml_Chrome43/index.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + +
+ +
VersionName
VersionCode
+ +
+ + + + + + + \ No newline at end of file diff --git a/axml_Chrome43/testcase/Parallel_Space_64Bit_Support_1.0.3032_gg_signed.apk b/axml_Chrome43/testcase/Parallel_Space_64Bit_Support_1.0.3032_gg_signed.apk new file mode 100644 index 0000000000000000000000000000000000000000..901388e041f3a9bc3876aa2aa2f9fa816717ec6c GIT binary patch literal 50504 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

p`Gi6a@BtS>0Wa}kNbwa6*dJ`zA9au^ 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 -~D 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 Date: Wed, 6 May 2020 22:32:29 +0800 Subject: [PATCH 2/2] add a baselib copy --- axml_Chrome43/LEORChn.baseLib.js | 276 +++++++++++++++++++++++++++++++ axml_Chrome43/index.html | 2 +- 2 files changed, 277 insertions(+), 1 deletion(-) create mode 100644 axml_Chrome43/LEORChn.baseLib.js diff --git a/axml_Chrome43/LEORChn.baseLib.js b/axml_Chrome43/LEORChn.baseLib.js new file mode 100644 index 0000000..4ecfa35 --- /dev/null +++ b/axml_Chrome43/LEORChn.baseLib.js @@ -0,0 +1,276 @@ +var htmlhead=document.head, + htmlbody=document.body; +(function(){ + // Generic Method Compat + if(!('contains' in String.prototype)) String.prototype.contains=function(s){ return this.indexOf(s)>-1; }; + var imed=false; + HTMLInputElement.prototype.__defineGetter__('imeDisabled',function(){ return imed? true: false; }); + HTMLInputElement.prototype.__defineSetter__('imeDisabled',function(s){ + imed = s? true: false; + this.onkeyup = imed? function(){ + var sel = this.selectionStart, + sav = this.value, + right = sav.substr(sel), + lef = sav.substr(0, sel), + aft = lef.replace(/'/g, ''), + wipecount = lef.length - aft.length; + if(sel != this.selectionEnd) return; + this.blur(); + this.focus(); + this.value = aft + right; + this.selectionStart = this.selectionEnd = sel - wipecount; + }: undefined; + }); + + // IE Method Compat + _proto(HTMLElement, 'remove', function(){ try{this.parentElement.removeChild(this);}catch(e){} }); + _proto(EventTarget, 'addEventListener', function(n,f){ this.attachEvent('on'+n, f); }); + _proto(String, 'includes', function(s){ return this.indexOf(s)>-1; }); + + // Firefox Method Compat + if(!('innerText' in document.body)){ + HTMLElement.prototype.__defineGetter__("innerText", function(){ return this.textContent; }); + HTMLElement.prototype.__defineSetter__("innerText", function(s){ return this.textContent=s; }); + } + + // Constom Method Modify + _proto(Array, 'foreach', function(func){ for(var i=0; i 2) pl(new Error('Somewhere might using old version to create Elements. PLEASE UPDATE YOUR CODE.')); + tag = { + entity: null, + raw: tag, + data: tag.split(/[#\.\s]/g) + }; + var nextStart = 0; + tag.data.foreach(function(e){ + nextStart ++; + if(e.length == 0) return; // continue + nextStart --; + switch(tag.raw.charAt(nextStart)){ + case ' ': case '.': + addClass(tag.entity, e); break; + case '#': + tag.entity.id = e; break; + default: + tag.entity = document.createElement(e); + nextStart --; + } + nextStart += e.length + 1; + }); + if(t) tag.entity.innerText = t; + return tag.entity; +} +function msgbox(msg){alert(msg);} +function inputbox(title,defalt){return prompt(title,defalt);} +function pl(s){console.log(s);} +function vaild(o){return!(o==undefined||o==null||isNaN(o));} +function gquery(n){ return _GET(n); } // get Query +function _GET(n){ + var r=location.search.match(new RegExp("[\?\&]"+n+"=([^\&]+)","i")); + return r==null||r.length<1?'':r[1]; +} +/* patch() 参数情况: + 单个EventTarget:直接返回本体 + 单个EventTarget但是用数组封装:返回该数组 + 多个EventTarget:返回封装数组 + 其他情况比如数组和EventTarget混用等:不管他 +*/ +function patch(){ + var args = arguments, + insideSelf = args.length==1 && args[0] instanceof EventTarget; + if(args.length==1 && args[0] instanceof Array) args = args[0]; // 如果参数只是一个数组而且没有别的东西,就分离解析 + for(var i=0; i

- +