buildscript { dependencies { classpath 'com.google.guava:guava:30.0-android' } } plugins { id "java-library" id "java-test-fixtures" id "maven-publish" id "me.champeau.gradle.japicmp" id "me.champeau.jmh" id "ru.vyarus.animalsniffer" } import static java.nio.charset.StandardCharsets.US_ASCII; import com.google.common.primitives.Bytes; description = 'gRPC: Core' dependencies { api project(':grpc-api') implementation libraries.gson, libraries.android.annotations, libraries.animalsniffer.annotations, libraries.errorprone.annotations, libraries.guava, libraries.perfmark.api testFixturesApi libraries.junit testFixturesImplementation libraries.guava, libraries.mockito.core, libraries.truth, project(':grpc-testing') testImplementation testFixtures(project(':grpc-context')), testFixtures(project(':grpc-api')), project(':grpc-testing'), project(':grpc-grpclb') testImplementation (libraries.guava.testlib) { exclude group: 'junit', module: 'junit' } testRuntimeOnly project(':grpc-census') jmh project(':grpc-testing') signature libraries.signature.java signature libraries.signature.android } tasks.named("javadoc").configure { exclude 'io/grpc/internal/**' exclude 'io/grpc/inprocess/Internal*' // Disabled until kinda stable. exclude 'io/grpc/perfmark/**' } animalsniffer { // Don't check sourceSets.jmh sourceSets = [ sourceSets.main, sourceSets.test ] } components.java.withVariantsFromConfiguration(configurations.testFixturesApiElements) { skip() } components.java.withVariantsFromConfiguration(configurations.testFixturesRuntimeElements) { skip() } import net.ltgt.gradle.errorprone.CheckSeverity def replaceBytes(byte[] haystack, byte[] needle, byte[] replacement) { int i = Bytes.indexOf(haystack, needle); assert i != -1; byte[] result = new byte[haystack.length - needle.length + replacement.length]; System.arraycopy(haystack, 0, result, 0, i); System.arraycopy(replacement, 0, result, i, replacement.length); System.arraycopy(haystack, i + needle.length, result, i + replacement.length, haystack.length - i - needle.length); return result; } def bigEndianShortBytes(int value) { return [value >> 8, value & 0xFF] as byte[]; } def replaceConstant(File file, String needle, String replacement) { // CONSTANT_Utf8_info. https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.4.7 byte[] needleBytes = Bytes.concat( [1] as byte[], bigEndianShortBytes(needle.length()), needle.getBytes(US_ASCII)); byte[] replacementBytes = Bytes.concat( [1] as byte[], bigEndianShortBytes(replacement.length()), replacement.getBytes(US_ASCII)); file.setBytes(replaceBytes(file.getBytes(), needleBytes, replacementBytes)); } plugins.withId("java") { tasks.named("compileJava").configure { doLast { // Replace value of Signature Attribute. // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.9 // // Have new compilations compile against a public class, without breaking the internal // ABI for the moment. After giving users some time to recompile, this should be removed // and #7211 can continue. When this is removed, at the very least the generics need to // be changed to avoid . project.replaceConstant( destinationDirectory.file( "io/grpc/internal/AbstractManagedChannelImplBuilder.class").get().getAsFile(), ";>Lio/grpc/ManagedChannelBuilder;", ";>Lio/grpc/ManagedChannelBuilder;"); project.replaceConstant( destinationDirectory.file( "io/grpc/internal/AbstractServerImplBuilder.class").get().getAsFile(), ";>Lio/grpc/ServerBuilder;", ";>Lio/grpc/ServerBuilder;"); } } } tasks.register("versionFile") { doLast { new File(buildDir, "version").write("${project.version}\n") } }