react-native-update 10.59.2 → 10.60.0
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/README-CN.md +7 -7
- package/README.md +7 -6
- package/android/build.gradle +25 -33
- package/android/jni/Android.mk +16 -24
- package/android/lib/arm64-v8a/librnpushy.so +0 -0
- package/android/lib/armeabi-v7a/librnpushy.so +0 -0
- package/android/lib/x86/librnpushy.so +0 -0
- package/android/lib/x86_64/librnpushy.so +0 -0
- package/android/proguard.pro +9 -7
- package/android/src/main/java/cn/reactnative/modules/update/ApkInstaller.java +2 -7
- package/android/src/main/java/cn/reactnative/modules/update/ArchiveLimits.java +23 -6
- package/android/src/main/java/cn/reactnative/modules/update/BundledResourceCopier.java +50 -51
- package/android/src/main/java/cn/reactnative/modules/update/CleanupKeepNames.java +12 -13
- package/android/src/main/java/cn/reactnative/modules/update/CopyGroupResult.java +3 -0
- package/android/src/main/java/cn/reactnative/modules/update/CrashHold.java +22 -30
- package/android/src/main/java/cn/reactnative/modules/update/DownloadTask.java +181 -332
- package/android/src/main/java/cn/reactnative/modules/update/DownloadTaskParams.java +3 -1
- package/android/src/main/java/cn/reactnative/modules/update/ErrorCodes.java +27 -0
- package/android/src/main/java/cn/reactnative/modules/update/FileOperationException.java +1 -1
- package/android/src/main/java/cn/reactnative/modules/update/FlowBridge.java +32 -8
- package/android/src/main/java/cn/reactnative/modules/update/HttpClients.java +63 -0
- package/android/src/main/java/cn/reactnative/modules/update/HttpUtils.java +0 -11
- package/android/src/main/java/cn/reactnative/modules/update/InstallRecord.java +66 -116
- package/android/src/main/java/cn/reactnative/modules/update/NativeCore.java +9 -1
- package/android/src/main/java/cn/reactnative/modules/update/PatchFailedException.java +1 -1
- package/android/src/main/java/cn/reactnative/modules/update/PushyRuntime.java +32 -60
- package/android/src/main/java/cn/reactnative/modules/update/ReactReloadManager.java +8 -23
- package/android/src/main/java/cn/reactnative/modules/update/SafeZipFile.java +42 -80
- package/android/src/main/java/cn/reactnative/modules/update/StateSerialRunner.java +22 -39
- package/android/src/main/java/cn/reactnative/modules/update/SyncCoordinator.java +176 -299
- package/android/src/main/java/cn/reactnative/modules/update/Threads.java +35 -0
- package/android/src/main/java/cn/reactnative/modules/update/UpdateContext.java +242 -174
- package/android/src/main/java/cn/reactnative/modules/update/UpdateEventEmitter.java +1 -1
- package/android/src/main/java/cn/reactnative/modules/update/UpdateFileUtils.java +75 -17
- package/android/src/main/java/cn/reactnative/modules/update/{UpdateModuleImpl.java → UpdateModule.java} +113 -95
- package/android/src/main/java/cn/reactnative/modules/update/UpdatePackage.java +16 -19
- package/android/src/oldarch/cn/reactnative/modules/update/NativePushySpec.java +69 -0
- package/cpp/android_jni/archive_limits_jni.cpp +83 -0
- package/cpp/android_jni/install_record_jni.cpp +89 -0
- package/cpp/android_jni/jni_log.h +31 -0
- package/cpp/android_jni/jni_natives.h +40 -0
- package/cpp/android_jni/jni_registration.cpp +133 -0
- package/cpp/android_jni/jni_util.h +160 -0
- package/cpp/android_jni/update_core_android.cpp +450 -0
- package/cpp/android_jni/update_flow_jni.cpp +133 -0
- package/{android/jni → cpp/hpatch}/hpatch.c +5 -5
- package/{android/jni → cpp/hpatch}/hpatch.h +4 -1
- package/cpp/patch_core/archive_limits.cpp +194 -0
- package/cpp/patch_core/archive_limits.h +99 -10
- package/cpp/patch_core/archive_patch_core.cpp +96 -12
- package/cpp/patch_core/archive_patch_core.h +49 -0
- package/cpp/patch_core/digest.h +5 -4
- package/cpp/patch_core/error_codes.h +5 -3
- package/cpp/patch_core/install_record.cpp +430 -0
- package/cpp/patch_core/install_record.h +163 -9
- package/cpp/patch_core/patch_core.cpp +62 -16
- package/cpp/patch_core/patch_core.h +27 -7
- package/cpp/patch_core/patch_manifest.cpp +201 -0
- package/cpp/patch_core/patch_manifest.h +74 -0
- package/cpp/patch_core/state_ops.h +3 -3
- package/cpp/update_flow_core/flow_json.cpp +82 -8
- package/cpp/update_flow_core/flow_json.h +21 -0
- package/cpp/update_flow_core/native_config.cpp +456 -0
- package/cpp/update_flow_core/native_config.h +84 -0
- package/cpp/update_flow_core/native_round.cpp +326 -0
- package/cpp/update_flow_core/native_round.h +90 -0
- package/cpp/update_flow_core/update_flow_core.h +2 -2
- package/harmony/hvigor-plugin.ts +11 -19
- package/harmony/pushy/src/main/cpp/CMakeLists.txt +17 -26
- package/harmony/pushy/src/main/cpp/PushyPackage.h +2 -2
- package/harmony/pushy/src/main/cpp/PushyTurboModule.cpp +55 -94
- package/harmony/pushy/src/main/cpp/pushy.cpp +694 -517
- package/harmony/pushy/src/main/ets/ArchiveLimits.ts +48 -72
- package/harmony/pushy/src/main/ets/DownloadTask.ts +164 -404
- package/harmony/pushy/src/main/ets/DownloadTaskParams.ts +1 -3
- package/harmony/pushy/src/main/ets/ErrorCodes.ts +1 -14
- package/harmony/pushy/src/main/ets/EventHub.ts +1 -1
- package/harmony/pushy/src/main/ets/InstallRecord.ts +52 -151
- package/harmony/pushy/src/main/ets/Logger.ts +20 -34
- package/harmony/pushy/src/main/ets/NativePatchCore.ts +116 -42
- package/harmony/pushy/src/main/ets/PushyConfiguration.ts +8 -85
- package/harmony/pushy/src/main/ets/PushyTurboModule.ts +11 -25
- package/harmony/pushy/src/main/ets/SaveFile.ts +99 -18
- package/harmony/pushy/src/main/ets/SyncCoordinator.ts +136 -335
- package/harmony/pushy/src/main/ets/Texts.ts +0 -4
- package/harmony/pushy/src/main/ets/UpdateContext.ts +106 -119
- package/harmony/pushy.har +0 -0
- package/ios/RCTPushy/RCTPushy+Launch.mm +185 -0
- package/ios/RCTPushy/RCTPushy.h +12 -0
- package/ios/RCTPushy/RCTPushy.mm +87 -2634
- package/ios/RCTPushy/RCTPushyCommon.h +34 -0
- package/ios/RCTPushy/RCTPushyConfiguration.h +0 -8
- package/ios/RCTPushy/RCTPushyConfiguration.mm +40 -121
- package/ios/RCTPushy/RCTPushyDownloader.mm +40 -37
- package/ios/RCTPushy/RCTPushyInstallRecord.mm +61 -0
- package/ios/RCTPushy/RCTPushyInstaller.mm +689 -0
- package/ios/RCTPushy/RCTPushyInternal.h +144 -0
- package/ios/RCTPushy/RCTPushyOrchestrator.mm +1001 -0
- package/ios/RCTPushy/RCTPushyState.mm +314 -0
- package/package.json +25 -23
- package/react-native-update.podspec +73 -82
- package/src/client.ts +361 -451
- package/src/context.ts +1 -1
- package/src/core.ts +35 -8
- package/src/endpoint.ts +0 -2
- package/src/error.ts +13 -32
- package/src/i18n.ts +18 -83
- package/src/locales/en.ts +0 -4
- package/src/locales/zh.ts +0 -4
- package/src/provider.tsx +60 -53
- package/src/telemetry.ts +0 -13
- package/src/type.ts +0 -15
- package/src/updateFlowCore.ts +116 -10
- package/src/utils.ts +49 -42
- package/android/src/main/java/cn/reactnative/modules/update/ArchivePatchPlanResult.java +0 -6
- package/android/src/main/java/cn/reactnative/modules/update/PushyConfiguration.java +0 -104
- package/android/src/main/java/cn/reactnative/modules/update/UiThreadRunner.java +0 -37
- package/android/src/newarch/cn/reactnative/modules/update/UpdateModule.java +0 -121
- package/android/src/oldarch/cn/reactnative/modules/update/UpdateModule.java +0 -125
- package/cpp/patch_core/jni_natives.h +0 -27
- package/cpp/patch_core/jni_registration.cpp +0 -103
- package/cpp/patch_core/jni_util.h +0 -60
- package/cpp/patch_core/patch_core_android.cpp +0 -97
- package/cpp/patch_core/update_core_android.cpp +0 -485
- package/cpp/update_flow_core/update_flow_jni.cpp +0 -150
|
@@ -37,11 +37,6 @@ interface RestartWant {
|
|
|
37
37
|
abilityName?: string;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
// applicationContext.restartApp 是 API 12 才有的可选能力,按结构探测。
|
|
41
|
-
interface RestartableApplicationContext {
|
|
42
|
-
restartApp?: (want: RestartWant) => void;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
40
|
interface RestartEventEmitter {
|
|
46
41
|
emit(event: string, payload: Object): void;
|
|
47
42
|
}
|
|
@@ -122,13 +117,10 @@ export class PushyTurboModule extends UITurboModule {
|
|
|
122
117
|
abilityName: this.mUiCtx.abilityInfo?.name,
|
|
123
118
|
};
|
|
124
119
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
applicationContext.restartApp(want);
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
120
|
+
// applicationContext.restartApp exists since API 12, the HAR's minimum.
|
|
121
|
+
logger.debug(TAG, 'restartAbility via applicationContext.restartApp');
|
|
122
|
+
this.mUiCtx.getApplicationContext().restartApp(want);
|
|
123
|
+
return;
|
|
132
124
|
} catch (e) {
|
|
133
125
|
logger.error(TAG, `restartAbility via restartApp failed: ${getErrorMessage(e)}`);
|
|
134
126
|
}
|
|
@@ -206,23 +198,17 @@ export class PushyTurboModule extends UITurboModule {
|
|
|
206
198
|
uuid,
|
|
207
199
|
supportedDiffVersion: NativePatchCore.getSupportedDiffVersion(),
|
|
208
200
|
};
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
isUsingBundleUrl: result.isUsingBundleUrl,
|
|
216
|
-
isFirstTime: result.isFirstTime,
|
|
217
|
-
rolledBackVersion: result.rolledBackVersion,
|
|
218
|
-
uuidSet: !!result.uuid,
|
|
219
|
-
};
|
|
220
|
-
logger.info(TAG, `,getConstants result: ${JSON.stringify(logResult)}`);
|
|
201
|
+
// The install uuid stays out of the logs; only whether it is set.
|
|
202
|
+
const { uuid: _uuid, ...logResult } = result;
|
|
203
|
+
logger.info(
|
|
204
|
+
TAG,
|
|
205
|
+
`,getConstants result: ${JSON.stringify({ ...logResult, uuidSet: !!uuid })}`,
|
|
206
|
+
);
|
|
221
207
|
return result;
|
|
222
208
|
}
|
|
223
209
|
|
|
224
210
|
// 以下方法在 JS spec(src/NativePushy.ts)里都返回 Promise,C++ 方法表
|
|
225
|
-
// (PushyTurboModule.cpp)
|
|
211
|
+
// (PushyTurboModule.cpp 的 PUSHY_METHODS)相应登记为 ASYNC:同步注册会把
|
|
226
212
|
// ArkTS 的 Promise 变成空对象、把 reject 丢成 ArkTS 侧的 unhandled rejection。
|
|
227
213
|
// 每个拒绝都带稳定错误码(ErrorCodes.ts):`code` 属性 + `[CODE] ` 消息前缀。
|
|
228
214
|
|
|
@@ -1,34 +1,115 @@
|
|
|
1
1
|
import resourceManager from '@ohos.resourceManager';
|
|
2
|
-
import fs
|
|
2
|
+
import fs from '@ohos.file.fs';
|
|
3
|
+
import logger from './Logger';
|
|
4
|
+
import { getErrorMessage } from './ErrorCodes';
|
|
3
5
|
|
|
4
|
-
const
|
|
6
|
+
const TAG = 'SaveFile';
|
|
7
|
+
// 每次 read/write 都是一次工作线程往返:块大一些,几 MB 的 bundle 只需
|
|
8
|
+
// 十几次往返;内存上限仍是一个块。
|
|
9
|
+
const COPY_BUFFER_SIZE = 512 * 1024;
|
|
5
10
|
|
|
6
|
-
|
|
11
|
+
// resourceManager 按文件名跟踪 rawfile descriptor(closeRawFd 只收名字):
|
|
12
|
+
// 同名的 getRawFd/closeRawFd 若交错,一方的 close 可能在另一方读到一半时
|
|
13
|
+
// 关掉它的 fd。同名访问按到达顺序串行(不同名互不影响)。
|
|
14
|
+
const rawFdChains = new Map<string, Promise<void>>();
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* 打开 rawfile descriptor 交给 job,job 结束(无论成败)后关闭。同名串行。
|
|
18
|
+
* descriptor 指向 HAP 内 [offset, offset + length) 区间,job 只能按 offset
|
|
19
|
+
* 定位读取。
|
|
20
|
+
*/
|
|
21
|
+
export async function withRawFd<T>(
|
|
22
|
+
manager: resourceManager.ResourceManager,
|
|
23
|
+
name: string,
|
|
24
|
+
job: (descriptor: resourceManager.RawFileDescriptor) => Promise<T>,
|
|
25
|
+
): Promise<T> {
|
|
26
|
+
const previous = rawFdChains.get(name) ?? Promise.resolve();
|
|
27
|
+
let release: () => void = () => {};
|
|
28
|
+
const held = new Promise<void>(resolve => {
|
|
29
|
+
release = resolve;
|
|
30
|
+
});
|
|
31
|
+
const tail = previous.then(() => held);
|
|
32
|
+
rawFdChains.set(name, tail);
|
|
33
|
+
try {
|
|
34
|
+
await previous;
|
|
35
|
+
const descriptor = await manager.getRawFd(name);
|
|
36
|
+
try {
|
|
37
|
+
return await job(descriptor);
|
|
38
|
+
} finally {
|
|
39
|
+
try {
|
|
40
|
+
await manager.closeRawFd(name);
|
|
41
|
+
} catch (closeError) {
|
|
42
|
+
logger.error(
|
|
43
|
+
TAG,
|
|
44
|
+
`Failed to close raw fd for ${name}: ${getErrorMessage(closeError)}`,
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
} finally {
|
|
49
|
+
release();
|
|
50
|
+
if (rawFdChains.get(name) === tail) {
|
|
51
|
+
rawFdChains.delete(name);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** 把 buffer 的前 length 字节完整写入 fd(处理短写)。 */
|
|
57
|
+
export async function writeFully(
|
|
58
|
+
fd: number,
|
|
59
|
+
buffer: ArrayBuffer,
|
|
60
|
+
length: number,
|
|
61
|
+
): Promise<void> {
|
|
62
|
+
let written = 0;
|
|
63
|
+
while (written < length) {
|
|
64
|
+
const chunk = written === 0 ? buffer : buffer.slice(written, length);
|
|
65
|
+
const count = await fs.write(fd, chunk, { length: length - written });
|
|
66
|
+
if (count <= 0) {
|
|
67
|
+
throw new Error(`Short write: ${written}/${length} bytes`);
|
|
68
|
+
}
|
|
69
|
+
written += count;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** 文件存在则删除(删除失败照常抛出)。 */
|
|
74
|
+
export async function unlinkIfExists(path: string): Promise<void> {
|
|
75
|
+
if (fs.accessSync(path)) {
|
|
76
|
+
await fs.unlink(path);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* 把 rawfile descriptor 指向的区间异步拷贝到沙箱文件(覆盖)。全程异步
|
|
82
|
+
* fileIo:调用方在 UI 线程(TurboModule),同步 IO 会冻结界面。读到预期
|
|
83
|
+
* 长度之前遇到 EOF 视为错误。
|
|
84
|
+
*/
|
|
85
|
+
export async function saveFileToSandbox(
|
|
7
86
|
from: resourceManager.RawFileDescriptor,
|
|
8
87
|
toPath: string,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
88
|
+
): Promise<void> {
|
|
89
|
+
const to = await fs.open(
|
|
90
|
+
toPath,
|
|
91
|
+
fs.OpenMode.WRITE_ONLY | fs.OpenMode.CREATE | fs.OpenMode.TRUNC,
|
|
92
|
+
);
|
|
93
|
+
const buffer = new ArrayBuffer(
|
|
94
|
+
Math.max(1, Math.min(COPY_BUFFER_SIZE, from.length)),
|
|
95
|
+
);
|
|
96
|
+
let position = from.offset;
|
|
14
97
|
let remaining = from.length;
|
|
15
98
|
|
|
16
99
|
try {
|
|
17
100
|
while (remaining > 0) {
|
|
18
|
-
const
|
|
19
|
-
offset:
|
|
20
|
-
length: Math.min(
|
|
21
|
-
};
|
|
22
|
-
const readLength = fs.readSync(from.fd, buffer, readOption);
|
|
101
|
+
const readLength = await fs.read(from.fd, buffer, {
|
|
102
|
+
offset: position,
|
|
103
|
+
length: Math.min(buffer.byteLength, remaining),
|
|
104
|
+
});
|
|
23
105
|
if (readLength <= 0) {
|
|
24
106
|
throw new Error(`Unexpected EOF while copying resource to ${toPath}`);
|
|
25
107
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
currentOffset += readLength;
|
|
108
|
+
await writeFully(to.fd, buffer, readLength);
|
|
109
|
+
position += readLength;
|
|
29
110
|
remaining -= readLength;
|
|
30
111
|
}
|
|
31
112
|
} finally {
|
|
32
|
-
fs.close(to);
|
|
113
|
+
await fs.close(to);
|
|
33
114
|
}
|
|
34
|
-
}
|
|
115
|
+
}
|