我在Android Studio中创建了一个默认的 Empty Views Activity 项目,使用Kotlin作为语言,使用KotlinDSL作为构建配置语言。然后我将以下代码附加到应用级别build.gradle.kts
。
abstract class CustomTask : DefaultTask() {
@get:Input
var generatedCodePath = ""
@TaskAction
fun run() {
val path = File(generatedCodePath).resolve(
"custom_code/debug/out/com/example/app/CustomCode.kt"
)
path.parentFile.mkdirs()
path.writeText("""
#package com.example.app
#
#public fun customCode() {
# println("Hello from custom code!")
#}
""".trimMargin("#"))
}
}
tasks.register<CustomTask>("customTask") {
generatedCodePath = "$buildDir/generated"
}
tasks.named("preBuild").configure {
dependsOn("customTask")
}
字符串
这个想法是新的CustomTask
将在每次构建时生成一个文件。在同步和重建之后,我已经检查了文件CustomCode.kt
确实已经在app\build\generated\custom_code\debug\out\com\example\app\CustomCode.kt
中正确生成。
现在,我尝试将函数customCode
从生成的文件导入到MainActivity
中,但遇到了无法解析的引用。
package com.example.gradlegenerate
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.app.* // Unresolved reference: app
import com.example.app.CustomCodeKt // Unresolved reference: app
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
型
请注意,生成的文件位于app
包中,而Activity位于gradlegenerate
包中,因此没有名称冲突。
我尝试将生成的文件添加到应用程序级别build.gradle.kts
的源集中,并重复同步&重建&导入,但没有运气。
android {
sourceSets {
named("main") {
java.srcDir("$buildDir/generated/debug/out")
}
}
}
型
我错过了什么?
1条答案
按热度按时间t3psigkw1#
问题是生成的代码的路径与添加到源代码集中的路径不匹配。
在
app/build.gradle.kts
中,我更正了源代码集。字符串
注意问题文本中缺少的字符串
custom_code
。现在我终于可以在MainActivity中导入和使用
customCode
函数了。型
当我构建并运行应用程序时,输出由Logcat注册。
型