From ee0cbed9fd83de6669a2202b2f0b60849949ccdf Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 10 Sep 2026 16:17:43 -0400 Subject: [PATCH 01/14] libs.versions.toml: upgrade grpc and related libraries to their latest versions --- gradle/libs.versions.toml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 510a63234bd..77e72e3b65f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,15 +34,15 @@ glide = "5.0.5" googleApiClient = "2.8.1" googleServices = "4.3.15" gradleErrorpronePlugin = "4.2.0" -grpc = "1.62.2" -grpcKotlin = "1.4.1" +grpc = "1.84.0" +grpcKotlin = "1.5.0" hamcrest = "3.0" hamcrestLibrary = "3.0" httpclientAndroid = "4.3.5.1" integrity = "1.4.0" jacksonCore = "2.13.1" jacksonDatabind = "2.21.3" -javalite = "3.25.5" +javalite = "4.36.1" jsonassert = "1.5.0" kotest = "5.9.0" # Do not use 5.9.1 because it reverts the fix for https://github.com/kotest/kotest/issues/3981 kotestAssertionsCore = "5.8.1" @@ -59,10 +59,10 @@ mockk = "1.14.0" # Do not use 1.14.2 or above due to a bug in spy playServicesCloudMessaging = "17.4.0" playServicesStats = "17.0.2" playServicesVision = "20.1.3" -protoGoogleCommonProtos = "1.18.0" -protobufGradlePlugin = "0.9.6" -protobufjavautil = "3.25.5" -protoc = "3.25.5" +protoGoogleCommonProtos = "2.75.0" +protobufGradlePlugin = "0.10.0" +protobufjavautil = "4.36.1" +protoc = "4.36.1" quickcheck = "0.6" reactiveStreams = "1.0.4" robolectric = "4.12" # Do not use >4.12 as it breaks the build From fe2f86380aeaa28d57ebb698d60ad02247d5c364 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 11 Sep 2026 16:54:35 +0000 Subject: [PATCH 02/14] libs.versions.toml: downgrade protobufGradlePlugin back down to 0.9.6 to work around resulting build errors "FirestoreGrpc.java:762: error: package io.grpc.stub does not exist" caused by upstream bug https://github.com/google/protobuf-gradle-plugin/issues/812 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 77e72e3b65f..50e2d46202a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -60,7 +60,7 @@ playServicesCloudMessaging = "17.4.0" playServicesStats = "17.0.2" playServicesVision = "20.1.3" protoGoogleCommonProtos = "2.75.0" -protobufGradlePlugin = "0.10.0" +protobufGradlePlugin = "0.9.6" protobufjavautil = "4.36.1" protoc = "4.36.1" quickcheck = "0.6" From 0f95513be54318368d35ad85074f1c99420d5b55 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 11 Sep 2026 18:47:45 +0000 Subject: [PATCH 03/14] firebase-perf.gradle: removed unused dependency: `api project(":protolite-well-known-types")` --- firebase-perf/firebase-perf.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/firebase-perf/firebase-perf.gradle b/firebase-perf/firebase-perf.gradle index eceb84a6ca8..70377646575 100644 --- a/firebase-perf/firebase-perf.gradle +++ b/firebase-perf/firebase-perf.gradle @@ -114,7 +114,6 @@ dependencies { implementation libs.dagger.dagger api libs.firebase.annotations api 'com.google.firebase:firebase-installations-interop:17.1.0' - api project(":protolite-well-known-types") implementation libs.okhttp api(libs.firebase.common) api(libs.firebase.components) From 8928d0f81b35e8c00375a63659eba2d9c0381061 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Fri, 11 Sep 2026 15:09:03 -0400 Subject: [PATCH 04/14] protolite-well-known-types: remove obsolete vendored descriptor.proto, since it is now included in the upgraded `protobuf-javalite:4.36.1` dependency --- .../proto/google/protobuf/descriptor.proto | 884 ------------------ 1 file changed, 884 deletions(-) delete mode 100644 protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto diff --git a/protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto b/protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto deleted file mode 100644 index 26ecde63131..00000000000 --- a/protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto +++ /dev/null @@ -1,884 +0,0 @@ -// Copyright 2018 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto2"; - -package google.protobuf; - -option go_package = "github.com/golang/protobuf/protoc-gen-go/descriptor;descriptor"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "DescriptorProtos"; -option csharp_namespace = "Google.Protobuf.Reflection"; -option objc_class_prefix = "GPB"; -option cc_enable_arenas = true; - -// descriptor.proto must be optimized for speed because reflection-based -// algorithms don't work during bootstrapping. -option optimize_for = SPEED; - -// The protocol compiler can output a FileDescriptorSet containing the .proto -// files it parses. -message FileDescriptorSet { - repeated FileDescriptorProto file = 1; -} - -// Describes a complete .proto file. -message FileDescriptorProto { - optional string name = 1; // file name, relative to root of source tree - optional string package = 2; // e.g. "foo", "foo.bar", etc. - - // Names of files imported by this file. - repeated string dependency = 3; - // Indexes of the public imported files in the dependency list above. - repeated int32 public_dependency = 10; - // Indexes of the weak imported files in the dependency list. - // For Google-internal migration only. Do not use. - repeated int32 weak_dependency = 11; - - // All top-level definitions in this file. - repeated DescriptorProto message_type = 4; - repeated EnumDescriptorProto enum_type = 5; - repeated ServiceDescriptorProto service = 6; - repeated FieldDescriptorProto extension = 7; - - optional FileOptions options = 8; - - // This field contains optional information about the original source code. - // You may safely remove this entire field without harming runtime - // functionality of the descriptors -- the information is needed only by - // development tools. - optional SourceCodeInfo source_code_info = 9; - - // The syntax of the proto file. - // The supported values are "proto2" and "proto3". - optional string syntax = 12; -} - -// Describes a message type. -message DescriptorProto { - optional string name = 1; - - repeated FieldDescriptorProto field = 2; - repeated FieldDescriptorProto extension = 6; - - repeated DescriptorProto nested_type = 3; - repeated EnumDescriptorProto enum_type = 4; - - message ExtensionRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Exclusive. - - optional ExtensionRangeOptions options = 3; - } - repeated ExtensionRange extension_range = 5; - - repeated OneofDescriptorProto oneof_decl = 8; - - optional MessageOptions options = 7; - - // Range of reserved tag numbers. Reserved tag numbers may not be used by - // fields or extension ranges in the same message. Reserved ranges may - // not overlap. - message ReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Exclusive. - } - repeated ReservedRange reserved_range = 9; - // Reserved field names, which may not be used by fields in the same message. - // A given name may only be reserved once. - repeated string reserved_name = 10; -} - -message ExtensionRangeOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -// Describes a field within a message. -message FieldDescriptorProto { - enum Type { - // 0 is reserved for errors. - // Order is weird for historical reasons. - TYPE_DOUBLE = 1; - TYPE_FLOAT = 2; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if - // negative values are likely. - TYPE_INT64 = 3; - TYPE_UINT64 = 4; - // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if - // negative values are likely. - TYPE_INT32 = 5; - TYPE_FIXED64 = 6; - TYPE_FIXED32 = 7; - TYPE_BOOL = 8; - TYPE_STRING = 9; - // Tag-delimited aggregate. - // Group type is deprecated and not supported in proto3. However, Proto3 - // implementations should still be able to parse the group wire format and - // treat group fields as unknown fields. - TYPE_GROUP = 10; - TYPE_MESSAGE = 11; // Length-delimited aggregate. - - // New in version 2. - TYPE_BYTES = 12; - TYPE_UINT32 = 13; - TYPE_ENUM = 14; - TYPE_SFIXED32 = 15; - TYPE_SFIXED64 = 16; - TYPE_SINT32 = 17; // Uses ZigZag encoding. - TYPE_SINT64 = 18; // Uses ZigZag encoding. - } - - enum Label { - // 0 is reserved for errors - LABEL_OPTIONAL = 1; - LABEL_REQUIRED = 2; - LABEL_REPEATED = 3; - } - - optional string name = 1; - optional int32 number = 3; - optional Label label = 4; - - // If type_name is set, this need not be set. If both this and type_name - // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. - optional Type type = 5; - - // For message and enum types, this is the name of the type. If the name - // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping - // rules are used to find the type (i.e. first the nested types within this - // message are searched, then within the parent, on up to the root - // namespace). - optional string type_name = 6; - - // For extensions, this is the name of the type being extended. It is - // resolved in the same manner as type_name. - optional string extendee = 2; - - // For numeric types, contains the original text representation of the value. - // For booleans, "true" or "false". - // For strings, contains the default text contents (not escaped in any way). - // For bytes, contains the C escaped value. All bytes >= 128 are escaped. - // TODO(kenton): Base-64 encode? - optional string default_value = 7; - - // If set, gives the index of a oneof in the containing type's oneof_decl - // list. This field is a member of that oneof. - optional int32 oneof_index = 9; - - // JSON name of this field. The value is set by protocol compiler. If the - // user has set a "json_name" option on this field, that option's value - // will be used. Otherwise, it's deduced from the field's name by converting - // it to camelCase. - optional string json_name = 10; - - optional FieldOptions options = 8; - - // If true, this is a proto3 "optional". When a proto3 field is optional, it - // tracks presence regardless of field type. - // - // When proto3_optional is true, this field must be belong to a oneof to - // signal to old proto3 clients that presence is tracked for this field. This - // oneof is known as a "synthetic" oneof, and this field must be its sole - // member (each proto3 optional field gets its own synthetic oneof). Synthetic - // oneofs exist in the descriptor only, and do not generate any API. Synthetic - // oneofs must be ordered after all "real" oneofs. - // - // For message fields, proto3_optional doesn't create any semantic change, - // since non-repeated message fields always track presence. However it still - // indicates the semantic detail of whether the user wrote "optional" or not. - // This can be useful for round-tripping the .proto file. For consistency we - // give message fields a synthetic oneof also, even though it is not required - // to track presence. This is especially important because the parser can't - // tell if a field is a message or an enum, so it must always create a - // synthetic oneof. - // - // Proto2 optional fields do not set this flag, because they already indicate - // optional with `LABEL_OPTIONAL`. - optional bool proto3_optional = 17; -} - -// Describes a oneof. -message OneofDescriptorProto { - optional string name = 1; - optional OneofOptions options = 2; -} - -// Describes an enum type. -message EnumDescriptorProto { - optional string name = 1; - - repeated EnumValueDescriptorProto value = 2; - - optional EnumOptions options = 3; - - // Range of reserved numeric values. Reserved values may not be used by - // entries in the same enum. Reserved ranges may not overlap. - // - // Note that this is distinct from DescriptorProto.ReservedRange in that it - // is inclusive such that it can appropriately represent the entire int32 - // domain. - message EnumReservedRange { - optional int32 start = 1; // Inclusive. - optional int32 end = 2; // Inclusive. - } - - // Range of reserved numeric values. Reserved numeric values may not be used - // by enum values in the same enum declaration. Reserved ranges may not - // overlap. - repeated EnumReservedRange reserved_range = 4; - - // Reserved enum value names, which may not be reused. A given name may only - // be reserved once. - repeated string reserved_name = 5; -} - -// Describes a value within an enum. -message EnumValueDescriptorProto { - optional string name = 1; - optional int32 number = 2; - - optional EnumValueOptions options = 3; -} - -// Describes a service. -message ServiceDescriptorProto { - optional string name = 1; - repeated MethodDescriptorProto method = 2; - - optional ServiceOptions options = 3; -} - -// Describes a method of a service. -message MethodDescriptorProto { - optional string name = 1; - - // Input and output type names. These are resolved in the same way as - // FieldDescriptorProto.type_name, but must refer to a message type. - optional string input_type = 2; - optional string output_type = 3; - - optional MethodOptions options = 4; - - // Identifies if client streams multiple client messages - optional bool client_streaming = 5 [default = false]; - // Identifies if server streams multiple server messages - optional bool server_streaming = 6 [default = false]; -} - - -// =================================================================== -// Options - -// Each of the definitions above may have "options" attached. These are -// just annotations which may cause code to be generated slightly differently -// or may contain hints for code that manipulates protocol messages. -// -// Clients may define custom options as extensions of the *Options messages. -// These extensions may not yet be known at parsing time, so the parser cannot -// store the values in them. Instead it stores them in a field in the *Options -// message called uninterpreted_option. This field must have the same name -// across all *Options messages. We then use this field to populate the -// extensions when we build a descriptor, at which point all protos have been -// parsed and so all extensions are known. -// -// Extension numbers for custom options may be chosen as follows: -// * For options which will only be used within a single application or -// organization, or for experimental options, use field numbers 50000 -// through 99999. It is up to you to ensure that you do not use the -// same number for multiple options. -// * For options which will be published and used publicly by multiple -// independent entities, e-mail protobuf-global-extension-registry@google.com -// to reserve extension numbers. Simply provide your project name (e.g. -// Objective-C plugin) and your project website (if available) -- there's no -// need to explain how you intend to use them. Usually you only need one -// extension number. You can declare multiple options with only one extension -// number by putting them in a sub-message. See the Custom Options section of -// the docs for examples: -// https://developers.google.com/protocol-buffers/docs/proto#options -// If this turns out to be popular, a web service will be set up -// to automatically assign option numbers. - -message FileOptions { - - // Sets the Java package where classes generated from this .proto will be - // placed. By default, the proto package is used, but this is often - // inappropriate because proto packages do not normally start with backwards - // domain names. - optional string java_package = 1; - - - // If set, all the classes from the .proto file are wrapped in a single - // outer class with the given name. This applies to both Proto1 - // (equivalent to the old "--one_java_file" option) and Proto2 (where - // a .proto always translates to a single class, but you may want to - // explicitly choose the class name). - optional string java_outer_classname = 8; - - // If set true, then the Java code generator will generate a separate .java - // file for each top-level message, enum, and service defined in the .proto - // file. Thus, these types will *not* be nested inside the outer class - // named by java_outer_classname. However, the outer class will still be - // generated to contain the file's getDescriptor() method as well as any - // top-level extensions defined in the file. - optional bool java_multiple_files = 10 [default = false]; - - // This option does nothing. - optional bool java_generate_equals_and_hash = 20 [deprecated=true]; - - // If set true, then the Java2 code generator will generate code that - // throws an exception whenever an attempt is made to assign a non-UTF-8 - // byte sequence to a string field. - // Message reflection will do the same. - // However, an extension field still accepts non-UTF-8 byte sequences. - // This option has no effect on when used with the lite runtime. - optional bool java_string_check_utf8 = 27 [default = false]; - - - // Generated classes can be optimized for speed or code size. - enum OptimizeMode { - SPEED = 1; // Generate complete code for parsing, serialization, - // etc. - CODE_SIZE = 2; // Use ReflectionOps to implement these methods. - LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. - } - optional OptimizeMode optimize_for = 9 [default = SPEED]; - - // Sets the Go package where structs generated from this .proto will be - // placed. If omitted, the Go package will be derived from the following: - // - The basename of the package import path, if provided. - // - Otherwise, the package statement in the .proto file, if present. - // - Otherwise, the basename of the .proto file, without extension. - optional string go_package = 11; - - - - - // Should generic services be generated in each language? "Generic" services - // are not specific to any particular RPC system. They are generated by the - // main code generators in each language (without additional plugins). - // Generic services were the only kind of service generation supported by - // early versions of google.protobuf. - // - // Generic services are now considered deprecated in favor of using plugins - // that generate code specific to your particular RPC system. Therefore, - // these default to false. Old code which depends on generic services should - // explicitly set them to true. - optional bool cc_generic_services = 16 [default = false]; - optional bool java_generic_services = 17 [default = false]; - optional bool py_generic_services = 18 [default = false]; - optional bool php_generic_services = 42 [default = false]; - - // Is this file deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for everything in the file, or it will be completely ignored; in the very - // least, this is a formalization for deprecating files. - optional bool deprecated = 23 [default = false]; - - // Enables the use of arenas for the proto messages in this file. This applies - // only to generated classes for C++. - optional bool cc_enable_arenas = 31 [default = true]; - - - // Sets the objective c class prefix which is prepended to all objective c - // generated classes from this .proto. There is no default. - optional string objc_class_prefix = 36; - - // Namespace for generated classes; defaults to the package. - optional string csharp_namespace = 37; - - // By default Swift generators will take the proto package and CamelCase it - // replacing '.' with underscore and use that to prefix the types/symbols - // defined. When this options is provided, they will use this value instead - // to prefix the types/symbols defined. - optional string swift_prefix = 39; - - // Sets the php class prefix which is prepended to all php generated classes - // from this .proto. Default is empty. - optional string php_class_prefix = 40; - - // Use this option to change the namespace of php generated classes. Default - // is empty. When this option is empty, the package name will be used for - // determining the namespace. - optional string php_namespace = 41; - - // Use this option to change the namespace of php generated metadata classes. - // Default is empty. When this option is empty, the proto file name will be - // used for determining the namespace. - optional string php_metadata_namespace = 44; - - // Use this option to change the package of ruby generated classes. Default - // is empty. When this option is not set, the package name will be used for - // determining the ruby package. - optional string ruby_package = 45; - - - // The parser stores options it doesn't recognize here. - // See the documentation for the "Options" section above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. - // See the documentation for the "Options" section above. - extensions 1000 to max; - - reserved 38; -} - -message MessageOptions { - // Set true to use the old proto1 MessageSet wire format for extensions. - // This is provided for backwards-compatibility with the MessageSet wire - // format. You should not use this for any other reason: It's less - // efficient, has fewer features, and is more complicated. - // - // The message must be defined exactly as follows: - // message Foo { - // option message_set_wire_format = true; - // extensions 4 to max; - // } - // Note that the message cannot have any defined fields; MessageSets only - // have extensions. - // - // All extensions of your type must be singular messages; e.g. they cannot - // be int32s, enums, or repeated messages. - // - // Because this is an option, the above two restrictions are not enforced by - // the protocol compiler. - optional bool message_set_wire_format = 1 [default = false]; - - // Disables the generation of the standard "descriptor()" accessor, which can - // conflict with a field of the same name. This is meant to make migration - // from proto1 easier; new code should avoid fields named "descriptor". - optional bool no_standard_descriptor_accessor = 2 [default = false]; - - // Is this message deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the message, or it will be completely ignored; in the very least, - // this is a formalization for deprecating messages. - optional bool deprecated = 3 [default = false]; - - // Whether the message is an automatically generated map entry type for the - // maps field. - // - // For maps fields: - // map map_field = 1; - // The parsed descriptor looks like: - // message MapFieldEntry { - // option map_entry = true; - // optional KeyType key = 1; - // optional ValueType value = 2; - // } - // repeated MapFieldEntry map_field = 1; - // - // Implementations may choose not to generate the map_entry=true message, but - // use a native map in the target language to hold the keys and values. - // The reflection APIs in such implementations still need to work as - // if the field is a repeated message field. - // - // NOTE: Do not set the option in .proto files. Always use the maps syntax - // instead. The option should only be implicitly set by the proto compiler - // parser. - optional bool map_entry = 7; - - reserved 8; // javalite_serializable - reserved 9; // javanano_as_lite - - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message FieldOptions { - // The ctype option instructs the C++ code generator to use a different - // representation of the field than it normally would. See the specific - // options below. This option is not yet implemented in the open source - // release -- sorry, we'll try to include it in a future version! - optional CType ctype = 1 [default = STRING]; - enum CType { - // Default mode. - STRING = 0; - - CORD = 1; - - STRING_PIECE = 2; - } - // The packed option can be enabled for repeated primitive fields to enable - // a more efficient representation on the wire. Rather than repeatedly - // writing the tag and type for each element, the entire array is encoded as - // a single length-delimited blob. In proto3, only explicit setting it to - // false will avoid using packed encoding. - optional bool packed = 2; - - // The jstype option determines the JavaScript type used for values of the - // field. The option is permitted only for 64 bit integral and fixed types - // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING - // is represented as JavaScript string, which avoids loss of precision that - // can happen when a large value is converted to a floating point JavaScript. - // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to - // use the JavaScript "number" type. The behavior of the default option - // JS_NORMAL is implementation dependent. - // - // This option is an enum to permit additional types to be added, e.g. - // goog.math.Integer. - optional JSType jstype = 6 [default = JS_NORMAL]; - enum JSType { - // Use the default type. - JS_NORMAL = 0; - - // Use JavaScript strings. - JS_STRING = 1; - - // Use JavaScript numbers. - JS_NUMBER = 2; - } - - // Should this field be parsed lazily? Lazy applies only to message-type - // fields. It means that when the outer message is initially parsed, the - // inner message's contents will not be parsed but instead stored in encoded - // form. The inner message will actually be parsed when it is first accessed. - // - // This is only a hint. Implementations are free to choose whether to use - // eager or lazy parsing regardless of the value of this option. However, - // setting this option true suggests that the protocol author believes that - // using lazy parsing on this field is worth the additional bookkeeping - // overhead typically needed to implement it. - // - // This option does not affect the public interface of any generated code; - // all method signatures remain the same. Furthermore, thread-safety of the - // interface is not affected by this option; const methods remain safe to - // call from multiple threads concurrently, while non-const methods continue - // to require exclusive access. - // - // - // Note that implementations may choose not to check required fields within - // a lazy sub-message. That is, calling IsInitialized() on the outer message - // may return true even if the inner message has missing required fields. - // This is necessary because otherwise the inner message would have to be - // parsed in order to perform the check, defeating the purpose of lazy - // parsing. An implementation which chooses not to check required fields - // must be consistent about it. That is, for any particular sub-message, the - // implementation must either *always* check its required fields, or *never* - // check its required fields, regardless of whether or not the message has - // been parsed. - optional bool lazy = 5 [default = false]; - - // Is this field deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for accessors, or it will be completely ignored; in the very least, this - // is a formalization for deprecating fields. - optional bool deprecated = 3 [default = false]; - - // For Google-internal migration only. Do not use. - optional bool weak = 10 [default = false]; - - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; - - reserved 4; // removed jtype -} - -message OneofOptions { - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumOptions { - - // Set this option to true to allow mapping different tag names to the same - // value. - optional bool allow_alias = 2; - - // Is this enum deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum, or it will be completely ignored; in the very least, this - // is a formalization for deprecating enums. - optional bool deprecated = 3 [default = false]; - - reserved 5; // javanano_as_lite - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message EnumValueOptions { - // Is this enum value deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the enum value, or it will be completely ignored; in the very least, - // this is a formalization for deprecating enum values. - optional bool deprecated = 1 [default = false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message ServiceOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this service deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the service, or it will be completely ignored; in the very least, - // this is a formalization for deprecating services. - optional bool deprecated = 33 [default = false]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - -message MethodOptions { - - // Note: Field numbers 1 through 32 are reserved for Google's internal RPC - // framework. We apologize for hoarding these numbers to ourselves, but - // we were already using them long before we decided to release Protocol - // Buffers. - - // Is this method deprecated? - // Depending on the target platform, this can emit Deprecated annotations - // for the method, or it will be completely ignored; in the very least, - // this is a formalization for deprecating methods. - optional bool deprecated = 33 [default = false]; - - // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, - // or neither? HTTP based RPC implementation may choose GET verb for safe - // methods, and PUT verb for idempotent methods instead of the default POST. - enum IdempotencyLevel { - IDEMPOTENCY_UNKNOWN = 0; - NO_SIDE_EFFECTS = 1; // implies idempotent - IDEMPOTENT = 2; // idempotent, but may have side effects - } - optional IdempotencyLevel idempotency_level = 34 - [default = IDEMPOTENCY_UNKNOWN]; - - // The parser stores options it doesn't recognize here. See above. - repeated UninterpretedOption uninterpreted_option = 999; - - // Clients can define custom options in extensions of this message. See above. - extensions 1000 to max; -} - - -// A message representing a option the parser does not recognize. This only -// appears in options protos created by the compiler::Parser class. -// DescriptorPool resolves these when building Descriptor objects. Therefore, -// options protos in descriptor objects (e.g. returned by Descriptor::options(), -// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions -// in them. -message UninterpretedOption { - // The name of the uninterpreted option. Each string represents a segment in - // a dot-separated name. is_extension is true iff a segment represents an - // extension (denoted with parentheses in options specs in .proto files). - // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents - // "foo.(bar.baz).qux". - message NamePart { - required string name_part = 1; - required bool is_extension = 2; - } - repeated NamePart name = 2; - - // The value of the uninterpreted option, in whatever type the tokenizer - // identified it as during parsing. Exactly one of these should be set. - optional string identifier_value = 3; - optional uint64 positive_int_value = 4; - optional int64 negative_int_value = 5; - optional double double_value = 6; - optional bytes string_value = 7; - optional string aggregate_value = 8; -} - -// =================================================================== -// Optional source code info - -// Encapsulates information about the original source file from which a -// FileDescriptorProto was generated. -message SourceCodeInfo { - // A Location identifies a piece of source code in a .proto file which - // corresponds to a particular definition. This information is intended - // to be useful to IDEs, code indexers, documentation generators, and similar - // tools. - // - // For example, say we have a file like: - // message Foo { - // optional string foo = 1; - // } - // Let's look at just the field definition: - // optional string foo = 1; - // ^ ^^ ^^ ^ ^^^ - // a bc de f ghi - // We have the following locations: - // span path represents - // [a,i) [ 4, 0, 2, 0 ] The whole field definition. - // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). - // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). - // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). - // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). - // - // Notes: - // - A location may refer to a repeated field itself (i.e. not to any - // particular index within it). This is used whenever a set of elements are - // logically enclosed in a single code segment. For example, an entire - // extend block (possibly containing multiple extension definitions) will - // have an outer location whose path refers to the "extensions" repeated - // field without an index. - // - Multiple locations may have the same path. This happens when a single - // logical declaration is spread out across multiple places. The most - // obvious example is the "extend" block again -- there may be multiple - // extend blocks in the same scope, each of which will have the same path. - // - A location's span is not always a subset of its parent's span. For - // example, the "extendee" of an extension declaration appears at the - // beginning of the "extend" block and is shared by all extensions within - // the block. - // - Just because a location's span is a subset of some other location's span - // does not mean that it is a descendant. For example, a "group" defines - // both a type and a field in a single declaration. Thus, the locations - // corresponding to the type and field and their components will overlap. - // - Code which tries to interpret locations should probably be designed to - // ignore those that it doesn't understand, as more types of locations could - // be recorded in the future. - repeated Location location = 1; - message Location { - // Identifies which part of the FileDescriptorProto was defined at this - // location. - // - // Each element is a field number or an index. They form a path from - // the root FileDescriptorProto to the place where the definition. For - // example, this path: - // [ 4, 3, 2, 7, 1 ] - // refers to: - // file.message_type(3) // 4, 3 - // .field(7) // 2, 7 - // .name() // 1 - // This is because FileDescriptorProto.message_type has field number 4: - // repeated DescriptorProto message_type = 4; - // and DescriptorProto.field has field number 2: - // repeated FieldDescriptorProto field = 2; - // and FieldDescriptorProto.name has field number 1: - // optional string name = 1; - // - // Thus, the above path gives the location of a field name. If we removed - // the last element: - // [ 4, 3, 2, 7 ] - // this path refers to the whole field declaration (from the beginning - // of the label to the terminating semicolon). - repeated int32 path = 1 [packed = true]; - - // Always has exactly three or four elements: start line, start column, - // end line (optional, otherwise assumed same as start line), end column. - // These are packed into a single field for efficiency. Note that line - // and column numbers are zero-based -- typically you will want to add - // 1 to each before displaying to a user. - repeated int32 span = 2 [packed = true]; - - // If this SourceCodeInfo represents a complete declaration, these are any - // comments appearing before and after the declaration which appear to be - // attached to the declaration. - // - // A series of line comments appearing on consecutive lines, with no other - // tokens appearing on those lines, will be treated as a single comment. - // - // leading_detached_comments will keep paragraphs of comments that appear - // before (but not connected to) the current element. Each paragraph, - // separated by empty lines, will be one comment element in the repeated - // field. - // - // Only the comment content is provided; comment markers (e.g. //) are - // stripped out. For block comments, leading whitespace and an asterisk - // will be stripped from the beginning of each line other than the first. - // Newlines are included in the output. - // - // Examples: - // - // optional int32 foo = 1; // Comment attached to foo. - // // Comment attached to bar. - // optional int32 bar = 2; - // - // optional string baz = 3; - // // Comment attached to baz. - // // Another line attached to baz. - // - // // Comment attached to qux. - // // - // // Another line attached to qux. - // optional double qux = 4; - // - // // Detached comment for corge. This is not leading or trailing comments - // // to qux or corge because there are blank lines separating it from - // // both. - // - // // Detached comment for corge paragraph 2. - // - // optional string corge = 5; - // /* Block comment attached - // * to corge. Leading asterisks - // * will be removed. */ - // /* Block comment attached to - // * grault. */ - // optional int32 grault = 6; - // - // // ignored detached comments. - optional string leading_comments = 3; - optional string trailing_comments = 4; - repeated string leading_detached_comments = 6; - } -} - -// Describes the relationship between generated code and its original source -// file. A GeneratedCodeInfo message is associated with only one generated -// source file, but may contain references to different source .proto files. -message GeneratedCodeInfo { - // An Annotation connects some span of text in generated code to an element - // of its generating .proto file. - repeated Annotation annotation = 1; - message Annotation { - // Identifies the element in the original source .proto file. This field - // is formatted the same as SourceCodeInfo.Location.path. - repeated int32 path = 1 [packed = true]; - - // Identifies the filesystem path to the original source .proto. - optional string source_file = 2; - - // Identifies the starting offset in bytes in the generated code - // that relates to the identified object. - optional int32 begin = 3; - - // Identifies the ending offset in bytes in the generated code that - // relates to the identified offset. The end offset should be one past - // the last relevant byte (so the length of the text = end - begin). - optional int32 end = 4; - } -} \ No newline at end of file From 49faac848687980971de3cffeb8f70158661e8e5 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Mon, 14 Sep 2026 18:29:32 +0000 Subject: [PATCH 05/14] libs.versions.toml/firebase-encoders-proto.gradle: upgrade `truth-proto-extension` to 1.4.5 (was 1.0) This fixes the following error: ``` java.lang.NoSuchMethodError: 'com.google.protobuf.Descriptors$FileDescriptor$Syntax ``` This build error is caused by Protocol Buffers Java 4.x (4.36.1) which introduced the Editions feature and eliminated the legacy method `Descriptors.FileDescriptor.getSyntax()` along with the inner enum `Descriptors.FileDescriptor.Syntax`. `truth-proto-extension:1.0` (compiled in 2019 against Protobuf 3.6.1) invokes `FileDescriptor.getSyntax() == Syntax.PROTO3` Because `protobuf-java:4.36.1` is on the test runtime classpath, the JVM cannot find `getSyntax()`, throwing `NoSuchMethodError`. --- encoders/firebase-encoders-proto/firebase-encoders-proto.gradle | 2 +- gradle/libs.versions.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/encoders/firebase-encoders-proto/firebase-encoders-proto.gradle b/encoders/firebase-encoders-proto/firebase-encoders-proto.gradle index 7fecc47b267..713ede8fd55 100644 --- a/encoders/firebase-encoders-proto/firebase-encoders-proto.gradle +++ b/encoders/firebase-encoders-proto/firebase-encoders-proto.gradle @@ -48,7 +48,7 @@ dependencies { testImplementation 'com.google.guava:guava:31.0-jre' testImplementation libs.protobuf.java.util testImplementation libs.truth - testImplementation 'com.google.truth.extensions:truth-proto-extension:1.0' + testImplementation libs.truth.proto.extension testImplementation 'junit:junit:4.13.1' } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 50e2d46202a..6465942a636 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,7 +75,7 @@ spotless = "7.0.4" symbolProcessingApi = "2.2.10-2.0.2" testServices = "1.6.0" truth = "1.4.5" -truthProtoExtension = "1.0" +truthProtoExtension = "1.4.5" wiremockStandalone = "3.13.2" [libraries] From 516f1f185a70a8b56a2ee23ec83345992235ae64 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Mon, 14 Sep 2026 19:45:18 +0000 Subject: [PATCH 06/14] ParsingTests.kt: change `GeneratedMessageV3` to `MessageOrBuilder` in `parse()` helper This fixes the following error: ``` Argument type mismatch: actual type is 'List', but 'List' was expected. ``` This build error is caused by Protocol Buffers Java 4.x (4.36.1) where generated Java message classes now extend `com.google.protobuf.GeneratedMessage` instead of the legacy `com.google.protobuf.GeneratedMessageV3`. Because generated message classes like `SimpleProto` no longer extend `GeneratedMessageV3`, Kotlin rejects passing `List` to a parameter typed as `List`. Changing the parameter type to `MessageOrBuilder` allows any Protobuf message or builder to be passed while providing access to `descriptorForType.fullName`. --- .../google/firebase/encoders/proto/codegen/ParsingTests.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt b/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt index db96acbe81d..5395a1c77ba 100644 --- a/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt +++ b/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt @@ -25,7 +25,7 @@ import com.google.firebase.testing.LinkedListProto import com.google.firebase.testing.SimpleProto import com.google.firebase.testing.Types import com.google.protobuf.Descriptors.FileDescriptor -import com.google.protobuf.GeneratedMessageV3 +import com.google.protobuf.MessageOrBuilder import com.google.protobuf.Timestamp import org.junit.Test import org.junit.runner.RunWith @@ -153,7 +153,7 @@ class ParsingTests { private fun parse( vararg files: FileDescriptor, - include: List = listOf() + include: List = listOf() ): List { return DefaultParser( CodeGenConfig.newBuilder() From 854af86b5a0ca07e0a8c11f16d9a61936cd180bc Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Mon, 14 Sep 2026 20:08:58 +0000 Subject: [PATCH 07/14] transport-backend-cct.gradle: use libs.truth.proto.extension (1.4.5) instead of hardcoded 1.0 This fixes the following error: ``` java.lang.NoSuchMethodError: 'com.google.protobuf.Descriptors$FileDescriptor$Syntax com.google.protobuf.Descriptors$FileDescriptor.getSyntax()' ``` This build error is caused by Protocol Buffers Java 4.x (4.36.1) which introduced the Editions feature and eliminated the legacy method `Descriptors.FileDescriptor.getSyntax()` along with the inner enum `Descriptors.FileDescriptor.Syntax`. `truth-proto-extension:1.0` (compiled in 2019 against Protobuf 3.6.1) invokes `FileDescriptor.getSyntax() == Syntax.PROTO3`. Because `protobuf-java:4.36.1` is on the test runtime classpath, the JVM cannot find `getSyntax()`, throwing `NoSuchMethodError`. Using `libs.truth.proto.extension` resolves to version 1.4.5, which is compatible with Protobuf 4.x and checks presence via `FieldDescriptor.hasPresence()`. --- transport/transport-backend-cct/transport-backend-cct.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transport/transport-backend-cct/transport-backend-cct.gradle b/transport/transport-backend-cct/transport-backend-cct.gradle index cdf2105f54c..9178bf037f1 100644 --- a/transport/transport-backend-cct/transport-backend-cct.gradle +++ b/transport/transport-backend-cct/transport-backend-cct.gradle @@ -76,7 +76,7 @@ dependencies { testImplementation 'com.github.tomakehurst:wiremock:3.0.1' testImplementation libs.protobuf.java.util testImplementation libs.truth - testImplementation 'com.google.truth.extensions:truth-proto-extension:1.0' + testImplementation libs.truth.proto.extension testImplementation 'junit:junit:4.13.1' testImplementation libs.robolectric From fcc4404697bc2e4a54369ea7a022bc564c1933c7 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Tue, 15 Sep 2026 15:16:10 +0000 Subject: [PATCH 08/14] changelog entries added --- firebase-dataconnect/CHANGELOG.md | 6 ++++++ firebase-firestore/CHANGELOG.md | 5 +++++ firebase-inappmessaging/CHANGELOG.md | 5 +++++ firebase-perf/CHANGELOG.md | 4 ++++ protolite-well-known-types/CHANGELOG.md | 8 ++++++++ 5 files changed, 28 insertions(+) diff --git a/firebase-dataconnect/CHANGELOG.md b/firebase-dataconnect/CHANGELOG.md index 5dc19e9b36d..f62760f5688 100644 --- a/firebase-dataconnect/CHANGELOG.md +++ b/firebase-dataconnect/CHANGELOG.md @@ -1,5 +1,11 @@ # Unreleased +- [changed] Updated gRPC to 1.84.0 (was 1.62.2), gRPC Kotlin to 1.5.0 (was 1.4.1), and + Protocol Buffers to 4.36.1 (was 3.25.5). This also pulls in updated transitive dependencies, + most notably Guava 33.6.0-android (was 32.1.3-android), Gson 2.14.0 (was 2.10.1), the Kotlin + standard library 2.2.20 (was 2.1.21), and Kotlin coroutines 1.10.2 (was 1.9.0). + ([#8580](https://github.com/firebase/firebase-android-sdk/pull/8580)) + # 17.4.0 - [changed] Add gRPC request header for platform name and SDK version diff --git a/firebase-firestore/CHANGELOG.md b/firebase-firestore/CHANGELOG.md index 7d5358af449..5aea7875130 100644 --- a/firebase-firestore/CHANGELOG.md +++ b/firebase-firestore/CHANGELOG.md @@ -1,5 +1,10 @@ # Unreleased +- [changed] Updated gRPC to 1.84.0 (was 1.62.2) and Protocol Buffers to 4.36.1 (was 3.25.5), + the latter transitively via `protolite-well-known-types`. This also pulls in updated gRPC + transitive dependencies, most notably Guava 33.6.0-android (was 32.1.3-android) and Gson + 2.14.0 (was 2.10.1). (#8580) + # 26.6.0 - [feature] Implemented support for retrieving documents up to 16MB over gRPC (#8363) diff --git a/firebase-inappmessaging/CHANGELOG.md b/firebase-inappmessaging/CHANGELOG.md index 860b375f496..9cb5486491b 100644 --- a/firebase-inappmessaging/CHANGELOG.md +++ b/firebase-inappmessaging/CHANGELOG.md @@ -1,5 +1,10 @@ # Unreleased +- [changed] Updated gRPC to 1.84.0 (was 1.62.2) and Protocol Buffers to 4.36.1 (was 3.25.5), + the latter transitively via `protolite-well-known-types`. This also pulls in updated gRPC + transitive dependencies, most notably Guava 33.6.0-android (was 32.1.3-android) and Gson + 2.14.0 (was 2.10.1). (#8580) + # 22.0.3 - [changed] Bumped internal dependencies. diff --git a/firebase-perf/CHANGELOG.md b/firebase-perf/CHANGELOG.md index a7fa37e9016..2ca0cc0051d 100644 --- a/firebase-perf/CHANGELOG.md +++ b/firebase-perf/CHANGELOG.md @@ -1,5 +1,9 @@ # Unreleased +- [changed] Updated Protocol Buffers to 4.36.1 (was 3.25.5). (#8580) +- [changed] Removed the unused dependency on `protolite-well-known-types`. It is no longer + included as a transitive dependency of this SDK. (#8580) + # 22.0.6 - [fixed] Fixed `_app_start` traces being suppressed on API 34+ devices for typical diff --git a/protolite-well-known-types/CHANGELOG.md b/protolite-well-known-types/CHANGELOG.md index d9668922a56..31833386f01 100644 --- a/protolite-well-known-types/CHANGELOG.md +++ b/protolite-well-known-types/CHANGELOG.md @@ -1,5 +1,13 @@ # Unreleased +- [changed] Updated Protocol Buffers to 4.36.1 (was 3.25.5) and Google Common Protos to 2.75.0 + (was 1.18.0). The Google Common Protos update adds generated classes for the + `com.google.apps.card.v1`, `com.google.cloud`, `com.google.cloud.location`, and + `com.google.shopping.type` packages. (#8580) +- [changed] Removed the vendored copy of `descriptor.proto`. The + `com.google.protobuf.DescriptorProtos` classes are no longer bundled in this library and are + instead provided by `protobuf-javalite` 4.36.1, which this library depends on. (#8580) + # 18.0.1 - [changed] Updated protobuf dependency to `3.25.5` to fix From 2f63d2b4c3105e049d1a452b54d94412c95bba5f Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Tue, 15 Sep 2026 15:17:41 +0000 Subject: [PATCH 09/14] GrpcUpgradeChangelogReview.md: added --- GrpcUpgradeChangelogReview.md | 125 ++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 GrpcUpgradeChangelogReview.md diff --git a/GrpcUpgradeChangelogReview.md b/GrpcUpgradeChangelogReview.md new file mode 100644 index 00000000000..544bbb4bf6c --- /dev/null +++ b/GrpcUpgradeChangelogReview.md @@ -0,0 +1,125 @@ +# gRPC Upgrade (#8580) — Changelog Accuracy Review + +Branch `GrpcUpgrade` @ `854af86b5`, forked from `main` @ `64737ca0d`. + +## What the branch actually changes + +Only 6 files change. All dependency changes flow through `gradle/libs.versions.toml`: + +| Catalog key | Before | After | +|---|---|---| +| `grpc` | 1.62.2 | **1.84.0** | +| `grpcKotlin` | 1.4.1 | **1.5.0** | +| `javalite` / `protobufjavautil` / `protoc` | 3.25.5 | **4.36.1** | +| `protoGoogleCommonProtos` | 1.18.0 | **2.75.0** | +| `truthProtoExtension` | 1.0 | **1.4.5** (test-only) | +| `protobufGradlePlugin` | 0.9.6 | 0.9.6 (bumped then reverted) | + +Plus three non-catalog changes: +- [firebase-perf.gradle](file:///usr/local/google/home/dconeybe/work/android/main/firebase-perf/firebase-perf.gradle) — removed `api project(":protolite-well-known-types")` +- `protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto` — deleted +- [ParsingTests.kt](file:///usr/local/google/home/dconeybe/work/android/main/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt) — test-only protobuf 4.x fix + +## Verdict per changelog + +| Module | Original entry | Verdict | +|---|---|---| +| `firebase-appdistribution-gradle` | "Updated gRPC dependencies to 1.84.0" | ❌ **Factually wrong** | +| `firebase-dataconnect` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Incomplete | +| `firebase-firestore` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | +| `firebase-inappmessaging` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | +| `firebase-perf` | protobuf 4.36.1 | ⚠️ Incomplete — missed a removal | +| `protolite-well-known-types` | protobuf 4.36.1 + common protos 2.75.0 | ⚠️ Incomplete | + +--- + +## 1. `firebase-appdistribution-gradle` — entry is wrong + +> [!CAUTION] +> This module is **not affected by this branch at all.** + +Its gRPC dependencies are hardcoded, not from the version catalog, and are untouched by this branch ([lines 233–238](file:///usr/local/google/home/dconeybe/work/android/main/firebase-appdistribution-gradle/firebase-appdistribution-gradle.gradle#L233-L238)): + +```groovy +// Pin versions of io.grpc:grpc-* libraries to avoid issues with AGP tasks +// https://github.com/firebase/firebase-android-sdk/issues/6634 +implementation("io.grpc:grpc-protobuf:1.69.1") +implementation("io.grpc:grpc-core:1.69.1") +implementation("io.grpc:grpc-stub:1.69.1") +implementation("io.grpc:grpc-netty:1.69.1") +``` + +The **only** version-catalog references in the entire file are `libs.junit` (3 occurrences, all test configurations). Nothing in this branch touches this module. Needs a decision — see the question at the end. + +## 2. `firebase-dataconnect` — missed gRPC Kotlin and its forced upgrades + +This is the only module using `grpc-kotlin-stub`, so the `grpcKotlin` 1.4.1 → 1.5.0 bump applies here and nowhere else. More importantly, `grpc-kotlin-stub:1.5.0` **forces upgrades of Kotlin libraries beyond what the repo pins**, confirmed on the resolved `releaseRuntimeClasspath`: + +``` ++--- io.grpc:grpc-kotlin-stub:1.5.0 ++--- org.jetbrains.kotlin:kotlin-stdlib:2.1.21 -> 2.2.20 ++--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.2 +``` + +> [!IMPORTANT] +> The repo pins Kotlin `2.1.21` and coroutines `1.9.0`, but Data Connect consumers will resolve stdlib **2.2.20** and coroutines **1.10.2**. That is a stdlib newer than the compiler building the SDK, and is exactly the kind of thing app developers hit as a version conflict. + +## 3. & 4. `firebase-firestore` / `firebase-inappmessaging` — accurate, but the protobuf path is indirect + +Neither module declares `protobuf-javalite` directly. It arrives two ways, and Gradle's conflict resolution picks the higher: + +``` ++--- com.google.protobuf:protobuf-javalite:3.25.9 -> 4.36.1 # from grpc-protobuf-lite:1.84.0 +\--- com.google.protobuf:protobuf-javalite:4.36.1 # from :protolite-well-known-types +``` + +So "Updated Protocol Buffers to 4.36.1" is true, but only *because* `protolite-well-known-types` wins over the 3.25.9 that gRPC 1.84.0 itself requests. Worth stating the path explicitly. + +Also unmentioned: gRPC 1.62.2 → 1.84.0 drags along several transitive bumps. + +| Transitive dep | 1.62.2 | 1.84.0 | +|---|---|---| +| `com.google.guava:guava` | 32.1.3-android | **33.6.0-android** | +| `com.google.code.gson:gson` | 2.10.1 | **2.14.0** | +| `io.perfmark:perfmark-api` | 0.26.0 | 0.27.0 | +| `error_prone_annotations` | 2.23.0 | 2.50.0 | +| `animal-sniffer-annotations` | 1.23 | 1.27 | +| `com.squareup.okio:okio` | 3.4.0 | 3.4.0 (unchanged) | + +Guava and Gson are the two that realistically cause app-side conflicts. + +## 5. `firebase-perf` — missed a removed dependency + +The entry only mentioned protobuf. But this branch also removed `api project(":protolite-well-known-types")`. Confirmed gone from the resolved runtime classpath: + +``` +##### firebase-perf ++--- com.google.protobuf:protobuf-javalite:4.36.1 +``` + +No `protolite-well-known-types` line. Since it was an `api` dependency, it was previously on the **compile** classpath of anything depending on `firebase-perf`. Dropping it is user-visible and belongs in the changelog. + +## 6. `protolite-well-known-types` — two undocumented content changes + +**a) Common Protos 1.18.0 → 2.75.0 grows the artifact.** 49 → 65 `.proto` files, adding four brand-new generated packages: + +- `com.google.apps.card.v1` +- `com.google.cloud` +- `com.google.cloud.location` +- `com.google.shopping.type` + +**b) The `descriptor.proto` deletion moves `DescriptorProtos` out of this AAR.** + +Verified that `protobuf-javalite:4.36.1` now bundles `com/google/protobuf/DescriptorProtos*.class`, and that neither Common Protos jar (1.18.0 or 2.75.0) ships any `google/protobuf/*.proto`. So after this change, protolite generates **no** `com.google.protobuf.*` classes at all. + +> [!WARNING] +> `protobuf-javalite` is declared as `implementation` in [protolite-well-known-types.gradle:75](file:///usr/local/google/home/dconeybe/work/android/main/protolite-well-known-types/protolite-well-known-types.gradle#L75), so it lands in the published POM at **runtime** scope. `DescriptorProtos` used to be compiled into the AAR itself and was therefore on consumers' **compile** classpath. It now resolves at runtime only. Any external consumer compiling against `com.google.protobuf.DescriptorProtos` via this library would break. Probably nobody does — but it is a real compile-classpath regression, not purely an internal cleanup. + +## Modules correctly left with no changelog entry + +Verified these consume changed catalog entries but ship nothing new: + +- `firebase-messaging`, `firebase-ml-modeldownloader`, `transport-runtime`, `transport-backend-cct` — use `libs.protoc` for codegen via the `protoc-gen-firebase-encoders` plugin; no protobuf runtime dependency is published. +- `encoders/firebase-encoders-proto`, `encoders/protoc-gen-firebase-encoders` — `truth-proto-extension` / `protobuf-java-util` changes are `testImplementation` only. +- `firebase-abt` (`grpc-testing`), `firebase-crashlytics` / `firebase-crashlytics-ndk` (`protobuf-java`) — test/androidTest only. +- `firebase-dataconnect:testutil` — not published. From 44273fbb685ce82f0a28ac1ab8181e4d35a4130f Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Tue, 15 Sep 2026 19:53:51 +0000 Subject: [PATCH 10/14] GrpcUpgradeChangelogReview.md: format --- GrpcUpgradeChangelogReview.md | 49 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/GrpcUpgradeChangelogReview.md b/GrpcUpgradeChangelogReview.md index 544bbb4bf6c..904ce7a6735 100644 --- a/GrpcUpgradeChangelogReview.md +++ b/GrpcUpgradeChangelogReview.md @@ -6,14 +6,14 @@ Branch `GrpcUpgrade` @ `854af86b5`, forked from `main` @ `64737ca0d`. Only 6 files change. All dependency changes flow through `gradle/libs.versions.toml`: -| Catalog key | Before | After | -|---|---|---| -| `grpc` | 1.62.2 | **1.84.0** | -| `grpcKotlin` | 1.4.1 | **1.5.0** | -| `javalite` / `protobufjavautil` / `protoc` | 3.25.5 | **4.36.1** | -| `protoGoogleCommonProtos` | 1.18.0 | **2.75.0** | -| `truthProtoExtension` | 1.0 | **1.4.5** (test-only) | -| `protobufGradlePlugin` | 0.9.6 | 0.9.6 (bumped then reverted) | +| Catalog key | Before | After | +|--------------------------------------------|--------|------------------------------| +| `grpc` | 1.62.2 | **1.84.0** | +| `grpcKotlin` | 1.4.1 | **1.5.0** | +| `javalite` / `protobufjavautil` / `protoc` | 3.25.5 | **4.36.1** | +| `protoGoogleCommonProtos` | 1.18.0 | **2.75.0** | +| `truthProtoExtension` | 1.0 | **1.4.5** (test-only) | +| `protobufGradlePlugin` | 0.9.6 | 0.9.6 (bumped then reverted) | Plus three non-catalog changes: - [firebase-perf.gradle](file:///usr/local/google/home/dconeybe/work/android/main/firebase-perf/firebase-perf.gradle) — removed `api project(":protolite-well-known-types")` @@ -22,14 +22,14 @@ Plus three non-catalog changes: ## Verdict per changelog -| Module | Original entry | Verdict | -|---|---|---| -| `firebase-appdistribution-gradle` | "Updated gRPC dependencies to 1.84.0" | ❌ **Factually wrong** | -| `firebase-dataconnect` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Incomplete | -| `firebase-firestore` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | -| `firebase-inappmessaging` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | -| `firebase-perf` | protobuf 4.36.1 | ⚠️ Incomplete — missed a removal | -| `protolite-well-known-types` | protobuf 4.36.1 + common protos 2.75.0 | ⚠️ Incomplete | +| Module | Original entry | Verdict | +|-----------------------------------|----------------------------------------|----------------------------------| +| `firebase-appdistribution-gradle` | "Updated gRPC dependencies to 1.84.0" | ❌ **Factually wrong** | +| `firebase-dataconnect` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Incomplete | +| `firebase-firestore` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | +| `firebase-inappmessaging` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | +| `firebase-perf` | protobuf 4.36.1 | ⚠️ Incomplete — missed a removal | +| `protolite-well-known-types` | protobuf 4.36.1 + common protos 2.75.0 | ⚠️ Incomplete | --- @@ -77,14 +77,14 @@ So "Updated Protocol Buffers to 4.36.1" is true, but only *because* `protolite-w Also unmentioned: gRPC 1.62.2 → 1.84.0 drags along several transitive bumps. -| Transitive dep | 1.62.2 | 1.84.0 | -|---|---|---| -| `com.google.guava:guava` | 32.1.3-android | **33.6.0-android** | -| `com.google.code.gson:gson` | 2.10.1 | **2.14.0** | -| `io.perfmark:perfmark-api` | 0.26.0 | 0.27.0 | -| `error_prone_annotations` | 2.23.0 | 2.50.0 | -| `animal-sniffer-annotations` | 1.23 | 1.27 | -| `com.squareup.okio:okio` | 3.4.0 | 3.4.0 (unchanged) | +| Transitive dep | 1.62.2 | 1.84.0 | +|------------------------------|----------------|--------------------| +| `com.google.guava:guava` | 32.1.3-android | **33.6.0-android** | +| `com.google.code.gson:gson` | 2.10.1 | **2.14.0** | +| `io.perfmark:perfmark-api` | 0.26.0 | 0.27.0 | +| `error_prone_annotations` | 2.23.0 | 2.50.0 | +| `animal-sniffer-annotations` | 1.23 | 1.27 | +| `com.squareup.okio:okio` | 3.4.0 | 3.4.0 (unchanged) | Guava and Gson are the two that realistically cause app-side conflicts. @@ -123,3 +123,4 @@ Verified these consume changed catalog entries but ship nothing new: - `encoders/firebase-encoders-proto`, `encoders/protoc-gen-firebase-encoders` — `truth-proto-extension` / `protobuf-java-util` changes are `testImplementation` only. - `firebase-abt` (`grpc-testing`), `firebase-crashlytics` / `firebase-crashlytics-ndk` (`protobuf-java`) — test/androidTest only. - `firebase-dataconnect:testutil` — not published. + From a9ff026dc6f33cd7e008aa74a8b47682a63ad1b0 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 16 Sep 2026 16:15:09 +0000 Subject: [PATCH 11/14] libs.versions.toml: downgrade grpcKotlin back to 1.4.3 to avoid pulling in kotlin-stdlib 2.20.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f2889a9c787..ced17f27c86 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,7 +35,7 @@ googleApiClient = "2.8.1" googleServices = "4.3.15" gradleErrorpronePlugin = "4.2.0" grpc = "1.84.0" -grpcKotlin = "1.5.0" +grpcKotlin = "1.4.3" # Do not upgrade to 1.5.0 until kotlin-stdlib is upgraded to 2.20.0 or greater hamcrest = "3.0" hamcrestLibrary = "3.0" httpclientAndroid = "4.3.5.1" From d4be9fc9dc1bdfa02b39843114a85af7b62eb2a0 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 16 Sep 2026 17:16:46 +0000 Subject: [PATCH 12/14] improve changelog entries and bump major versions --- firebase-firestore/CHANGELOG.md | 6 ++---- firebase-firestore/gradle.properties | 2 +- firebase-inappmessaging/CHANGELOG.md | 6 ++---- firebase-inappmessaging/gradle.properties | 2 +- firebase-perf/CHANGELOG.md | 2 +- firebase-perf/gradle.properties | 2 +- protolite-well-known-types/CHANGELOG.md | 10 ++++------ protolite-well-known-types/gradle.properties | 2 +- 8 files changed, 13 insertions(+), 19 deletions(-) diff --git a/firebase-firestore/CHANGELOG.md b/firebase-firestore/CHANGELOG.md index 5aea7875130..43a927837fd 100644 --- a/firebase-firestore/CHANGELOG.md +++ b/firebase-firestore/CHANGELOG.md @@ -1,9 +1,7 @@ # Unreleased -- [changed] Updated gRPC to 1.84.0 (was 1.62.2) and Protocol Buffers to 4.36.1 (was 3.25.5), - the latter transitively via `protolite-well-known-types`. This also pulls in updated gRPC - transitive dependencies, most notably Guava 33.6.0-android (was 32.1.3-android) and Gson - 2.14.0 (was 2.10.1). (#8580) +- [changed] Upgraded gRPC to 1.84.0 and Protocol Buffers to 4.36.1. + ([#8580](https://github.com/firebase/firebase-android-sdk/pull/8580)) # 26.6.0 diff --git a/firebase-firestore/gradle.properties b/firebase-firestore/gradle.properties index a65ca8d3183..73b26d5bdaf 100644 --- a/firebase-firestore/gradle.properties +++ b/firebase-firestore/gradle.properties @@ -1,2 +1,2 @@ -version=26.6.1 +version=27.0.0 latestReleasedVersion=26.6.0 diff --git a/firebase-inappmessaging/CHANGELOG.md b/firebase-inappmessaging/CHANGELOG.md index 9cb5486491b..0d2e36d104e 100644 --- a/firebase-inappmessaging/CHANGELOG.md +++ b/firebase-inappmessaging/CHANGELOG.md @@ -1,9 +1,7 @@ # Unreleased -- [changed] Updated gRPC to 1.84.0 (was 1.62.2) and Protocol Buffers to 4.36.1 (was 3.25.5), - the latter transitively via `protolite-well-known-types`. This also pulls in updated gRPC - transitive dependencies, most notably Guava 33.6.0-android (was 32.1.3-android) and Gson - 2.14.0 (was 2.10.1). (#8580) +- [changed] Upgraded gRPC to 1.84.0 and Protocol Buffers to 4.36.1. + ([#8580](https://github.com/firebase/firebase-android-sdk/pull/8580)) # 22.0.3 diff --git a/firebase-inappmessaging/gradle.properties b/firebase-inappmessaging/gradle.properties index 9dc13d46dd6..768d7039c8e 100644 --- a/firebase-inappmessaging/gradle.properties +++ b/firebase-inappmessaging/gradle.properties @@ -1,2 +1,2 @@ -version=22.0.4 +version=23.0.0 latestReleasedVersion=22.0.3 diff --git a/firebase-perf/CHANGELOG.md b/firebase-perf/CHANGELOG.md index 2ca0cc0051d..c8a528ded6e 100644 --- a/firebase-perf/CHANGELOG.md +++ b/firebase-perf/CHANGELOG.md @@ -1,6 +1,6 @@ # Unreleased -- [changed] Updated Protocol Buffers to 4.36.1 (was 3.25.5). (#8580) +- [changed] Updated Protocol Buffers to 4.36.1. (#8580) - [changed] Removed the unused dependency on `protolite-well-known-types`. It is no longer included as a transitive dependency of this SDK. (#8580) diff --git a/firebase-perf/gradle.properties b/firebase-perf/gradle.properties index 7d05fc1f3bf..c5b8538c237 100644 --- a/firebase-perf/gradle.properties +++ b/firebase-perf/gradle.properties @@ -15,7 +15,7 @@ # # -version=22.0.7 +version=23.0.0 latestReleasedVersion=22.0.6 android.enableUnitTestBinaryResources=true diff --git a/protolite-well-known-types/CHANGELOG.md b/protolite-well-known-types/CHANGELOG.md index 31833386f01..2c4c0a92329 100644 --- a/protolite-well-known-types/CHANGELOG.md +++ b/protolite-well-known-types/CHANGELOG.md @@ -1,12 +1,10 @@ # Unreleased -- [changed] Updated Protocol Buffers to 4.36.1 (was 3.25.5) and Google Common Protos to 2.75.0 - (was 1.18.0). The Google Common Protos update adds generated classes for the - `com.google.apps.card.v1`, `com.google.cloud`, `com.google.cloud.location`, and - `com.google.shopping.type` packages. (#8580) +- [changed] Upgraded Protocol Buffers to 4.36.1 and Google Common Protos to 2.75.0. + ([#8580](https://github.com/firebase/firebase-android-sdk/pull/8580)) - [changed] Removed the vendored copy of `descriptor.proto`. The - `com.google.protobuf.DescriptorProtos` classes are no longer bundled in this library and are - instead provided by `protobuf-javalite` 4.36.1, which this library depends on. (#8580) + `DescriptorProtos` classes are no longer bundled in this library and are + instead provided by `protobuf-javalite`. (#8580) # 18.0.1 diff --git a/protolite-well-known-types/gradle.properties b/protolite-well-known-types/gradle.properties index 9ac486d7a6f..2281441cab4 100644 --- a/protolite-well-known-types/gradle.properties +++ b/protolite-well-known-types/gradle.properties @@ -1,5 +1,5 @@ # IMPORTANT (b/285892320) Keep version and latestReleasedVersion in sync # unless you are releasing a new version of the library to prevent issues # with transitive dependencies. -version=18.0.1 +version=19.0.0 latestReleasedVersion=18.0.1 From d0083f07763bd56442ed627ecc53dc02e969007e Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Wed, 16 Sep 2026 18:20:59 +0000 Subject: [PATCH 13/14] firebase-perf/CHANGELOG.md: tersify --- firebase-perf/CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/firebase-perf/CHANGELOG.md b/firebase-perf/CHANGELOG.md index c8a528ded6e..dd0fe72cdaf 100644 --- a/firebase-perf/CHANGELOG.md +++ b/firebase-perf/CHANGELOG.md @@ -1,8 +1,7 @@ # Unreleased - [changed] Updated Protocol Buffers to 4.36.1. (#8580) -- [changed] Removed the unused dependency on `protolite-well-known-types`. It is no longer - included as a transitive dependency of this SDK. (#8580) +- [changed] Removed the unused dependency on `protolite-well-known-types`. (#8580) # 22.0.6 From 588a8f67cc71c240a3f04dfc11fa670a51e1bf34 Mon Sep 17 00:00:00 2001 From: Denver Coneybeare Date: Thu, 17 Sep 2026 15:14:40 +0000 Subject: [PATCH 14/14] delete temporary file: GrpcUpgradeChangelogReview.md --- GrpcUpgradeChangelogReview.md | 126 ---------------------------------- 1 file changed, 126 deletions(-) delete mode 100644 GrpcUpgradeChangelogReview.md diff --git a/GrpcUpgradeChangelogReview.md b/GrpcUpgradeChangelogReview.md deleted file mode 100644 index 904ce7a6735..00000000000 --- a/GrpcUpgradeChangelogReview.md +++ /dev/null @@ -1,126 +0,0 @@ -# gRPC Upgrade (#8580) — Changelog Accuracy Review - -Branch `GrpcUpgrade` @ `854af86b5`, forked from `main` @ `64737ca0d`. - -## What the branch actually changes - -Only 6 files change. All dependency changes flow through `gradle/libs.versions.toml`: - -| Catalog key | Before | After | -|--------------------------------------------|--------|------------------------------| -| `grpc` | 1.62.2 | **1.84.0** | -| `grpcKotlin` | 1.4.1 | **1.5.0** | -| `javalite` / `protobufjavautil` / `protoc` | 3.25.5 | **4.36.1** | -| `protoGoogleCommonProtos` | 1.18.0 | **2.75.0** | -| `truthProtoExtension` | 1.0 | **1.4.5** (test-only) | -| `protobufGradlePlugin` | 0.9.6 | 0.9.6 (bumped then reverted) | - -Plus three non-catalog changes: -- [firebase-perf.gradle](file:///usr/local/google/home/dconeybe/work/android/main/firebase-perf/firebase-perf.gradle) — removed `api project(":protolite-well-known-types")` -- `protolite-well-known-types/src/main/proto/google/protobuf/descriptor.proto` — deleted -- [ParsingTests.kt](file:///usr/local/google/home/dconeybe/work/android/main/encoders/protoc-gen-firebase-encoders/src/test/kotlin/com/google/firebase/encoders/proto/codegen/ParsingTests.kt) — test-only protobuf 4.x fix - -## Verdict per changelog - -| Module | Original entry | Verdict | -|-----------------------------------|----------------------------------------|----------------------------------| -| `firebase-appdistribution-gradle` | "Updated gRPC dependencies to 1.84.0" | ❌ **Factually wrong** | -| `firebase-dataconnect` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Incomplete | -| `firebase-firestore` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | -| `firebase-inappmessaging` | gRPC 1.84.0 + protobuf 4.36.1 | ⚠️ Correct but thin | -| `firebase-perf` | protobuf 4.36.1 | ⚠️ Incomplete — missed a removal | -| `protolite-well-known-types` | protobuf 4.36.1 + common protos 2.75.0 | ⚠️ Incomplete | - ---- - -## 1. `firebase-appdistribution-gradle` — entry is wrong - -> [!CAUTION] -> This module is **not affected by this branch at all.** - -Its gRPC dependencies are hardcoded, not from the version catalog, and are untouched by this branch ([lines 233–238](file:///usr/local/google/home/dconeybe/work/android/main/firebase-appdistribution-gradle/firebase-appdistribution-gradle.gradle#L233-L238)): - -```groovy -// Pin versions of io.grpc:grpc-* libraries to avoid issues with AGP tasks -// https://github.com/firebase/firebase-android-sdk/issues/6634 -implementation("io.grpc:grpc-protobuf:1.69.1") -implementation("io.grpc:grpc-core:1.69.1") -implementation("io.grpc:grpc-stub:1.69.1") -implementation("io.grpc:grpc-netty:1.69.1") -``` - -The **only** version-catalog references in the entire file are `libs.junit` (3 occurrences, all test configurations). Nothing in this branch touches this module. Needs a decision — see the question at the end. - -## 2. `firebase-dataconnect` — missed gRPC Kotlin and its forced upgrades - -This is the only module using `grpc-kotlin-stub`, so the `grpcKotlin` 1.4.1 → 1.5.0 bump applies here and nowhere else. More importantly, `grpc-kotlin-stub:1.5.0` **forces upgrades of Kotlin libraries beyond what the repo pins**, confirmed on the resolved `releaseRuntimeClasspath`: - -``` -+--- io.grpc:grpc-kotlin-stub:1.5.0 -+--- org.jetbrains.kotlin:kotlin-stdlib:2.1.21 -> 2.2.20 -+--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0 -> 1.10.2 -``` - -> [!IMPORTANT] -> The repo pins Kotlin `2.1.21` and coroutines `1.9.0`, but Data Connect consumers will resolve stdlib **2.2.20** and coroutines **1.10.2**. That is a stdlib newer than the compiler building the SDK, and is exactly the kind of thing app developers hit as a version conflict. - -## 3. & 4. `firebase-firestore` / `firebase-inappmessaging` — accurate, but the protobuf path is indirect - -Neither module declares `protobuf-javalite` directly. It arrives two ways, and Gradle's conflict resolution picks the higher: - -``` -+--- com.google.protobuf:protobuf-javalite:3.25.9 -> 4.36.1 # from grpc-protobuf-lite:1.84.0 -\--- com.google.protobuf:protobuf-javalite:4.36.1 # from :protolite-well-known-types -``` - -So "Updated Protocol Buffers to 4.36.1" is true, but only *because* `protolite-well-known-types` wins over the 3.25.9 that gRPC 1.84.0 itself requests. Worth stating the path explicitly. - -Also unmentioned: gRPC 1.62.2 → 1.84.0 drags along several transitive bumps. - -| Transitive dep | 1.62.2 | 1.84.0 | -|------------------------------|----------------|--------------------| -| `com.google.guava:guava` | 32.1.3-android | **33.6.0-android** | -| `com.google.code.gson:gson` | 2.10.1 | **2.14.0** | -| `io.perfmark:perfmark-api` | 0.26.0 | 0.27.0 | -| `error_prone_annotations` | 2.23.0 | 2.50.0 | -| `animal-sniffer-annotations` | 1.23 | 1.27 | -| `com.squareup.okio:okio` | 3.4.0 | 3.4.0 (unchanged) | - -Guava and Gson are the two that realistically cause app-side conflicts. - -## 5. `firebase-perf` — missed a removed dependency - -The entry only mentioned protobuf. But this branch also removed `api project(":protolite-well-known-types")`. Confirmed gone from the resolved runtime classpath: - -``` -##### firebase-perf -+--- com.google.protobuf:protobuf-javalite:4.36.1 -``` - -No `protolite-well-known-types` line. Since it was an `api` dependency, it was previously on the **compile** classpath of anything depending on `firebase-perf`. Dropping it is user-visible and belongs in the changelog. - -## 6. `protolite-well-known-types` — two undocumented content changes - -**a) Common Protos 1.18.0 → 2.75.0 grows the artifact.** 49 → 65 `.proto` files, adding four brand-new generated packages: - -- `com.google.apps.card.v1` -- `com.google.cloud` -- `com.google.cloud.location` -- `com.google.shopping.type` - -**b) The `descriptor.proto` deletion moves `DescriptorProtos` out of this AAR.** - -Verified that `protobuf-javalite:4.36.1` now bundles `com/google/protobuf/DescriptorProtos*.class`, and that neither Common Protos jar (1.18.0 or 2.75.0) ships any `google/protobuf/*.proto`. So after this change, protolite generates **no** `com.google.protobuf.*` classes at all. - -> [!WARNING] -> `protobuf-javalite` is declared as `implementation` in [protolite-well-known-types.gradle:75](file:///usr/local/google/home/dconeybe/work/android/main/protolite-well-known-types/protolite-well-known-types.gradle#L75), so it lands in the published POM at **runtime** scope. `DescriptorProtos` used to be compiled into the AAR itself and was therefore on consumers' **compile** classpath. It now resolves at runtime only. Any external consumer compiling against `com.google.protobuf.DescriptorProtos` via this library would break. Probably nobody does — but it is a real compile-classpath regression, not purely an internal cleanup. - -## Modules correctly left with no changelog entry - -Verified these consume changed catalog entries but ship nothing new: - -- `firebase-messaging`, `firebase-ml-modeldownloader`, `transport-runtime`, `transport-backend-cct` — use `libs.protoc` for codegen via the `protoc-gen-firebase-encoders` plugin; no protobuf runtime dependency is published. -- `encoders/firebase-encoders-proto`, `encoders/protoc-gen-firebase-encoders` — `truth-proto-extension` / `protobuf-java-util` changes are `testImplementation` only. -- `firebase-abt` (`grpc-testing`), `firebase-crashlytics` / `firebase-crashlytics-ndk` (`protobuf-java`) — test/androidTest only. -- `firebase-dataconnect:testutil` — not published. -