Skip to content

Commit 11ee95f

Browse files
author
Fastace
committed
Update:初步继承云端设置;TODO:通过Rclone中间层作为统一接口逐步实现各项云端设置
1 parent 5afec9f commit 11ee95f

14 files changed

Lines changed: 998 additions & 0 deletions

File tree

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
kotlin version: 2.0.21
2+
error message: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
3+
File being compiled: D:/Android-DataBackup-S3-New/source/core/rclone/src/main/kotlin/com/xayah/core/rclone/RcloneLogger.kt
4+
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:47)
5+
at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:253)
6+
at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:236)
7+
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:65)
8+
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:52)
9+
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:38)
10+
at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.phaseBody(CompilerPhase.kt:166)
11+
at org.jetbrains.kotlin.backend.common.phaser.AbstractNamedCompilerPhase.invoke(CompilerPhase.kt:113)
12+
at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:27)
13+
at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:14)
14+
at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.phaseBody(CompilerPhase.kt:166)
15+
at org.jetbrains.kotlin.backend.common.phaser.AbstractNamedCompilerPhase.invoke(CompilerPhase.kt:113)
16+
at org.jetbrains.kotlin.backend.common.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:62)
17+
at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.invokeCodegen(JvmIrCodegenFactory.kt:371)
18+
at org.jetbrains.kotlin.codegen.CodegenFactory.generateModule(CodegenFactory.kt:47)
19+
at org.jetbrains.kotlin.codegen.KotlinCodegenFacade.compileCorrectFiles(KotlinCodegenFacade.java:45)
20+
at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.contextForStubGeneration(Kapt3Extension.kt:253)
21+
at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.analysisCompleted(Kapt3Extension.kt:149)
22+
at org.jetbrains.kotlin.kapt3.ClasspathBasedKapt3Extension.analysisCompleted(Kapt3Extension.kt:79)
23+
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$invokeExtensionsOnAnalysisComplete(TopDownAnalyzerFacadeForJVM.kt:104)
24+
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:114)
25+
at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:75)
26+
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze$lambda$12(KotlinToJVMBytecodeCompiler.kt:373)
27+
at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:112)
28+
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:364)
29+
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.runFrontendAndGenerateIrUsingClassicFrontend(KotlinToJVMBytecodeCompiler.kt:195)
30+
at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:106)
31+
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:170)
32+
at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:43)
33+
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:103)
34+
at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:49)
35+
at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
36+
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:464)
37+
at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:73)
38+
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:506)
39+
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:423)
40+
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:301)
41+
at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:129)
42+
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:675)
43+
at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92)
44+
at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1660)
45+
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
46+
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
47+
at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
48+
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
49+
at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
50+
at java.base/java.security.AccessController.doPrivileged(AccessController.java:714)
51+
at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
52+
at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:598)
53+
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:844)
54+
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:721)
55+
at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
56+
at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:720)
57+
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
58+
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
59+
at java.base/java.lang.Thread.run(Thread.java:1583)
60+
Caused by: java.lang.RuntimeException: Exception while generating code for:
61+
FUN FUNCTION_FOR_DEFAULT_PARAMETER name:v$default visibility:public modality:FINAL <> ($this:com.xayah.core.rclone.RcloneLogger.kt, message:kotlin.String, throwable:kotlin.Throwable?, $mask0:kotlin.Int, $handler:kotlin.Any?) returnType:kotlin.Unit
62+
VALUE_PARAMETER MOVED_DISPATCH_RECEIVER name:$this index:0 type:com.xayah.core.rclone.RcloneLogger.kt
63+
VALUE_PARAMETER name:message index:1 type:kotlin.String
64+
VALUE_PARAMETER name:throwable index:2 type:kotlin.Throwable? [assignable]
65+
EXPRESSION_BODY
66+
ERROR_EXPR 'Default Stub' type=kotlin.Throwable?
67+
VALUE_PARAMETER MASK_FOR_DEFAULT_FUNCTION name:$mask0 index:3 type:kotlin.Int
68+
VALUE_PARAMETER METHOD_HANDLER_IN_DEFAULT_FUNCTION name:$handler index:4 type:kotlin.Any?
69+
BLOCK_BODY
70+
WHEN type=kotlin.Unit origin=null
71+
BRANCH
72+
if: CALL 'public final fun not (): kotlin.Boolean [operator] declared in kotlin.Boolean' type=kotlin.Boolean origin=EXCLEQ
73+
$this: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EXCLEQ
74+
arg0: CALL 'public final fun and (other: kotlin.Int): kotlin.Int [infix] declared in kotlin.Int' type=kotlin.Int origin=null
75+
$this: GET_VAR '$mask0: kotlin.Int declared in com.xayah.core.rclone.RcloneLogger.kt.v$default' type=kotlin.Int origin=null
76+
other: CONST Int type=kotlin.Int value=2
77+
arg1: CONST Int type=kotlin.Int value=0
78+
then: SET_VAR 'throwable: kotlin.Throwable? [assignable] declared in com.xayah.core.rclone.RcloneLogger.kt.v$default' type=kotlin.Unit origin=EQ
79+
ERROR_EXPR 'KtConstantExpression' type=kotlin.Nothing
80+
RETURN type=kotlin.Nothing from='public final fun v$default ($this: com.xayah.core.rclone.RcloneLogger.kt, message: kotlin.String, throwable: kotlin.Throwable?, $mask0: kotlin.Int, $handler: kotlin.Any?): kotlin.Unit declared in com.xayah.core.rclone.RcloneLogger.kt'
81+
CALL 'public final fun v (message: kotlin.String, throwable: kotlin.Throwable?): kotlin.Unit declared in com.xayah.core.rclone.RcloneLogger.kt' type=kotlin.Unit origin=DEFAULT_STUB_CALL_TO_IMPLEMENTATION
82+
$this: GET_VAR '$this: com.xayah.core.rclone.RcloneLogger.kt declared in com.xayah.core.rclone.RcloneLogger.kt.v$default' type=com.xayah.core.rclone.RcloneLogger.kt origin=null
83+
message: GET_VAR 'message: kotlin.String declared in com.xayah.core.rclone.RcloneLogger.kt.v$default' type=kotlin.String origin=null
84+
throwable: GET_VAR 'throwable: kotlin.Throwable? [assignable] declared in com.xayah.core.rclone.RcloneLogger.kt.v$default' type=kotlin.Throwable? origin=null
85+
86+
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:47)
87+
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate$default(FunctionCodegen.kt:40)
88+
at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethodNode(ClassCodegen.kt:406)
89+
at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethod(ClassCodegen.kt:423)
90+
at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generate(ClassCodegen.kt:168)
91+
at org.jetbrains.kotlin.backend.jvm.FileCodegen.lower(JvmPhases.kt:39)
92+
at org.jetbrains.kotlin.backend.common.phaser.PhaseFactoriesKt.createFilePhase$lambda$4(PhaseFactories.kt:71)
93+
at org.jetbrains.kotlin.backend.common.phaser.PhaseBuildersKt$createSimpleNamedCompilerPhase$1.phaseBody(PhaseBuilders.kt:69)
94+
at org.jetbrains.kotlin.backend.common.phaser.SimpleNamedCompilerPhase.phaseBody(CompilerPhase.kt:226)
95+
at org.jetbrains.kotlin.backend.common.phaser.AbstractNamedCompilerPhase.invoke(CompilerPhase.kt:113)
96+
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:62)
97+
... 52 more
98+
Caused by: java.lang.IllegalArgumentException: Invalid class name (must not contain . ; [ < > or :): com/xayah/core/rclone/RcloneLogger.kt
99+
at org.jetbrains.org.objectweb.asm.util.CheckSignatureAdapter.checkClassName(CheckSignatureAdapter.java:343)
100+
at org.jetbrains.org.objectweb.asm.util.CheckSignatureAdapter.visitClassType(CheckSignatureAdapter.java:285)
101+
at org.jetbrains.kotlin.codegen.signature.BothSignatureWriter.writeClassBegin(BothSignatureWriter.java:78)
102+
at org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter.writeAsmType(JvmSignatureWriter.java:45)
103+
at org.jetbrains.kotlin.codegen.signature.BothSignatureWriter.writeAsmType(BothSignatureWriter.java:72)
104+
at org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper.writeGenericType(IrTypeMapper.kt:159)
105+
at org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper.writeGenericType(IrTypeMapper.kt:42)
106+
at org.jetbrains.kotlin.types.AbstractTypeMapper.mapClassType(AbstractTypeMapper.kt:198)
107+
at org.jetbrains.kotlin.types.AbstractTypeMapper.mapType(AbstractTypeMapper.kt:89)
108+
at org.jetbrains.kotlin.types.AbstractTypeMapper.mapType(AbstractTypeMapper.kt:53)
109+
at org.jetbrains.kotlin.backend.jvm.mapping.IrTypeMapper.mapType(IrTypeMapper.kt:149)
110+
at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen$typeMapper$1.mapType(ClassCodegen.kt:99)
111+
at org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper.writeParameterType(MethodSignatureMapper.kt:392)
112+
at org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper.writeParameter(MethodSignatureMapper.kt:377)
113+
at org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper.mapSignature(MethodSignatureMapper.kt:260)
114+
at org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper.mapSignature$default(MethodSignatureMapper.kt:220)
115+
at org.jetbrains.kotlin.backend.jvm.mapping.MethodSignatureMapper.mapSignatureWithGeneric(MethodSignatureMapper.kt:218)
116+
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.doGenerate(FunctionCodegen.kt:51)
117+
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:44)
118+
... 62 more
119+
120+

source/app/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ dependencies {
154154
implementation(project(":core:rootservice"))
155155
implementation(project(":core:network"))
156156
implementation(project(":core:restic"))
157+
implementation(project(":core:rclone"))
157158

158159
// Feature
159160
implementation(project(":feature:crash"))
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
plugins {
2+
alias(libs.plugins.library.common)
3+
alias(libs.plugins.library.hilt)
4+
alias(libs.plugins.serialization)
5+
}
6+
7+
android {
8+
namespace = "com.xayah.core.rclone"
9+
}
10+
11+
dependencies {
12+
implementation(libs.libsu.core)
13+
implementation(project(":core:common"))
14+
implementation(project(":core:datastore"))
15+
implementation(project(":core:model"))
16+
// 序列化依赖
17+
implementation(libs.kotlinx.serialization.json)
18+
19+
// Hilt
20+
implementation(libs.hilt.android)
21+
kapt(libs.hilt.android.compiler) // 修正:使用正确的引用
22+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
package com.xayah.core.rclone
2+
3+
import android.util.Log
4+
import com.xayah.core.datastore.di.Dispatcher
5+
import com.xayah.core.datastore.di.DbDispatchers.IO
6+
import kotlinx.coroutines.CoroutineDispatcher
7+
import kotlinx.coroutines.withContext
8+
import javax.inject.Inject
9+
import javax.inject.Singleton
10+
11+
@Singleton
12+
class RcloneLogger @Inject constructor(
13+
@Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher
14+
) {
15+
companion object {
16+
private const val TAG = "RcloneBackup"
17+
private const val PREFIX = "[Rclone]"
18+
}
19+
20+
// 基础日志方法
21+
fun v(message: String, throwable: Throwable? = null) {
22+
val logMessage = formatMessage(message)
23+
if (throwable != null) {
24+
Log.v(TAG, logMessage, throwable)
25+
} else {
26+
Log.v(TAG, logMessage)
27+
}
28+
}
29+
30+
fun d(message: String, throwable: Throwable? = null) {
31+
val logMessage = formatMessage(message)
32+
if (throwable != null) {
33+
Log.d(TAG, logMessage, throwable)
34+
} else {
35+
Log.d(TAG, logMessage)
36+
}
37+
}
38+
39+
fun i(message: String, throwable: Throwable? = null) {
40+
val logMessage = formatMessage(message)
41+
if (throwable != null) {
42+
Log.i(TAG, logMessage, throwable)
43+
} else {
44+
Log.i(TAG, logMessage)
45+
}
46+
}
47+
48+
fun w(message: String, throwable: Throwable? = null) {
49+
val logMessage = formatMessage(message)
50+
if (throwable != null) {
51+
Log.w(TAG, logMessage, throwable)
52+
} else {
53+
Log.w(TAG, logMessage)
54+
}
55+
}
56+
57+
fun e(message: String, throwable: Throwable? = null) {
58+
val logMessage = formatMessage(message)
59+
if (throwable != null) {
60+
Log.e(TAG, logMessage, throwable)
61+
} else {
62+
Log.e(TAG, logMessage)
63+
}
64+
}
65+
66+
// 带线程信息的日志方法
67+
fun logThread(message: String) {
68+
val threadName = Thread.currentThread().name
69+
i("[$threadName] $message")
70+
}
71+
72+
// 协程安全的日志方法
73+
suspend fun logSuspend(message: String) = withContext(ioDispatcher) {
74+
i(message)
75+
}
76+
77+
// Rclone 特定操作的日志方法
78+
fun logBinaryLoad(path: String) {
79+
i("Loading rclone binary from: $path")
80+
}
81+
82+
fun logBinaryNotFound(path: String) {
83+
e("Rclone binary not found at: $path")
84+
}
85+
86+
fun logConfigInit(configPath: String) {
87+
i("Initializing rclone config: $configPath")
88+
}
89+
90+
fun logSyncStart(remotePath: String, localPath: String) {
91+
i("Starting rclone sync: $remotePath -> $localPath")
92+
}
93+
94+
fun logSyncProgress(percent: Double, files: Long, bytes: Long) {
95+
d("Sync progress: ${percent}%, files: $files, bytes: $bytes")
96+
}
97+
98+
fun logSyncSuccess(transferredBytes: Long) {
99+
i("Rclone sync completed successfully, transferred: $transferredBytes bytes")
100+
}
101+
102+
fun logSyncFailed(error: String) {
103+
e("Rclone sync failed: $error")
104+
}
105+
106+
fun logBinaryPathFound(path: String) {
107+
i("Getting rclone binary path: $path")
108+
}
109+
110+
fun logPermissionSetSuccess() {
111+
d("Set executable permission for rclone binary")
112+
}
113+
114+
fun logPermissionSetFailed(e: Exception) {
115+
w("Failed to set executable permission", e)
116+
}
117+
118+
// Rclone 配置相关日志方法
119+
fun logConfigInitStarted() {
120+
i("Starting rclone configuration initialization")
121+
}
122+
123+
fun logConfigInitSuccess() {
124+
i("Rclone configuration initialized successfully")
125+
}
126+
127+
fun logConfigInitFailed(error: String) {
128+
e("Failed to initialize rclone configuration: $error")
129+
}
130+
131+
fun logSyncStarted(remote: String, local: String) {
132+
i("Starting sync from $remote to $local")
133+
}
134+
135+
fun logRemoteListStarted(remote: String) {
136+
i("Listing remote files: $remote")
137+
}
138+
139+
fun logRemoteListFailed(e: Exception) {
140+
e("Failed to list remote files", e)
141+
}
142+
143+
fun logCommand(command: List<String>) {
144+
d("Executing command: ${command.joinToString(" ")}")
145+
}
146+
147+
fun logCommandResult(exitCode: Int, output: String) {
148+
d("Command exit code: $exitCode, output: $output")
149+
}
150+
151+
fun logResticServerStart(remote: String, addr: String) {
152+
i("Starting rclone restic server for $remote on $addr")
153+
}
154+
155+
fun logResticServerStarted(addr: String) {
156+
i("Rclone restic server started successfully on $addr")
157+
}
158+
159+
fun logResticServerStop() {
160+
i("Stopping rclone restic server")
161+
}
162+
163+
fun logResticServerStopped() {
164+
i("Rclone restic server stopped")
165+
}
166+
167+
fun logCommandFailed(e: Exception) {
168+
e("Error executing rclone command", e)
169+
}
170+
171+
// 私有方法:格式化消息
172+
private fun formatMessage(message: String): String {
173+
return "$PREFIX $message"
174+
}
175+
}

0 commit comments

Comments
 (0)