什么是.kotlin_builtins文件,我可以从我的uberjars中忽略它们?

我正在将proguard集成到我的Gradle构建中,用于在Kotlin中编写的应用程序。 我发现proguard正在剥离Kotlin标准库(就像它应该在我简单的Hello World程序中那样),但是在我的jar文件中留下了一堆扩展名为.kotlin_builtins的文件。 当我配置我的gradle任务来排除这些文件时,该程序仍然显示正常工作。 这些文件是什么,他们必须随我的可执行uberjar?

这里是我的build.gradle文件的内容供参考:

 buildscript { ext.kotlin_version = '1.0.5' ext.shadow_version = '1.2.4' repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } flatDir dirs: "gradle/proguard" } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.github.jengelman.gradle.plugins:shadow:$shadow_version" classpath ":proguard:" } } apply plugin: 'kotlin' apply plugin: 'application' apply plugin: 'com.github.johnrengelman.shadow' mainClassName = 'namespace.MainKt' defaultTasks 'run' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" } shadowJar { exclude 'kotlin/**/*.kotlin_builtins' exclude '.keep' } task minify(type: proguard.gradle.ProGuardTask, dependsOn: 'shadowJar') { libraryjars "${System.getProperty('java.home')}/lib/rt.jar" injars 'build/libs/artful-all.jar' outjars 'build/libs/artful-all.out.jar' printmapping 'build/libs/out.map' keepclasseswithmembers 'public class * { \ public static void main(java.lang.String[]); \ }' assumenosideeffects 'class kotlin.jvm.internal.Intrinsics { \ static void checkParameterIsNotNull(java.lang.Object, java.lang.String); \ }' } 

这些文件包含标准(“内置”)Kotlin类声明的数据,这些类未被编译为.class文件,而是被映射到平台上的现有类型(在本例中为JVM)。 例如, kotlin/kotlin.kotlin_builtins包含kotlin/kotlin.kotlin_builtinskotlin物理类的信息: IntStringEnumAnnotationCollection

使用这些文件有两个主要场景:

1)编译器从类路径上的kotlin-runtime查找它们以确定哪些内置声明可用。

2)反射库( kotlin-reflect )将这些文件加载​​为资源,为内置声明提供反射功能。 例如, String::class.members返回类kotlin.String所有成员,就像Kotlin编译器看到这些成员的方式一样(尽管事实上没有kotlin/String.class文件,并且它被擦除为java.lang.String字节码中的字符串)。

第一点显然不适用于你的情况。 如果您不使用内置类的反射,我认为完全从生成的jar中排除.kotlin_builtins文件是安全的。

您可以从您的JAR / APK中优化/省略这些:

  packagingOptions { exclude "/META-INF/*.kotlin_module" exclude "**/kotlin/**" } 

更好:

  packagingOptions { exclude "/META-INF/*.kotlin_module" exclude "**/kotlin/**" exclude "**/*.txt" exclude "**/*.xml" exclude "**/*.properties" } 

来源: https : //github.com/jaredsburrows/android-gif-example/blob/master/build.gradle#L144