| // Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| syntax = "proto3"; | |
| package com.android.tools.r8.keepradius.proto; | |
| // Don't put all messages under the outer class. | |
| option java_multiple_files = true; | |
| // Camel-case the outer class name. | |
| option java_outer_classname = "KeepRadiusProtos"; | |
| // Java package consistent with R8 convention. | |
| option java_package = "com.android.tools.r8.keepradius.proto"; | |
| // Information about a single keep rule and its immediate keep radius. | |
| message KeepRuleKeepRadius { | |
| int32 id = 1; | |
| // Textual representation of the keep rule. | |
| string source = 2; | |
| // What this keep rule prohibits (e.g., optimization). | |
| // Id into KeepConstraints. | |
| int32 constraints_id = 3; | |
| // Where this rule comes from. | |
| TextFileOrigin origin = 4; | |
| // Keep radius information. | |
| KeepRadius keep_radius = 5; | |
| // Keep rule tags. | |
| repeated KeepRuleTag tags = 6; | |
| } | |
| enum KeepRuleTag { | |
| PACKAGE_WIDE = 0; | |
| } | |
| message KeepRadius { | |
| // Which rules subsume this rule. Note: This information could in principle | |
| // be computed offline using the kept_by info of Kept*Info. | |
| // Ids into KeepAnnotationKeepRadius and KeepRuleKeepRadius. | |
| repeated int32 subsumed_by = 1; | |
| // The immediate keep radius of this rule. | |
| // - Ids into KeptClassInfo. | |
| repeated int32 class_keep_radius = 2; | |
| // - Ids into KeptFieldInfo. | |
| repeated int32 field_keep_radius = 3; | |
| // - Ids into KeptMethodInfo. | |
| repeated int32 method_keep_radius = 4; | |
| } | |
| // The ids of GlobalKeepRuleKeepRadius and KeepRuleKeepRadius are | |
| // non-overlapping by design, so that a single int32 id can be used to | |
| // unambiguously reference a GlobalKeepRuleKeepRadius or KeepRuleKeepRadius. | |
| message GlobalKeepRuleKeepRadius { | |
| int32 id = 1; | |
| // Textual representation of the keep rule. | |
| string source = 2; | |
| // Where this rule comes from. | |
| TextFileOrigin origin = 3; | |
| } | |
| // Information about the constraints of a single keep annotation or rule, | |
| // i.e., what is prohibited by it. | |
| // | |
| // This is encoded as a message to support keep constraints that cannot be | |
| // encoded as a bit in the future. | |
| message KeepConstraints { | |
| int32 id = 1; | |
| repeated KeepConstraint constraints = 2; | |
| } | |
| enum KeepConstraint { | |
| DONT_OBFUSCATE = 0; | |
| DONT_OPTIMIZE = 1; | |
| DONT_SHRINK = 2; | |
| } | |
| // Information about a class in the app/library and which keep rules that | |
| // keep it. | |
| message KeptClassInfo { | |
| int32 id = 1; | |
| // Id into TypeReference. | |
| int32 class_reference_id = 2; | |
| // Id into FileOrigin or ClassFileInJarOrigin. | |
| int32 file_origin_id = 3; | |
| // Ids into KeepRuleKeepRadius, telling which rules keep this class. | |
| // Allows reasoning about properties such as: | |
| // - Which keep rules are fully subsumed by other keep rules? | |
| // - Which keep rules keep the most classes/fields/methods | |
| // not kept by rules? | |
| repeated int32 kept_by = 4; | |
| } | |
| message KeptFieldInfo { | |
| int32 id = 1; | |
| // Id into FieldReference. | |
| int32 field_reference_id = 2; | |
| // Id into FileOrigin or ClassFileInJarOrigin. | |
| int32 file_origin_id = 3; | |
| // Ids into KeepRuleKeepRadius, telling which rules keep this field. | |
| repeated int32 kept_by = 4; | |
| } | |
| message KeptMethodInfo { | |
| int32 id = 1; | |
| // Id into MethodReference. | |
| int32 method_reference_id = 2; | |
| // Id into FileOrigin or ClassFileInJarOrigin. | |
| int32 file_origin_id = 3; | |
| // Ids into KeepRuleKeepRadius, telling which rules keep this method. | |
| repeated int32 kept_by = 4; | |
| } | |
| // References: | |
| message FieldReference { | |
| int32 id = 1; | |
| // The class on which the field is declared. | |
| // Id into TypeReference. | |
| int32 class_reference_id = 2; | |
| // The type of the field. | |
| // Id into type reference. | |
| int32 type_reference_id = 3; | |
| // The name of the field. | |
| string name = 4; | |
| } | |
| message MethodReference { | |
| int32 id = 1; | |
| // The class on which the method is declared. | |
| // Id into TypeReference. | |
| int32 class_reference_id = 2; | |
| // The proto (return type, parameter types) of the method. | |
| // Id into ProtoReference. | |
| int32 proto_reference_id = 3; | |
| // The name of the method. | |
| string name = 4; | |
| } | |
| message ProtoReference { | |
| int32 id = 1; | |
| // Id into TypeReferenceList. | |
| int32 parameters_id = 2; | |
| // Id into TypeReference. | |
| int32 return_type_id = 3; | |
| } | |
| message TypeReference { | |
| int32 id = 1; | |
| // The descriptor, e.g., | |
| // - Z | |
| // - Ljava/lang/Object; | |
| // - [[Ljava/lang/Object; | |
| string java_descriptor = 2; | |
| } | |
| message TypeReferenceList { | |
| int32 id = 1; | |
| repeated int32 type_reference_ids = 2; | |
| } | |
| // Origins: | |
| message FileOrigin { | |
| int32 id = 1; | |
| string filename = 2; | |
| MavenCoordinate maven_coordinate = 3; | |
| bool provided_by_build_system = 4; | |
| } | |
| // The ids of ClassFileInJarOrigin and FileOrigin are non-overlapping | |
| // by design, so that a single int32 id can be used to | |
| // unambiguously reference a ClassFileInJarOrigin or FileOrigin. | |
| message ClassFileInJarOrigin { | |
| int32 id = 1; | |
| int32 file_origin_id = 2; | |
| string entry = 3; | |
| } | |
| // Intentionally doesn't declare an id since each keep rule has its own | |
| // TextFileOrigin, i.e., there is no sharing of TextFileOrigin. | |
| message TextFileOrigin { | |
| // Id into FileOrigin | |
| int32 file_origin_id = 1; | |
| int32 line_number = 2; | |
| int32 column_number = 3; | |
| } | |
| message MavenCoordinate { | |
| int32 id = 1; | |
| string group_id = 2; | |
| string artifact_id = 3; | |
| string version = 4; | |
| } | |
| message BuildInfo { | |
| int32 class_count = 1; | |
| int32 field_count = 2; | |
| int32 method_count = 3; | |
| int32 live_class_count = 4; | |
| int32 live_field_count = 5; | |
| int32 live_method_count = 6; | |
| } | |
| // Container. | |
| message KeepRadiusContainer { | |
| // Origins. | |
| repeated FileOrigin file_origin_table = 1; | |
| repeated ClassFileInJarOrigin class_file_in_jar_origin_table = 2; | |
| repeated MavenCoordinate maven_coordinate_table = 3; | |
| // References. | |
| repeated FieldReference field_reference_table = 4; | |
| repeated MethodReference method_reference_table = 5; | |
| repeated ProtoReference proto_reference_table = 6; | |
| repeated TypeReference type_reference_table = 7; | |
| repeated TypeReferenceList type_reference_list_table = 8; | |
| // Kept items. | |
| repeated KeptClassInfo kept_class_info_table = 9; | |
| repeated KeptFieldInfo kept_field_info_table = 10; | |
| repeated KeptMethodInfo kept_method_info_table = 11; | |
| // Keep specifications. | |
| repeated KeepConstraints keep_constraints_table = 12; | |
| repeated KeepRuleKeepRadius keep_rule_keep_radius_table = 13; | |
| repeated GlobalKeepRuleKeepRadius global_keep_rule_keep_radius_table = 14; | |
| // Build info. | |
| BuildInfo build_info = 15; | |
| string title = 16; | |
| } |