什么是.kotlin_builtins文件,我可以从我的超级罐子中省略它们吗?



我正在努力将 proguard 集成到我的 gradle 构建中,用于用 Kotlin 编写的应用程序。 我发现 proguard 正在剥离 Kotlin 标准库(就像在我的简单 Hello World 程序中应该的那样),但它在我的罐子里留下了一堆文件扩展名.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中非物理类的信息:IntStringEnumAnnotationCollection等。

使用这些文件时有两种主要方案:

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

  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.kts#L127

最新更新