BootstrapMethodError with custom bootclasspath in Android

android

(Shubhadeep Chaudhuri) #1

I’m getting this build error when trying to build an android app with the Checker Framework.
Any ideas would help.

./gradlew compileReleaseJavaWithJavac -Ptypecheck=true
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html.
:app:preBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:preDebugBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2511Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72511Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2511Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCompat2511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCoreUi2511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportCoreUtils2511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportFragment2511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportMediaCompat2511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42511Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2511Library UP-TO-DATE
:app:prepareComAndroidSupportTransition2511Library UP-TO-DATE
:app:prepareReleaseDependencies
:app:compileReleaseAidl UP-TO-DATE
:app:compileReleaseRenderscript UP-TO-DATE
:app:generateReleaseBuildConfig UP-TO-DATE
:app:generateReleaseResValues UP-TO-DATE
:app:generateReleaseResources UP-TO-DATE
:app:mergeReleaseResources UP-TO-DATE
:app:processReleaseManifest UP-TO-DATE
:app:processReleaseResources UP-TO-DATE
:app:generateReleaseSources UP-TO-DATE
:app:incrementalReleaseJavaCompilationSafeguard UP-TO-DATE
:app:compileReleaseJavaWithJavac
java.lang.BootstrapMethodError: call site initialization exception
        at java.lang.invoke.CallSite.makeSite(CallSite.java:341)
        at java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:307)
        at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:297)
        at java.io.ObjectInputStream.<clinit>(ObjectInputStream.java:3578)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:80)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:45)
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:61)
        at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:66)
Caused by: java.lang.ClassCastException: bootstrap method failed to produce a CallSite
        at java.lang.invoke.CallSite.makeSite(CallSite.java:332)
        ... 7 more
:app:compileReleaseJavaWithJavac FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:compileReleaseJavaWithJavac'.
> Failed to run Gradle Compiler Daemon
   > Process 'Gradle Compiler Daemon 1' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 10.184 secs

FAILURE: Build failed with an exception.

* What went wrong:
Process 'Gradle Compiler Daemon 1' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

The following are the relevant parts of the two build.gradle files

Top-level

boolean typecheck = project.properties['typecheck'] ?: false

allprojects {
    repositories {
        jcenter()
    }

    configurations {
        checkerFrameworkJavac {
            description = 'a customization of the OpenJDK javac compiler with additional support for type annotations'
        }
        checkerFrameworkAnnotatedJDK {
            description = 'a copy of JDK classes with Checker Framework type qualifers inserted'
        }
        checkerFramework {
            description = 'The Checker Framework: custom pluggable types for Java'
        }
    }

    if (typecheck) {
        gradle.projectsEvaluated {
            tasks.withType(JavaCompile).all { JavaCompile compile ->
                println "compile.options is: ${configurations.checkerFramework.asPath}"
                println "compile.options is: ${configurations.checkerFrameworkAnnotatedJDK.asPath}"
                println "compile.options is: ${configurations.checkerFrameworkJavac.asPath}"
                compile.options.compilerArgs = [
                        '-processor', 'org.checkerframework.checker.nullness.NullnessChecker',
                        '-processorpath', "${configurations.checkerFramework.asPath}",
                        // uncomment to turn Checker Framework errors into warnings
//                        '-Awarns',
                        "-Xbootclasspath/p:${configurations.checkerFrameworkAnnotatedJDK.asPath}"
                ]
                compile.options.compilerArgs += ['-source', '7', '-target', '7']
                if (options.bootClasspath) {
                    options.bootClasspath = "${configurations.checkerFrameworkJavac.asPath}:${System.getProperty("sun.boot.class.path")}:${options.bootClasspath}"
                } else {
                    options.bootClasspath = "${configurations.checkerFrameworkJavac.asPath}:${System.getProperty("sun.boot.class.path")}"
                }
                options.fork = true
                options.forkOptions.jvmArgs += ["-Xbootclasspath/p:${options.bootClasspath}"]
            }
        }
    }
}

Module level

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.myapp"
        minSdkVersion 14
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

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

    // Checker framework
    ext.checkerFrameworkVersion = '2.1.4'
    ext.jdkVersion = JavaVersion.current().isJava7() ? 'jdk7' : 'jdk8'
    checkerFrameworkAnnotatedJDK "org.checkerframework:${jdkVersion}:${checkerFrameworkVersion}"
    checkerFrameworkJavac "org.checkerframework:compiler:${checkerFrameworkVersion}"
    checkerFramework "org.checkerframework:checker:${checkerFrameworkVersion}"
    compile "org.checkerframework:checker-qual:${checkerFrameworkVersion}"
}

The build error only happens when the custom bootclasspaths are specified in the top-level build script

options.bootClasspath = "${configurations.checkerFrameworkJavac.asPath}:${System.getProperty("sun.boot.class.path")}:${options.bootClasspath}"
options.forkOptions.jvmArgs += ["-Xbootclasspath/p:${options.bootClasspath}"]