什么是.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_builtins
包kotlin
物理类的信息: Int
, String
, Enum
, Annotation
, Collection
等
使用这些文件有两个主要场景:
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