Skip to content

Commit bf3e7d6

Browse files
author
Fastace
committed
BUG标记:为避免阻塞正常备份流程,APP详情页大小被跳过执行,备份的时候会正常显示大小
1 parent 65c5fed commit bf3e7d6

8 files changed

Lines changed: 274 additions & 59 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
kotlin version: 2.0.21
2+
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
3+
1. Kotlin compile daemon is ready
4+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
kotlin version: 2.0.21
2+
error message: Daemon compilation failed: Connection to the Kotlin daemon has been unexpectedly lost. This might be caused by the daemon being killed by another process or the operating system, or by JVM crash.
3+
org.jetbrains.kotlin.gradle.tasks.DaemonCrashedException: Connection to the Kotlin daemon has been unexpectedly lost. This might be caused by the daemon being killed by another process or the operating system, or by JVM crash.
4+
at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.wrapAndRethrowCompilationException(tasksUtils.kt:55)
5+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:243)
6+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159)
7+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111)
8+
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76)
9+
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
10+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
11+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
12+
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
13+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
14+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
15+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
16+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210)
17+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205)
18+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67)
19+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60)
20+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167)
21+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60)
22+
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54)
23+
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
24+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
25+
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
26+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
27+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
28+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
29+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
30+
at org.gradle.internal.Factories$1.create(Factories.java:31)
31+
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
32+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
33+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)
34+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
35+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
36+
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
37+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
38+
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
39+
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
40+
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
41+
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
42+
at java.base/java.lang.Thread.run(Thread.java:1583)
43+
Caused by: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
44+
java.net.SocketException: Connection reset
45+
at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:255)
46+
at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:166)
47+
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:215)
48+
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:160)
49+
at jdk.proxy5/jdk.proxy5.$Proxy160.compile(Unknown Source)
50+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.incrementalCompilationWithDaemon(GradleKotlinCompilerWork.kt:331)
51+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:235)
52+
... 37 more
53+
Caused by: java.net.SocketException: Connection reset
54+
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:318)
55+
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
56+
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
57+
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)
58+
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:291)
59+
at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:325)
60+
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:312)
61+
at java.base/java.io.DataInputStream.readUnsignedByte(DataInputStream.java:295)
62+
at java.base/java.io.DataInputStream.readByte(DataInputStream.java:275)
63+
at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:241)
64+
... 43 more
65+
66+
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
kotlin version: 2.0.21
2+
error message: Daemon compilation failed: Connection to the Kotlin daemon has been unexpectedly lost. This might be caused by the daemon being killed by another process or the operating system, or by JVM crash.
3+
org.jetbrains.kotlin.gradle.tasks.DaemonCrashedException: Connection to the Kotlin daemon has been unexpectedly lost. This might be caused by the daemon being killed by another process or the operating system, or by JVM crash.
4+
at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.wrapAndRethrowCompilationException(tasksUtils.kt:55)
5+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:243)
6+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159)
7+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111)
8+
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76)
9+
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
10+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
11+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
12+
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)
13+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
14+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
15+
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
16+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210)
17+
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205)
18+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67)
19+
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60)
20+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167)
21+
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60)
22+
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54)
23+
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
24+
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
25+
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174)
26+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
27+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
28+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
29+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
30+
at org.gradle.internal.Factories$1.create(Factories.java:31)
31+
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263)
32+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)
33+
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)
34+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
35+
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
36+
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
37+
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
38+
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
39+
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48)
40+
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
41+
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
42+
at java.base/java.lang.Thread.run(Thread.java:1583)
43+
Caused by: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
44+
java.net.SocketException: Connection reset
45+
at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:255)
46+
at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:166)
47+
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:215)
48+
at java.rmi/java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:160)
49+
at jdk.proxy5/jdk.proxy5.$Proxy160.compile(Unknown Source)
50+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.incrementalCompilationWithDaemon(GradleKotlinCompilerWork.kt:331)
51+
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:235)
52+
... 37 more
53+
Caused by: java.net.SocketException: Connection reset
54+
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:318)
55+
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
56+
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
57+
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)
58+
at java.base/java.io.BufferedInputStream.fill(BufferedInputStream.java:291)
59+
at java.base/java.io.BufferedInputStream.implRead(BufferedInputStream.java:325)
60+
at java.base/java.io.BufferedInputStream.read(BufferedInputStream.java:312)
61+
at java.base/java.io.DataInputStream.readUnsignedByte(DataInputStream.java:295)
62+
at java.base/java.io.DataInputStream.readByte(DataInputStream.java:275)
63+
at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:241)
64+
... 43 more
65+
66+

source/app/src/main/kotlin/com/xayah/databackup/DataBackupApplication.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import android.app.Application
44
import android.util.Log
55
import androidx.hilt.work.HiltWorkerFactory
66
import androidx.work.Configuration
7+
import androidx.work.WorkManager
8+
import com.xayah.core.work.WorkManagerInitializer
79
import com.xayah.core.database.dao.CloudDao
810
import com.xayah.core.database.dao.UploadIdDao
911
import com.xayah.core.network.client.S3ClientImpl
@@ -77,6 +79,7 @@ class DataBackupApplication : Application(), Configuration.Provider, ResticIniti
7779
initializeRestic()
7880
checkOrphanedUploads()
7981
setupBouncyCastle()
82+
WorkManagerInitializer.fastInitializeAndUpdateApps(this)
8083
}
8184

8285
private fun initializeRestic() {

source/core/data/src/main/kotlin/com/xayah/core/data/repository/AppsRepo.kt

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,21 @@ class AppsRepo @Inject constructor(
236236
* Faster than [fastInitialize] if there are too many newly installed apps.
237237
*/
238238
suspend fun fullInitialize(onInit: suspend (cur: Int, max: Int, content: String) -> Unit) {
239-
val loadSystemApps = context.readLoadSystemApps().first()
240-
val settings = settingsDataRepo.settingsData.first()
241-
val pm = context.packageManager
242-
val userInfoList = rootService.getUsers()
243-
for (userInfo in userInfoList) {
239+
Log.d(TAG, "AppsRepo: fullInitialize() starting...")
240+
241+
try {
242+
val loadSystemApps = context.readLoadSystemApps().first()
243+
Log.d(TAG, "AppsRepo: loadSystemApps = $loadSystemApps")
244+
245+
val settings = settingsDataRepo.settingsData.first()
246+
Log.d(TAG, "AppsRepo: settingsData loaded")
247+
248+
val pm = context.packageManager
249+
val userInfoList = rootService.getUsers()
250+
Log.d(TAG, "AppsRepo: got ${userInfoList.size} users")
251+
252+
for (userInfo in userInfoList) {
253+
Log.d(TAG, "AppsRepo: processing user ${userInfo.id}")
244254
val userId = userInfo.id
245255
val installedPackages = getInstalledPackages(userId)
246256
val storedSet = appsDao.queryPkgSetByUserId(OpType.BACKUP, userId).toSet()
@@ -265,13 +275,21 @@ class AppsRepo @Inject constructor(
265275
}
266276
appsDao.upsert(apps)
267277
}
268-
_isInitialized.value = true
278+
Log.d(TAG, "AppsRepo: about to set isInitialized = true")
279+
_isInitialized.value = true
280+
Log.d(TAG, "AppsRepo: fullInitialize() COMPLETED. isInitialized = ${_isInitialized.value}")
281+
} catch (e: Exception) {
282+
Log.e(TAG, "AppsRepo: fullInitialize() failed", e)
283+
throw e
284+
}
269285
}
270286

271287
/**
272288
* Initialize only newly installed apps or remove uninstalled apps.
273289
*/
274290
suspend fun fastInitialize(onInit: suspend (cur: Int, max: Int, content: String) -> Unit) {
291+
Log.d(TAG, "AppsRepo: fastInitialize() starting...")
292+
try {
275293
val loadSystemApps = context.readLoadSystemApps().first()
276294
val settings = settingsDataRepo.settingsData.first()
277295
val pm = context.packageManager
@@ -303,7 +321,14 @@ class AppsRepo @Inject constructor(
303321
}
304322
appsDao.upsert(apps)
305323
}
306-
_isInitialized.value = true
324+
Log.d(TAG, "AppsRepo: about to set isInitialized = true")
325+
_isInitialized.value = true
326+
Log.d(TAG, "AppsRepo: fastInitialize() COMPLETED. isInitialized = ${_isInitialized.value}")
327+
328+
} catch (e: Exception) {
329+
Log.e(TAG, "AppsRepo: fastInitialize() failed", e)
330+
throw e
331+
}
307332
}
308333

309334
private suspend fun initializeApp(

source/core/rootservice/src/main/kotlin/com/xayah/core/rootservice/impl/RemoteRootServiceImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ internal class RemoteRootServiceImpl(private val context: Context) : IRemoteRoot
164164
}
165165

166166
override fun calculateSize(path: String): Long = synchronized(lock) {
167-
FileUtil.calculateSize(path)
167+
NativeLib.calculateSize(path)
168168
}
169169

170170
override fun clearEmptyDirectoriesRecursively(path: String) = synchronized(lock) {

source/core/work/src/main/kotlin/com/xayah/core/work/workers/AppsFastInitWorker.kt

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.work.ForegroundInfo
77
import androidx.work.OneTimeWorkRequestBuilder
88
import androidx.work.OutOfQuotaPolicy
99
import androidx.work.WorkerParameters
10+
import android.util.Log
1011
import com.xayah.core.data.repository.AppsRepo
1112
import com.xayah.core.datastore.di.DbDispatchers.Default
1213
import com.xayah.core.datastore.di.Dispatcher
@@ -24,6 +25,12 @@ internal class AppsFastInitWorker @AssistedInject constructor(
2425
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
2526
private val appsRepo: AppsRepo,
2627
) : CoroutineWorker(appContext, workerParams) {
28+
companion object {
29+
private const val TAG = "AppsFastInitWorker"
30+
fun buildRequest() = OneTimeWorkRequestBuilder<AppsFastInitWorker>()
31+
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
32+
.build()
33+
}
2734
private val mNotificationBuilder by lazy { NotificationUtil.getProgressNotificationBuilder(appContext) }
2835
private var mNotificationInfo: ForegroundInfo? = null
2936

@@ -40,26 +47,38 @@ internal class AppsFastInitWorker @AssistedInject constructor(
4047
return mNotificationInfo!!
4148
}
4249

43-
override suspend fun doWork(): Result = withContext(defaultDispatcher) {
44-
appsRepo.fastInitialize { cur, max, content ->
45-
mNotificationInfo = NotificationUtil.createForegroundInfo(
46-
appContext,
47-
mNotificationBuilder,
48-
appContext.getString(R.string.initializing_app_list),
49-
content,
50-
max,
51-
cur
52-
)
53-
setForeground(
54-
mNotificationInfo!!
55-
)
56-
}
57-
Result.success()
50+
private fun log(onMsg: () -> String): String = run {
51+
val msg = onMsg()
52+
Log.d(TAG, msg)
53+
msg
5854
}
5955

60-
companion object {
61-
fun buildRequest() = OneTimeWorkRequestBuilder<AppsFastInitWorker>()
62-
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
63-
.build()
56+
override suspend fun doWork(): Result = withContext(defaultDispatcher) {
57+
log { "AppsFastInitWorker: starting work" }
58+
try {
59+
// 修正:调用 appsRepo.fastInitialize,将进度更新逻辑放在回调中
60+
appsRepo.fastInitialize { cur, max, content ->
61+
log { "AppsFastInitWorker: progress $cur/$max - $content" }
62+
63+
mNotificationInfo = NotificationUtil.createForegroundInfo(
64+
appContext,
65+
mNotificationBuilder,
66+
appContext.getString(R.string.initializing_app_list),
67+
content,
68+
max,
69+
cur
70+
)
71+
setForeground(
72+
mNotificationInfo!!
73+
)
74+
}
75+
76+
log { "AppsFastInitWorker: work completed successfully" }
77+
return@withContext Result.success() // 确保返回 Result.success()
78+
79+
} catch (e: Exception) {
80+
log { "AppsFastInitWorker: work failed: ${e.message}" }
81+
return@withContext Result.failure() // 确保返回 Result.failure()
82+
}
6483
}
6584
}

0 commit comments

Comments
 (0)