@hot-updater/android-helper 0.25.8 → 0.25.10
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/dist/index.cjs +120 -65
- package/dist/index.d.cts +21 -5
- package/dist/index.d.ts +21 -5
- package/dist/index.js +120 -66
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -35,8 +35,8 @@ let node_os = require("node:os");
|
|
|
35
35
|
node_os = __toESM(node_os);
|
|
36
36
|
|
|
37
37
|
//#region src/utils/createGradleLogger.ts
|
|
38
|
-
const createGradleLogger = () => new __hot_updater_cli_tools.BuildLogger({
|
|
39
|
-
|
|
38
|
+
const createGradleLogger = ({ logPrefix }) => new __hot_updater_cli_tools.BuildLogger({
|
|
39
|
+
logPrefix,
|
|
40
40
|
importantLogPatterns: [
|
|
41
41
|
"error:",
|
|
42
42
|
"Error:",
|
|
@@ -55,49 +55,95 @@ const createGradleLogger = () => new __hot_updater_cli_tools.BuildLogger({
|
|
|
55
55
|
"Android resource compilation failed",
|
|
56
56
|
"Duplicate class",
|
|
57
57
|
"Program type already present",
|
|
58
|
-
"actionable tasks:"
|
|
58
|
+
"actionable tasks:",
|
|
59
|
+
"Deprecated Gradle features were used",
|
|
60
|
+
":app:configureCMake",
|
|
61
|
+
":app:buildCMake",
|
|
62
|
+
":app:compileDebugKotlin",
|
|
63
|
+
":app:compileReleaseKotlin",
|
|
64
|
+
":app:compileDebugJavaWithJavac",
|
|
65
|
+
":app:compileReleaseJavaWithJavac",
|
|
66
|
+
":app:mergeDebugResources",
|
|
67
|
+
":app:mergeReleaseResources",
|
|
68
|
+
":app:processDebugResources",
|
|
69
|
+
":app:processReleaseResources",
|
|
70
|
+
":app:packageDebug",
|
|
71
|
+
":app:packageRelease",
|
|
72
|
+
":app:assembleDebug",
|
|
73
|
+
":app:assembleRelease"
|
|
59
74
|
],
|
|
60
|
-
|
|
61
|
-
[
|
|
75
|
+
progressStages: [
|
|
76
|
+
[
|
|
62
77
|
"buildKotlinToolingMetadata",
|
|
63
78
|
"generateAutolinkingNewArchitectureFiles",
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
79
|
+
"generateAutolinkingPackageList",
|
|
80
|
+
"generateCodegenSchemaFromJavaScript",
|
|
81
|
+
"generateCodegenArtifactsFromSchema",
|
|
82
|
+
"generateReactNativeEntryPoint"
|
|
83
|
+
],
|
|
84
|
+
[
|
|
67
85
|
"createBundleReleaseJsAndAssets",
|
|
68
86
|
"bundleReleaseJsAndAssets",
|
|
69
87
|
"bundleDebugJsAndAssets"
|
|
70
|
-
],
|
|
71
|
-
[
|
|
88
|
+
],
|
|
89
|
+
[
|
|
72
90
|
"generateReleaseResValues",
|
|
91
|
+
"generateDebugResValues",
|
|
73
92
|
"generateReleaseResources",
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
93
|
+
"generateDebugResources",
|
|
94
|
+
"mergeReleaseResources",
|
|
95
|
+
"mergeDebugResources"
|
|
96
|
+
],
|
|
97
|
+
[
|
|
77
98
|
"processReleaseResources",
|
|
99
|
+
"processDebugResources",
|
|
78
100
|
"processReleaseManifest",
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
101
|
+
"processDebugManifest",
|
|
102
|
+
"processDebugMainManifest",
|
|
103
|
+
"parseReleaseLocalResources",
|
|
104
|
+
"parseDebugLocalResources"
|
|
105
|
+
],
|
|
106
|
+
["compileReleaseKotlin", "compileDebugKotlin"],
|
|
107
|
+
["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"],
|
|
108
|
+
[
|
|
109
|
+
/configureCMake\w+\[/,
|
|
110
|
+
/buildCMake\w+\[/,
|
|
111
|
+
"mergeReleaseJniLibFolders",
|
|
112
|
+
"mergeDebugJniLibFolders",
|
|
113
|
+
"mergeReleaseNativeLibs",
|
|
114
|
+
"mergeDebugNativeLibs"
|
|
115
|
+
],
|
|
116
|
+
[
|
|
117
|
+
"desugarReleaseFileDependencies",
|
|
118
|
+
"desugarDebugFileDependencies",
|
|
84
119
|
"dexBuilderRelease",
|
|
120
|
+
"dexBuilderDebug",
|
|
85
121
|
"mergeDexRelease",
|
|
122
|
+
"mergeExtDexRelease",
|
|
123
|
+
"mergeExtDexDebug",
|
|
124
|
+
"mergeProjectDexRelease",
|
|
125
|
+
"mergeProjectDexDebug",
|
|
126
|
+
"mergeLibDexRelease",
|
|
127
|
+
"mergeLibDexDebug",
|
|
128
|
+
"mergeDebugGlobalSynthetics",
|
|
129
|
+
"mergeReleaseGlobalSynthetics",
|
|
86
130
|
"transformClassesWithDex"
|
|
87
|
-
],
|
|
88
|
-
[
|
|
131
|
+
],
|
|
132
|
+
[
|
|
89
133
|
"compressReleaseAssets",
|
|
134
|
+
"compressDebugAssets",
|
|
90
135
|
"optimizeReleaseResources",
|
|
91
|
-
"mergeReleaseAssets"
|
|
92
|
-
|
|
93
|
-
|
|
136
|
+
"mergeReleaseAssets",
|
|
137
|
+
"mergeDebugAssets"
|
|
138
|
+
],
|
|
139
|
+
[
|
|
94
140
|
"packageRelease",
|
|
95
141
|
"packageDebug",
|
|
96
142
|
"assembleRelease",
|
|
97
143
|
"assembleDebug"
|
|
98
|
-
],
|
|
99
|
-
[
|
|
100
|
-
[
|
|
144
|
+
],
|
|
145
|
+
["bundleRelease", "bundleDebug"],
|
|
146
|
+
["BUILD SUCCESSFUL", /\d+ actionable tasks:/]
|
|
101
147
|
]
|
|
102
148
|
});
|
|
103
149
|
|
|
@@ -132,7 +178,7 @@ const getGradleWrapper = () => process.platform.startsWith("win") ? "gradlew.bat
|
|
|
132
178
|
/**
|
|
133
179
|
* Run gradle build with specified tasks and arguments
|
|
134
180
|
*/
|
|
135
|
-
async function runGradle({ tasks, args, androidProjectPath, appModuleName }) {
|
|
181
|
+
async function runGradle({ tasks, logPrefix, args, androidProjectPath, appModuleName }) {
|
|
136
182
|
const gradleArgs = getTaskNames(appModuleName, tasks);
|
|
137
183
|
gradleArgs.push("-x", "lint");
|
|
138
184
|
if (args.extraParams) gradleArgs.push(...args.extraParams);
|
|
@@ -143,17 +189,25 @@ Tasks ${tasks.join(", ")}
|
|
|
143
189
|
Args ${gradleArgs.join(" ")}
|
|
144
190
|
`);
|
|
145
191
|
if ("port" in args && args.port != null) gradleArgs.push(`-PreactNativeDevServerPort=${args.port}`);
|
|
146
|
-
const logger = createGradleLogger();
|
|
147
|
-
logger.start(
|
|
192
|
+
const logger = createGradleLogger({ logPrefix });
|
|
193
|
+
await logger.start();
|
|
148
194
|
try {
|
|
149
|
-
const process$1 = (0, execa.execa)(getGradleWrapper(), gradleArgs, {
|
|
150
|
-
|
|
195
|
+
const process$1 = (0, execa.execa)(getGradleWrapper(), gradleArgs, {
|
|
196
|
+
cwd: androidProjectPath,
|
|
197
|
+
all: true
|
|
198
|
+
});
|
|
199
|
+
const outputStream = process$1.all ?? process$1.stdout;
|
|
200
|
+
if (outputStream) await logger.processStream(outputStream);
|
|
201
|
+
await process$1;
|
|
151
202
|
logger.stop();
|
|
152
203
|
} catch (e) {
|
|
204
|
+
logger.writeError(e);
|
|
153
205
|
logger.stop("Build failed", false);
|
|
154
206
|
if (e instanceof execa.ExecaError) __hot_updater_cli_tools.p.log.error(getCleanedErrorMessage(e));
|
|
155
207
|
else if (e instanceof Error) __hot_updater_cli_tools.p.log.error(e.message);
|
|
156
208
|
throw new Error("Failed to build the app. See the error above for details from Gradle.");
|
|
209
|
+
} finally {
|
|
210
|
+
await logger.close();
|
|
157
211
|
}
|
|
158
212
|
return findBuildDirectory({
|
|
159
213
|
androidProjectPath,
|
|
@@ -194,28 +248,15 @@ async function getBuildOutputFilePath({ aab, appModuleName, buildDirectory, vari
|
|
|
194
248
|
process.exit(1);
|
|
195
249
|
}
|
|
196
250
|
|
|
197
|
-
//#endregion
|
|
198
|
-
//#region src/utils/enrichNativeBuildAndroidScheme.ts
|
|
199
|
-
const enrichNativeBuildAndroidScheme = async ({ schemeConfig }) => {
|
|
200
|
-
return {
|
|
201
|
-
aab: true,
|
|
202
|
-
variant: "Release",
|
|
203
|
-
appModuleName: "app",
|
|
204
|
-
applicationId: schemeConfig.packageName,
|
|
205
|
-
...schemeConfig
|
|
206
|
-
};
|
|
207
|
-
};
|
|
208
|
-
|
|
209
251
|
//#endregion
|
|
210
252
|
//#region src/buildAndroid.ts
|
|
211
|
-
const buildAndroid = async ({ schemeConfig
|
|
253
|
+
const buildAndroid = async ({ schemeConfig }) => {
|
|
212
254
|
const androidProjectPath = path.default.join((0, __hot_updater_cli_tools.getCwd)(), "android");
|
|
213
|
-
const minBundleId = (0, __hot_updater_plugin_core.generateMinBundleId)();
|
|
214
|
-
const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
|
|
215
255
|
return runGradle({
|
|
216
|
-
args: { extraParams: [`-PMIN_BUNDLE_ID=${
|
|
256
|
+
args: { extraParams: [`-PMIN_BUNDLE_ID=${(0, __hot_updater_plugin_core.generateMinBundleId)()}`] },
|
|
217
257
|
appModuleName: schemeConfig.appModuleName,
|
|
218
258
|
tasks: schemeConfig.aab ? [`bundle${schemeConfig.variant}`] : [`assemble${schemeConfig.variant}`],
|
|
259
|
+
logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-build`,
|
|
219
260
|
androidProjectPath
|
|
220
261
|
});
|
|
221
262
|
};
|
|
@@ -406,19 +447,19 @@ const getAvailableDevicePort = async (startPort = defaultPort) => {
|
|
|
406
447
|
*/
|
|
407
448
|
const tryLaunchEmulator = async (name) => {
|
|
408
449
|
const port = await getAvailableDevicePort();
|
|
409
|
-
const
|
|
410
|
-
|
|
450
|
+
const spinner = __hot_updater_cli_tools.p.spinner();
|
|
451
|
+
spinner.start("Looking for available emulators");
|
|
411
452
|
const emulators = await getEmulatorNames();
|
|
412
453
|
const emulatorName = name ?? emulators[0];
|
|
413
454
|
let deviceId;
|
|
414
455
|
if (emulators.length > 0) try {
|
|
415
|
-
|
|
416
|
-
deviceId = await launchEmulator(emulatorName, port,
|
|
417
|
-
|
|
456
|
+
spinner.message(`Launching emulator "${emulatorName}"`);
|
|
457
|
+
deviceId = await launchEmulator(emulatorName, port, spinner);
|
|
458
|
+
spinner.stop(`Launched ${emulatorName} emulator.`);
|
|
418
459
|
} catch (error) {
|
|
419
|
-
|
|
460
|
+
spinner.error(`Failed to launch ${emulatorName} emulator. ${error.message}`);
|
|
420
461
|
}
|
|
421
|
-
else
|
|
462
|
+
else spinner.error("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device");
|
|
422
463
|
return deviceId;
|
|
423
464
|
};
|
|
424
465
|
/**
|
|
@@ -522,15 +563,15 @@ const tryInstallAppOnDevice = async ({ device, apkPath }) => {
|
|
|
522
563
|
];
|
|
523
564
|
adbArgs.push(apkPath);
|
|
524
565
|
const adbPath = Device.getAdbPath();
|
|
525
|
-
const
|
|
526
|
-
|
|
566
|
+
const spinner = __hot_updater_cli_tools.p.spinner();
|
|
567
|
+
spinner.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
|
|
527
568
|
try {
|
|
528
569
|
await (0, execa.execa)(adbPath, adbArgs);
|
|
529
|
-
|
|
570
|
+
spinner.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
|
|
530
571
|
} catch (error) {
|
|
531
572
|
const errorMessage = error.stdout || error.stderr || "Unknown error";
|
|
532
|
-
if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE"))
|
|
533
|
-
|
|
573
|
+
if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) spinner.message("Installation failed due to insufficient storage");
|
|
574
|
+
spinner.error(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`);
|
|
534
575
|
throw new Error(typeof errorMessage === "string" ? errorMessage : "Installation failed");
|
|
535
576
|
}
|
|
536
577
|
};
|
|
@@ -562,23 +603,22 @@ async function tryLaunchAppOnDevice({ device, port, mainActivity, applicationId,
|
|
|
562
603
|
adbArgs.unshift("-s", deviceId);
|
|
563
604
|
const adbPath = Device.getAdbPath();
|
|
564
605
|
console.debug(`Running ${adbPath} ${adbArgs.join(" ")}.`);
|
|
565
|
-
const
|
|
566
|
-
|
|
606
|
+
const spinner = __hot_updater_cli_tools.p.spinner();
|
|
607
|
+
spinner.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
|
|
567
608
|
try {
|
|
568
609
|
await (0, execa.execa)(adbPath, adbArgs);
|
|
569
|
-
|
|
610
|
+
spinner.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
|
|
570
611
|
} catch (_error) {
|
|
571
|
-
|
|
612
|
+
spinner.error("Failed to launch the app.");
|
|
572
613
|
throw new Error(`Failed to launch the app on ${device.readableName}`);
|
|
573
614
|
}
|
|
574
615
|
}
|
|
575
616
|
|
|
576
617
|
//#endregion
|
|
577
618
|
//#region src/runAndroid.ts
|
|
578
|
-
const runAndroid = async ({ schemeConfig
|
|
619
|
+
const runAndroid = async ({ schemeConfig, runOption }) => {
|
|
579
620
|
const { interactive, device: deviceOption } = runOption;
|
|
580
621
|
const androidProjectPath = path.default.join((0, __hot_updater_cli_tools.getCwd)(), "android");
|
|
581
|
-
const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
|
|
582
622
|
if (schemeConfig.aab) {
|
|
583
623
|
__hot_updater_cli_tools.p.log.error("aab scheme can't not be run");
|
|
584
624
|
process.exit(1);
|
|
@@ -600,6 +640,7 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
|
|
|
600
640
|
const result = await runGradle({
|
|
601
641
|
args: { extraParams: [`-PMIN_BUNDLE_ID=${(0, __hot_updater_plugin_core.generateMinBundleId)()}`] },
|
|
602
642
|
appModuleName: schemeConfig.appModuleName,
|
|
643
|
+
logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-run`,
|
|
603
644
|
tasks: [task],
|
|
604
645
|
androidProjectPath
|
|
605
646
|
});
|
|
@@ -621,6 +662,20 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
|
|
|
621
662
|
return result;
|
|
622
663
|
};
|
|
623
664
|
|
|
665
|
+
//#endregion
|
|
666
|
+
//#region src/utils/enrichNativeBuildAndroidScheme.ts
|
|
667
|
+
const enrichNativeBuildAndroidScheme = async ({ schemeConfig, hotUpdaterSchemeName }) => {
|
|
668
|
+
return {
|
|
669
|
+
aab: true,
|
|
670
|
+
variant: "Release",
|
|
671
|
+
appModuleName: "app",
|
|
672
|
+
applicationId: schemeConfig.packageName,
|
|
673
|
+
...schemeConfig,
|
|
674
|
+
hotUpdaterSchemeName
|
|
675
|
+
};
|
|
676
|
+
};
|
|
677
|
+
|
|
624
678
|
//#endregion
|
|
625
679
|
exports.buildAndroid = buildAndroid;
|
|
680
|
+
exports.enrichNativeBuildAndroidScheme = enrichNativeBuildAndroidScheme;
|
|
626
681
|
exports.runAndroid = runAndroid;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
import { NativeBuildAndroidScheme, NativeBuildOptions } from "@hot-updater/plugin-core";
|
|
2
2
|
|
|
3
|
+
//#region src/utils/enrichNativeBuildAndroidScheme.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validated scheme filled nullish values with default values.
|
|
7
|
+
*/
|
|
8
|
+
type EnrichedNativeBuildAndroidScheme = Required<NativeBuildAndroidScheme> & {
|
|
9
|
+
hotUpdaterSchemeName: string;
|
|
10
|
+
};
|
|
11
|
+
declare const enrichNativeBuildAndroidScheme: ({
|
|
12
|
+
schemeConfig,
|
|
13
|
+
hotUpdaterSchemeName
|
|
14
|
+
}: {
|
|
15
|
+
schemeConfig: NativeBuildAndroidScheme;
|
|
16
|
+
hotUpdaterSchemeName: string;
|
|
17
|
+
}) => Promise<EnrichedNativeBuildAndroidScheme>;
|
|
18
|
+
//#endregion
|
|
3
19
|
//#region src/buildAndroid.d.ts
|
|
4
20
|
declare const buildAndroid: ({
|
|
5
|
-
schemeConfig
|
|
21
|
+
schemeConfig
|
|
6
22
|
}: {
|
|
7
|
-
schemeConfig:
|
|
23
|
+
schemeConfig: EnrichedNativeBuildAndroidScheme;
|
|
8
24
|
}) => Promise<{
|
|
9
25
|
buildDirectory: string;
|
|
10
26
|
buildArtifactPath: string;
|
|
@@ -20,14 +36,14 @@ interface AndroidNativeRunOptions extends NativeBuildOptions {
|
|
|
20
36
|
//#endregion
|
|
21
37
|
//#region src/runAndroid.d.ts
|
|
22
38
|
declare const runAndroid: ({
|
|
23
|
-
schemeConfig
|
|
39
|
+
schemeConfig,
|
|
24
40
|
runOption
|
|
25
41
|
}: {
|
|
26
|
-
schemeConfig:
|
|
42
|
+
schemeConfig: EnrichedNativeBuildAndroidScheme;
|
|
27
43
|
runOption: AndroidNativeRunOptions;
|
|
28
44
|
}) => Promise<{
|
|
29
45
|
buildDirectory: string;
|
|
30
46
|
buildArtifactPath: string;
|
|
31
47
|
}>;
|
|
32
48
|
//#endregion
|
|
33
|
-
export { type AndroidNativeRunOptions, buildAndroid, runAndroid };
|
|
49
|
+
export { type AndroidNativeRunOptions, type EnrichedNativeBuildAndroidScheme, buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
import { NativeBuildAndroidScheme, NativeBuildOptions } from "@hot-updater/plugin-core";
|
|
2
2
|
|
|
3
|
+
//#region src/utils/enrichNativeBuildAndroidScheme.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Validated scheme filled nullish values with default values.
|
|
7
|
+
*/
|
|
8
|
+
type EnrichedNativeBuildAndroidScheme = Required<NativeBuildAndroidScheme> & {
|
|
9
|
+
hotUpdaterSchemeName: string;
|
|
10
|
+
};
|
|
11
|
+
declare const enrichNativeBuildAndroidScheme: ({
|
|
12
|
+
schemeConfig,
|
|
13
|
+
hotUpdaterSchemeName
|
|
14
|
+
}: {
|
|
15
|
+
schemeConfig: NativeBuildAndroidScheme;
|
|
16
|
+
hotUpdaterSchemeName: string;
|
|
17
|
+
}) => Promise<EnrichedNativeBuildAndroidScheme>;
|
|
18
|
+
//#endregion
|
|
3
19
|
//#region src/buildAndroid.d.ts
|
|
4
20
|
declare const buildAndroid: ({
|
|
5
|
-
schemeConfig
|
|
21
|
+
schemeConfig
|
|
6
22
|
}: {
|
|
7
|
-
schemeConfig:
|
|
23
|
+
schemeConfig: EnrichedNativeBuildAndroidScheme;
|
|
8
24
|
}) => Promise<{
|
|
9
25
|
buildDirectory: string;
|
|
10
26
|
buildArtifactPath: string;
|
|
@@ -20,14 +36,14 @@ interface AndroidNativeRunOptions extends NativeBuildOptions {
|
|
|
20
36
|
//#endregion
|
|
21
37
|
//#region src/runAndroid.d.ts
|
|
22
38
|
declare const runAndroid: ({
|
|
23
|
-
schemeConfig
|
|
39
|
+
schemeConfig,
|
|
24
40
|
runOption
|
|
25
41
|
}: {
|
|
26
|
-
schemeConfig:
|
|
42
|
+
schemeConfig: EnrichedNativeBuildAndroidScheme;
|
|
27
43
|
runOption: AndroidNativeRunOptions;
|
|
28
44
|
}) => Promise<{
|
|
29
45
|
buildDirectory: string;
|
|
30
46
|
buildArtifactPath: string;
|
|
31
47
|
}>;
|
|
32
48
|
//#endregion
|
|
33
|
-
export { type AndroidNativeRunOptions, buildAndroid, runAndroid };
|
|
49
|
+
export { type AndroidNativeRunOptions, type EnrichedNativeBuildAndroidScheme, buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
|
package/dist/index.js
CHANGED
|
@@ -6,8 +6,8 @@ import fs from "fs";
|
|
|
6
6
|
import os from "node:os";
|
|
7
7
|
|
|
8
8
|
//#region src/utils/createGradleLogger.ts
|
|
9
|
-
const createGradleLogger = () => new BuildLogger({
|
|
10
|
-
|
|
9
|
+
const createGradleLogger = ({ logPrefix }) => new BuildLogger({
|
|
10
|
+
logPrefix,
|
|
11
11
|
importantLogPatterns: [
|
|
12
12
|
"error:",
|
|
13
13
|
"Error:",
|
|
@@ -26,49 +26,95 @@ const createGradleLogger = () => new BuildLogger({
|
|
|
26
26
|
"Android resource compilation failed",
|
|
27
27
|
"Duplicate class",
|
|
28
28
|
"Program type already present",
|
|
29
|
-
"actionable tasks:"
|
|
29
|
+
"actionable tasks:",
|
|
30
|
+
"Deprecated Gradle features were used",
|
|
31
|
+
":app:configureCMake",
|
|
32
|
+
":app:buildCMake",
|
|
33
|
+
":app:compileDebugKotlin",
|
|
34
|
+
":app:compileReleaseKotlin",
|
|
35
|
+
":app:compileDebugJavaWithJavac",
|
|
36
|
+
":app:compileReleaseJavaWithJavac",
|
|
37
|
+
":app:mergeDebugResources",
|
|
38
|
+
":app:mergeReleaseResources",
|
|
39
|
+
":app:processDebugResources",
|
|
40
|
+
":app:processReleaseResources",
|
|
41
|
+
":app:packageDebug",
|
|
42
|
+
":app:packageRelease",
|
|
43
|
+
":app:assembleDebug",
|
|
44
|
+
":app:assembleRelease"
|
|
30
45
|
],
|
|
31
|
-
|
|
32
|
-
[
|
|
46
|
+
progressStages: [
|
|
47
|
+
[
|
|
33
48
|
"buildKotlinToolingMetadata",
|
|
34
49
|
"generateAutolinkingNewArchitectureFiles",
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
"generateAutolinkingPackageList",
|
|
51
|
+
"generateCodegenSchemaFromJavaScript",
|
|
52
|
+
"generateCodegenArtifactsFromSchema",
|
|
53
|
+
"generateReactNativeEntryPoint"
|
|
54
|
+
],
|
|
55
|
+
[
|
|
38
56
|
"createBundleReleaseJsAndAssets",
|
|
39
57
|
"bundleReleaseJsAndAssets",
|
|
40
58
|
"bundleDebugJsAndAssets"
|
|
41
|
-
],
|
|
42
|
-
[
|
|
59
|
+
],
|
|
60
|
+
[
|
|
43
61
|
"generateReleaseResValues",
|
|
62
|
+
"generateDebugResValues",
|
|
44
63
|
"generateReleaseResources",
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
"generateDebugResources",
|
|
65
|
+
"mergeReleaseResources",
|
|
66
|
+
"mergeDebugResources"
|
|
67
|
+
],
|
|
68
|
+
[
|
|
48
69
|
"processReleaseResources",
|
|
70
|
+
"processDebugResources",
|
|
49
71
|
"processReleaseManifest",
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
72
|
+
"processDebugManifest",
|
|
73
|
+
"processDebugMainManifest",
|
|
74
|
+
"parseReleaseLocalResources",
|
|
75
|
+
"parseDebugLocalResources"
|
|
76
|
+
],
|
|
77
|
+
["compileReleaseKotlin", "compileDebugKotlin"],
|
|
78
|
+
["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"],
|
|
79
|
+
[
|
|
80
|
+
/configureCMake\w+\[/,
|
|
81
|
+
/buildCMake\w+\[/,
|
|
82
|
+
"mergeReleaseJniLibFolders",
|
|
83
|
+
"mergeDebugJniLibFolders",
|
|
84
|
+
"mergeReleaseNativeLibs",
|
|
85
|
+
"mergeDebugNativeLibs"
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
"desugarReleaseFileDependencies",
|
|
89
|
+
"desugarDebugFileDependencies",
|
|
55
90
|
"dexBuilderRelease",
|
|
91
|
+
"dexBuilderDebug",
|
|
56
92
|
"mergeDexRelease",
|
|
93
|
+
"mergeExtDexRelease",
|
|
94
|
+
"mergeExtDexDebug",
|
|
95
|
+
"mergeProjectDexRelease",
|
|
96
|
+
"mergeProjectDexDebug",
|
|
97
|
+
"mergeLibDexRelease",
|
|
98
|
+
"mergeLibDexDebug",
|
|
99
|
+
"mergeDebugGlobalSynthetics",
|
|
100
|
+
"mergeReleaseGlobalSynthetics",
|
|
57
101
|
"transformClassesWithDex"
|
|
58
|
-
],
|
|
59
|
-
[
|
|
102
|
+
],
|
|
103
|
+
[
|
|
60
104
|
"compressReleaseAssets",
|
|
105
|
+
"compressDebugAssets",
|
|
61
106
|
"optimizeReleaseResources",
|
|
62
|
-
"mergeReleaseAssets"
|
|
63
|
-
|
|
64
|
-
|
|
107
|
+
"mergeReleaseAssets",
|
|
108
|
+
"mergeDebugAssets"
|
|
109
|
+
],
|
|
110
|
+
[
|
|
65
111
|
"packageRelease",
|
|
66
112
|
"packageDebug",
|
|
67
113
|
"assembleRelease",
|
|
68
114
|
"assembleDebug"
|
|
69
|
-
],
|
|
70
|
-
[
|
|
71
|
-
[
|
|
115
|
+
],
|
|
116
|
+
["bundleRelease", "bundleDebug"],
|
|
117
|
+
["BUILD SUCCESSFUL", /\d+ actionable tasks:/]
|
|
72
118
|
]
|
|
73
119
|
});
|
|
74
120
|
|
|
@@ -103,7 +149,7 @@ const getGradleWrapper = () => process.platform.startsWith("win") ? "gradlew.bat
|
|
|
103
149
|
/**
|
|
104
150
|
* Run gradle build with specified tasks and arguments
|
|
105
151
|
*/
|
|
106
|
-
async function runGradle({ tasks, args, androidProjectPath, appModuleName }) {
|
|
152
|
+
async function runGradle({ tasks, logPrefix, args, androidProjectPath, appModuleName }) {
|
|
107
153
|
const gradleArgs = getTaskNames(appModuleName, tasks);
|
|
108
154
|
gradleArgs.push("-x", "lint");
|
|
109
155
|
if (args.extraParams) gradleArgs.push(...args.extraParams);
|
|
@@ -114,17 +160,25 @@ Tasks ${tasks.join(", ")}
|
|
|
114
160
|
Args ${gradleArgs.join(" ")}
|
|
115
161
|
`);
|
|
116
162
|
if ("port" in args && args.port != null) gradleArgs.push(`-PreactNativeDevServerPort=${args.port}`);
|
|
117
|
-
const logger = createGradleLogger();
|
|
118
|
-
logger.start(
|
|
163
|
+
const logger = createGradleLogger({ logPrefix });
|
|
164
|
+
await logger.start();
|
|
119
165
|
try {
|
|
120
|
-
const process$1 = execa(getGradleWrapper(), gradleArgs, {
|
|
121
|
-
|
|
166
|
+
const process$1 = execa(getGradleWrapper(), gradleArgs, {
|
|
167
|
+
cwd: androidProjectPath,
|
|
168
|
+
all: true
|
|
169
|
+
});
|
|
170
|
+
const outputStream = process$1.all ?? process$1.stdout;
|
|
171
|
+
if (outputStream) await logger.processStream(outputStream);
|
|
172
|
+
await process$1;
|
|
122
173
|
logger.stop();
|
|
123
174
|
} catch (e) {
|
|
175
|
+
logger.writeError(e);
|
|
124
176
|
logger.stop("Build failed", false);
|
|
125
177
|
if (e instanceof ExecaError) p.log.error(getCleanedErrorMessage(e));
|
|
126
178
|
else if (e instanceof Error) p.log.error(e.message);
|
|
127
179
|
throw new Error("Failed to build the app. See the error above for details from Gradle.");
|
|
180
|
+
} finally {
|
|
181
|
+
await logger.close();
|
|
128
182
|
}
|
|
129
183
|
return findBuildDirectory({
|
|
130
184
|
androidProjectPath,
|
|
@@ -165,28 +219,15 @@ async function getBuildOutputFilePath({ aab, appModuleName, buildDirectory, vari
|
|
|
165
219
|
process.exit(1);
|
|
166
220
|
}
|
|
167
221
|
|
|
168
|
-
//#endregion
|
|
169
|
-
//#region src/utils/enrichNativeBuildAndroidScheme.ts
|
|
170
|
-
const enrichNativeBuildAndroidScheme = async ({ schemeConfig }) => {
|
|
171
|
-
return {
|
|
172
|
-
aab: true,
|
|
173
|
-
variant: "Release",
|
|
174
|
-
appModuleName: "app",
|
|
175
|
-
applicationId: schemeConfig.packageName,
|
|
176
|
-
...schemeConfig
|
|
177
|
-
};
|
|
178
|
-
};
|
|
179
|
-
|
|
180
222
|
//#endregion
|
|
181
223
|
//#region src/buildAndroid.ts
|
|
182
|
-
const buildAndroid = async ({ schemeConfig
|
|
224
|
+
const buildAndroid = async ({ schemeConfig }) => {
|
|
183
225
|
const androidProjectPath = path.join(getCwd(), "android");
|
|
184
|
-
const minBundleId = generateMinBundleId();
|
|
185
|
-
const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
|
|
186
226
|
return runGradle({
|
|
187
|
-
args: { extraParams: [`-PMIN_BUNDLE_ID=${
|
|
227
|
+
args: { extraParams: [`-PMIN_BUNDLE_ID=${generateMinBundleId()}`] },
|
|
188
228
|
appModuleName: schemeConfig.appModuleName,
|
|
189
229
|
tasks: schemeConfig.aab ? [`bundle${schemeConfig.variant}`] : [`assemble${schemeConfig.variant}`],
|
|
230
|
+
logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-build`,
|
|
190
231
|
androidProjectPath
|
|
191
232
|
});
|
|
192
233
|
};
|
|
@@ -377,19 +418,19 @@ const getAvailableDevicePort = async (startPort = defaultPort) => {
|
|
|
377
418
|
*/
|
|
378
419
|
const tryLaunchEmulator = async (name) => {
|
|
379
420
|
const port = await getAvailableDevicePort();
|
|
380
|
-
const
|
|
381
|
-
|
|
421
|
+
const spinner = p.spinner();
|
|
422
|
+
spinner.start("Looking for available emulators");
|
|
382
423
|
const emulators = await getEmulatorNames();
|
|
383
424
|
const emulatorName = name ?? emulators[0];
|
|
384
425
|
let deviceId;
|
|
385
426
|
if (emulators.length > 0) try {
|
|
386
|
-
|
|
387
|
-
deviceId = await launchEmulator(emulatorName, port,
|
|
388
|
-
|
|
427
|
+
spinner.message(`Launching emulator "${emulatorName}"`);
|
|
428
|
+
deviceId = await launchEmulator(emulatorName, port, spinner);
|
|
429
|
+
spinner.stop(`Launched ${emulatorName} emulator.`);
|
|
389
430
|
} catch (error) {
|
|
390
|
-
|
|
431
|
+
spinner.error(`Failed to launch ${emulatorName} emulator. ${error.message}`);
|
|
391
432
|
}
|
|
392
|
-
else
|
|
433
|
+
else spinner.error("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device");
|
|
393
434
|
return deviceId;
|
|
394
435
|
};
|
|
395
436
|
/**
|
|
@@ -493,15 +534,15 @@ const tryInstallAppOnDevice = async ({ device, apkPath }) => {
|
|
|
493
534
|
];
|
|
494
535
|
adbArgs.push(apkPath);
|
|
495
536
|
const adbPath = Device.getAdbPath();
|
|
496
|
-
const
|
|
497
|
-
|
|
537
|
+
const spinner = p.spinner();
|
|
538
|
+
spinner.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
|
|
498
539
|
try {
|
|
499
540
|
await execa(adbPath, adbArgs);
|
|
500
|
-
|
|
541
|
+
spinner.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
|
|
501
542
|
} catch (error) {
|
|
502
543
|
const errorMessage = error.stdout || error.stderr || "Unknown error";
|
|
503
|
-
if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE"))
|
|
504
|
-
|
|
544
|
+
if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) spinner.message("Installation failed due to insufficient storage");
|
|
545
|
+
spinner.error(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`);
|
|
505
546
|
throw new Error(typeof errorMessage === "string" ? errorMessage : "Installation failed");
|
|
506
547
|
}
|
|
507
548
|
};
|
|
@@ -533,23 +574,22 @@ async function tryLaunchAppOnDevice({ device, port, mainActivity, applicationId,
|
|
|
533
574
|
adbArgs.unshift("-s", deviceId);
|
|
534
575
|
const adbPath = Device.getAdbPath();
|
|
535
576
|
console.debug(`Running ${adbPath} ${adbArgs.join(" ")}.`);
|
|
536
|
-
const
|
|
537
|
-
|
|
577
|
+
const spinner = p.spinner();
|
|
578
|
+
spinner.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
|
|
538
579
|
try {
|
|
539
580
|
await execa(adbPath, adbArgs);
|
|
540
|
-
|
|
581
|
+
spinner.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
|
|
541
582
|
} catch (_error) {
|
|
542
|
-
|
|
583
|
+
spinner.error("Failed to launch the app.");
|
|
543
584
|
throw new Error(`Failed to launch the app on ${device.readableName}`);
|
|
544
585
|
}
|
|
545
586
|
}
|
|
546
587
|
|
|
547
588
|
//#endregion
|
|
548
589
|
//#region src/runAndroid.ts
|
|
549
|
-
const runAndroid = async ({ schemeConfig
|
|
590
|
+
const runAndroid = async ({ schemeConfig, runOption }) => {
|
|
550
591
|
const { interactive, device: deviceOption } = runOption;
|
|
551
592
|
const androidProjectPath = path.join(getCwd(), "android");
|
|
552
|
-
const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
|
|
553
593
|
if (schemeConfig.aab) {
|
|
554
594
|
p.log.error("aab scheme can't not be run");
|
|
555
595
|
process.exit(1);
|
|
@@ -571,6 +611,7 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
|
|
|
571
611
|
const result = await runGradle({
|
|
572
612
|
args: { extraParams: [`-PMIN_BUNDLE_ID=${generateMinBundleId()}`] },
|
|
573
613
|
appModuleName: schemeConfig.appModuleName,
|
|
614
|
+
logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-run`,
|
|
574
615
|
tasks: [task],
|
|
575
616
|
androidProjectPath
|
|
576
617
|
});
|
|
@@ -593,4 +634,17 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
|
|
|
593
634
|
};
|
|
594
635
|
|
|
595
636
|
//#endregion
|
|
596
|
-
|
|
637
|
+
//#region src/utils/enrichNativeBuildAndroidScheme.ts
|
|
638
|
+
const enrichNativeBuildAndroidScheme = async ({ schemeConfig, hotUpdaterSchemeName }) => {
|
|
639
|
+
return {
|
|
640
|
+
aab: true,
|
|
641
|
+
variant: "Release",
|
|
642
|
+
appModuleName: "app",
|
|
643
|
+
applicationId: schemeConfig.packageName,
|
|
644
|
+
...schemeConfig,
|
|
645
|
+
hotUpdaterSchemeName
|
|
646
|
+
};
|
|
647
|
+
};
|
|
648
|
+
|
|
649
|
+
//#endregion
|
|
650
|
+
export { buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hot-updater/android-helper",
|
|
3
|
-
"version": "0.25.
|
|
3
|
+
"version": "0.25.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"execa": "9.5.2",
|
|
28
|
-
"@hot-updater/cli-tools": "0.25.
|
|
29
|
-
"@hot-updater/plugin-core": "0.25.
|
|
30
|
-
"@hot-updater/core": "0.25.
|
|
28
|
+
"@hot-updater/cli-tools": "0.25.10",
|
|
29
|
+
"@hot-updater/plugin-core": "0.25.10",
|
|
30
|
+
"@hot-updater/core": "0.25.10"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^20"
|