2016-12-09 1 views
6

私はKotlinで書かれたアプリケーションのための私のgradleビルドにproguardを統合しています。私はproguardがKotlin標準ライブラリを削除していることを知っていますが(それは私の単純なHello Worldプログラムですべきです)、ファイル拡張子が.kotlin_builtinsのJarファイルにたくさんのファイルが残っています。これらのファイルを除外するように私のgradleタスクを設定すると、プログラムは正常に動作するように見えます。これらのファイルは何ですか?実行可能ファイルのuberjarとともに出荷する必要がありますか?.kotlin_builtinsファイルとは何ですか?私はuberjarsからそれらを省略できますか?

は、ここに参照のために私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); \ 
    }' 
} 

答えて

6

これらのファイルは、.classファイルにコンパイルされていない標準の宣言(「ビルトイン」)Kotlinクラスのデータが含まれているのではなく、にマッピングされていますプラットフォーム上の既存のタイプ(この場合はJVM)。例えば、kotlin/kotlin.kotlin_builtinsはパッケージkotlinで非物理的なクラスのための情報が含まれています:IntStringEnumAnnotationCollectionなどを

これらのファイルが使用されている2つの主なシナリオがあります

1)コンパイラはそれらをクラスパス上のkotlin-runtimeから探して、利用可能な組み込み宣言を決定します。

2)リフレクションライブラリ(kotlin-reflect)は、これらのファイルをリソースとしてロードして、組み込み宣言の反映機能を提供します。たとえば、String::class.membersは、kotlin.Stringクラスのすべてのメンバーを、Kotlinコンパイラが(kotlin/String.classファイルがなく、バイトコードでjava.lang.Stringに消去されているにもかかわらず)それらのメンバーを見るのと同じ方法で返します。

最初の点は明らかに該当しません。また、組み込みクラスでリフレクションを使用しない場合、.kotlin_builtinsファイルを結果のjarから完全に除外することは安全だと思います。

0

あなたが/これらはあなたの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

関連する問題