jh5_app_build 1.0.27 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/build_std.js +121 -19
- package/package.json +1 -1
package/lib/build_std.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/* eslint-disable no-mixed-operators */
|
|
2
|
+
/* eslint-disable no-lonely-if */
|
|
1
3
|
let glob = require("glob")
|
|
2
4
|
let archiver = require('archiver');
|
|
3
5
|
let jutils = require('base_parts');
|
|
@@ -9,6 +11,96 @@ let AdmZip = require('adm-zip');
|
|
|
9
11
|
let child_process = require('child_process');
|
|
10
12
|
|
|
11
13
|
|
|
14
|
+
function adler32_buf(buf, seed) {
|
|
15
|
+
// eslint-disable-next-line
|
|
16
|
+
var a = 1, b = 0, L = buf.length, M = 0;
|
|
17
|
+
// eslint-disable-next-line no-bitwise
|
|
18
|
+
if (typeof seed === 'number') { a = seed & 0xFFFF; b = (seed >>> 16) & 0xFFFF; }
|
|
19
|
+
for (var i = 0; i < L;) {
|
|
20
|
+
M = Math.min(L - i, 2654) + i;
|
|
21
|
+
for (; i < M; i++) {
|
|
22
|
+
// eslint-disable-next-line no-bitwise
|
|
23
|
+
a += buf[i] & 0xFF;
|
|
24
|
+
b += a;
|
|
25
|
+
}
|
|
26
|
+
// eslint-disable-next-line no-bitwise
|
|
27
|
+
a = (15 * (a >>> 16) + (a & 65535));
|
|
28
|
+
// eslint-disable-next-line no-bitwise
|
|
29
|
+
b = (15 * (b >>> 16) + (b & 65535));
|
|
30
|
+
}
|
|
31
|
+
// eslint-disable-next-line no-bitwise
|
|
32
|
+
return ((b % 65521) << 16) | (a % 65521);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let jfile_utils = jutils.jfile_utils;
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
function reNameData(anfData, pkgName, codePage) {
|
|
39
|
+
// 修改应用名
|
|
40
|
+
let tmpName = Buffer.from("jsmart", codePage);
|
|
41
|
+
// eslint-disable-next-line no-constant-condition
|
|
42
|
+
while (true) {
|
|
43
|
+
let nameIndex = anfData.indexOf(tmpName);
|
|
44
|
+
if (nameIndex < 0) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let toName = Buffer.from(pkgName, codePage);
|
|
49
|
+
if (tmpName.length !== toName.length) {
|
|
50
|
+
throw new Error("pkgName length must 6")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// 写入名
|
|
54
|
+
for (let index = 0; index < toName.length; index++) {
|
|
55
|
+
anfData[nameIndex + index] = toName[index];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 复制文件夹并重命名数据
|
|
63
|
+
* @param {*} srcDir 原始目录
|
|
64
|
+
* @param {*} destDir 目标目录
|
|
65
|
+
* @param {*} pkgName 目标名
|
|
66
|
+
* @returns {*} 无
|
|
67
|
+
*/
|
|
68
|
+
async function copyReNameDir(srcDir, destDir, pkgName) {
|
|
69
|
+
await jfile_utils.mkdir(destDir)
|
|
70
|
+
|
|
71
|
+
var fileList = await jfile_utils.readdir(srcDir);
|
|
72
|
+
for (var index = 0; index < fileList.length; index++) {
|
|
73
|
+
var fileName = fileList[index];
|
|
74
|
+
var srcPath = srcDir + "/" + fileName;
|
|
75
|
+
var destPath = destDir + "/" + fileName;
|
|
76
|
+
var fileStat;
|
|
77
|
+
try {
|
|
78
|
+
fileStat = await jfile_utils.lstat(srcPath);
|
|
79
|
+
if (fileStat.isDirectory()) {
|
|
80
|
+
// 目录
|
|
81
|
+
await copyReNameDir(srcPath, destPath, pkgName);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// 文件
|
|
85
|
+
let anfData = fs.readFileSync(srcPath);
|
|
86
|
+
|
|
87
|
+
// 修改数据
|
|
88
|
+
reNameData(anfData, pkgName, 'utf8');
|
|
89
|
+
reNameData(anfData, pkgName, 'utf16le');
|
|
90
|
+
|
|
91
|
+
if (path.extname(srcPath) === ".dex") {
|
|
92
|
+
let sunData = anfData.subarray(0x0C)
|
|
93
|
+
anfData.writeInt32LE(adler32_buf(sunData), 0x08)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
fs.writeFileSync(destPath, anfData);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
12
104
|
/**
|
|
13
105
|
* 创建目录并获取尾部带斜线的路径
|
|
14
106
|
* @param {string} dirPath 路径
|
|
@@ -29,7 +121,7 @@ function makeAndGetDir(dirPath) {
|
|
|
29
121
|
* @returns {void}
|
|
30
122
|
*/
|
|
31
123
|
async function makeDirAndCopy(srcFile, dstFile) {
|
|
32
|
-
await
|
|
124
|
+
await jfile_utils.createDirs(dstFile, true);
|
|
33
125
|
fs.copyFileSync(srcFile, dstFile);
|
|
34
126
|
}
|
|
35
127
|
|
|
@@ -38,7 +130,8 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
38
130
|
|
|
39
131
|
try {
|
|
40
132
|
// 模板目录
|
|
41
|
-
var
|
|
133
|
+
var stdBinPriDir = `${buildCfg.rootPath}/jbuild_data/std_bins`;
|
|
134
|
+
var stdBinDir = `${buildCfg.rootPath}/jbuild_data/std_out`;
|
|
42
135
|
|
|
43
136
|
// jre目录
|
|
44
137
|
let jreCwd = "C:\\jdev_develop\\jre\\bin";
|
|
@@ -57,11 +150,15 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
57
150
|
// 默认软件名
|
|
58
151
|
if (!apkinfoObj.appName) apkinfoObj.appName = "智能终端"
|
|
59
152
|
|
|
153
|
+
// 清理数据
|
|
154
|
+
console.log(`init dir ...`);
|
|
155
|
+
await jfile_utils.deleteFolder(stdBinDir);
|
|
156
|
+
await jfile_utils.mkdir(stdBinDir);
|
|
157
|
+
|
|
60
158
|
// 存在自定义apk
|
|
61
159
|
var custumApk = `${buildCfg.rootPath}/apk_cfg/app-release.apk`
|
|
62
160
|
if (fs.existsSync(custumApk)) {
|
|
63
161
|
console.warn(`exists custum Apk, unpack custum apk...`);
|
|
64
|
-
await jutils.jfile_utils.deleteFolder(stdBinDir);
|
|
65
162
|
child_process.execFileSync("C:\\jdev_develop\\jre\\bin\\java.exe", [
|
|
66
163
|
"-jar", "C:\\jdev_develop\\h5_bin\\apktool.jar",
|
|
67
164
|
"d", custumApk,
|
|
@@ -71,15 +168,25 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
71
168
|
cwd: jreCwd
|
|
72
169
|
});
|
|
73
170
|
}
|
|
171
|
+
else {
|
|
172
|
+
// 修改应用名
|
|
173
|
+
if (apkinfoObj.pkgName) {
|
|
174
|
+
await copyReNameDir(stdBinPriDir, stdBinDir, apkinfoObj.pkgName);
|
|
175
|
+
}
|
|
176
|
+
// 不修改
|
|
177
|
+
else {
|
|
178
|
+
await jfile_utils.copyFolder(stdBinPriDir, stdBinDir);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
74
181
|
|
|
75
|
-
//
|
|
182
|
+
// 清理demo内容
|
|
76
183
|
console.log(`delete temp file ...`);
|
|
77
|
-
await
|
|
78
|
-
await
|
|
79
|
-
await
|
|
80
|
-
await
|
|
81
|
-
await
|
|
82
|
-
await
|
|
184
|
+
await jfile_utils.deleteFolder(stdBinDir + "/assets/device_webapi");
|
|
185
|
+
await jfile_utils.deleteFolder(stdBinDir + "/assets/h5app");
|
|
186
|
+
await jfile_utils.deleteFolder(stdBinDir + "/assets/jext");
|
|
187
|
+
await jfile_utils.deleteFolder(stdBinDir + "/assets/screen");
|
|
188
|
+
await jfile_utils.deleteFolder(stdBinDir + "/assets/sounds");
|
|
189
|
+
await jfile_utils.deleteFolder(stdBinDir + "/build");
|
|
83
190
|
|
|
84
191
|
// 修改版本号
|
|
85
192
|
let platformVer = jutils.getUUID();
|
|
@@ -171,7 +278,7 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
171
278
|
if (fileList.length === 0) {
|
|
172
279
|
console.warn("no audio_wav files!");
|
|
173
280
|
try {
|
|
174
|
-
|
|
281
|
+
jfile_utils.createDirs(pathSub)
|
|
175
282
|
} catch (error) {
|
|
176
283
|
}
|
|
177
284
|
}
|
|
@@ -219,17 +326,12 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
219
326
|
// 修改其他信息
|
|
220
327
|
try {
|
|
221
328
|
var AndroidManifestPath = stdBinDir + "/AndroidManifest.xml";
|
|
222
|
-
var
|
|
223
|
-
// 备份
|
|
224
|
-
if (!fs.existsSync(AndroidManifestPathBak)) {
|
|
225
|
-
fs.copyFileSync(AndroidManifestPath, AndroidManifestPathBak);
|
|
226
|
-
}
|
|
227
|
-
var anfData = fs.readFileSync(AndroidManifestPathBak);
|
|
329
|
+
var anfData = fs.readFileSync(AndroidManifestPath);
|
|
228
330
|
|
|
229
331
|
// 修改应用名
|
|
230
332
|
if (apkinfoObj.appName) {
|
|
231
333
|
let tmpName = Buffer.from("7A3657B017788420AE749039F9D25A2E", 'utf16le');
|
|
232
|
-
|
|
334
|
+
let nameIndex = anfData.indexOf(tmpName);
|
|
233
335
|
if (nameIndex > 0) {
|
|
234
336
|
let toName = Buffer.from(apkinfoObj.appName, 'utf16le');
|
|
235
337
|
// 清空
|
|
@@ -359,7 +461,7 @@ module.exports = async (cmd, buildCfg) => {
|
|
|
359
461
|
} catch (error) {
|
|
360
462
|
// 清理文件
|
|
361
463
|
try {
|
|
362
|
-
|
|
464
|
+
jfile_utils.deleteFile(buildCfg.outpath);
|
|
363
465
|
} catch (error2) {
|
|
364
466
|
}
|
|
365
467
|
// 延迟报错
|