2017-11-01 20 views
1

は、私は次のような問題抱えている: - 作成されたいくつかのモジュールComponentクラスを実装し、それが@AutoService(Component::class) で注釈を付けています - 私のAndroidアプリは、これらのクラスを取得するためにServiceLoaderを使用しています。しかしkaptMETA-INF/services/...Kotlin注釈プロセッサ+ AutoService

マイモジュールgradle.file内のファイルを生成していない何らかの理由:

apply plugin: 'com.android.library' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-kapt' 

android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.2" 


    defaultConfig { 
     minSdkVersion 19 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

     javaCompileOptions { 
      annotationProcessorOptions { 
       includeCompileClasspath = true 
      } 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

} 

dependencies { 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 

    implementation 'com.android.support:appcompat-v7:26.1.0' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    implementation 'com.android.support:design:26.1.0' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 

    implementation project(':common-dependencies') 
    implementation project(':component') 
    compileOnly 'com.google.auto.service:auto-service:1.0-rc3' 
    kapt "com.google.auto.service:auto-service:1.0-rc3" 

    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
} 

マイアプリのbuild.gradleファイル:

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 
apply plugin: 'kotlin-kapt' 

android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.2" 
    defaultConfig { 
     applicationId "com.test.sampleapp" 
     minSdkVersion 19 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 

     javaCompileOptions { 
      annotationProcessorOptions { 
       includeCompileClasspath = true 
      } 
     } 
    } 

    flavorDimensions 'required-notused' 

    productFlavors { 
     brandA { 
      resValue "string", "app_name", "Brand A" 
     } 
     brandB { 
      resValue "string", "app_name", "Brand B" 
     } 

     all { applicationIdSuffix ".${it.name.toLowerCase()}" } 
    } 

    buildTypes { 
     debug 

     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    implementation fileTree(dir: 'libs', include: ['*.jar']) 

    implementation 'com.android.support:appcompat-v7:26.1.0' 
    implementation 'com.android.support.constraint:constraint-layout:1.0.2' 
    implementation 'com.android.support:design:26.1.0' 
    testImplementation 'junit:junit:4.12' 
    androidTestImplementation 'com.android.support.test:runner:1.0.1' 
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' 

    implementation project(':common-dependencies') 
    implementation project(':component') 

    brandAImplementation project(':city-picker') 
    brandAImplementation project(':profile') 
    brandAImplementation project(':matches') 
    brandAImplementation project(':chat') 

    brandBImplementation project(':city-picker') 
    brandBImplementation project(':chat') 

    compileOnly 'com.google.auto.service:auto-service:1.0-rc3' 
    kapt "com.google.auto.service:auto-service:1.0-rc3" 
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
} 

repositories { 
    mavenCentral() 
} 

私がなぜわからないんだけど、 kaptは基本的にこれらのファイルを生成していません。 Javaクラスを使用すると、即座に生成されます。 これは何故でしょうか?私はそれが(それを誇りに思っていない)動作させるために、回避策をした

答えて

0

あなたはこの

kapt { correctErrorTypes = true }

https://kotlinlang.org/docs/reference/kapt.html

+0

残念ながらうまくいきませんでした。 :( – user3605025

+0

これは廃止されており、Kotlin 1.2リリース後すぐに削除されます、元kaptためである。これはバグのように聞こえる – yanex

0

を試みることができる 私は自分のプロセッサをインスタンス化し、常ににprocessingOverを上書きしなければなりませんでしたfalseを返します。 kaptは私のリソースのキャッシュを保持していて、ビルドをきれいにした後もファイルを生成しません。

ここでは、コードです:

public class CustomAutoServiceProcessor extends AutoServiceProcessor { 

    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { 
     try { 
      Field processingOver = roundEnv.getClass().getDeclaredField("processingOver"); 
      processingOver.setAccessible(true); 
      processingOver.set(roundEnv, false); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
     return super.process(annotations, roundEnv); 
    } 
} 

任意のより良い提案は大歓迎です!

+0

。 あなたは小さなプロジェクトでこれを再現することができた場合は、(Kotlinの課題追跡に報告してくださいhttp://kotl.in/issue)。 – yanex