什么是 .kotlin_builtins 文件,我可以从我的 uberjars 中省略它们吗?
What are .kotlin_builtins files and can I omit them from my uberjars?
我正在为一个用 Kotlin 编写的应用程序将混淆器集成到我的 gradle 构建中。我发现 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 classes 的数据,这些文件未编译为 .class
文件,而是映射到平台上的现有类型(在这种情况下,JVM)。例如,kotlin/kotlin.kotlin_builtins
包含包 kotlin
中非物理 classes 的信息:Int
、String
、Enum
、Annotation
、Collection
、等等
使用这些文件主要有两种情况:
编译器从 class 路径上的 kotlin-stdlib
查找它们以确定哪些内置声明可用。
反射库(kotlin-reflect
)加载这些文件作为资源,为内置声明提供反射能力。例如,String::class.members
returns class kotlin.String
的所有成员与 Kotlin 编译器查看这些成员的方式完全相同(尽管事实上没有 kotlin/String.class
文件并在字节码中被擦除为 java.lang.String
).
第一点显然不适用于你的情况。如果你不在内置 classes 上使用反射,我认为从生成的 jar 中完全排除 .kotlin_builtins
文件是安全的。
您可以 optimize/omit 这些来自您的 JARs/APKs:
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
我正在为一个用 Kotlin 编写的应用程序将混淆器集成到我的 gradle 构建中。我发现 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 classes 的数据,这些文件未编译为 .class
文件,而是映射到平台上的现有类型(在这种情况下,JVM)。例如,kotlin/kotlin.kotlin_builtins
包含包 kotlin
中非物理 classes 的信息:Int
、String
、Enum
、Annotation
、Collection
、等等
使用这些文件主要有两种情况:
编译器从 class 路径上的
kotlin-stdlib
查找它们以确定哪些内置声明可用。反射库(
kotlin-reflect
)加载这些文件作为资源,为内置声明提供反射能力。例如,String::class.members
returns classkotlin.String
的所有成员与 Kotlin 编译器查看这些成员的方式完全相同(尽管事实上没有kotlin/String.class
文件并在字节码中被擦除为java.lang.String
).
第一点显然不适用于你的情况。如果你不在内置 classes 上使用反射,我认为从生成的 jar 中完全排除 .kotlin_builtins
文件是安全的。
您可以 optimize/omit 这些来自您的 JARs/APKs:
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