| /* | |
| * Copyright 2025 The Android Open Source Project | |
| * | |
| * 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. | |
| */ | |
| // *********************************************************************************** | |
| // MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE. | |
| // *********************************************************************************** | |
| package androidx.annotation.keep | |
| /** | |
| * Usage constraints for how a target is used and what must be kept. | |
| * | |
| * <p>Providing the constraints on how an item is being used allows shrinkers to optimize or remove | |
| * aspects of the item that do not change that usage constraint. | |
| * | |
| * <p>For example, invoking a method reflectively does not use any annotations on that method, and | |
| * it is safe to remove the annotations. However, it would not be safe to remove parameters from the | |
| * method. | |
| */ | |
| public enum class KeepConstraint { | |
| /** | |
| * Indicates that the target item is being looked up reflectively. | |
| * | |
| * <p>Looking up an item reflectively requires that it remains on its expected context, which | |
| * for a method or field means it must remain on its defining class. In other words, the item | |
| * cannot be removed or moved. | |
| * | |
| * <p>Note that looking up a member does not imply that the holder class of the member can be | |
| * looked up. If both the class and the member need to be looked, make sure to have a target for | |
| * both. | |
| * | |
| * <p>Note also that the item can be looked up within its context but no constraint is placed on | |
| * its name, accessibility or any other properties of the item. | |
| * | |
| * <p>If assumptions are being made about other aspects, additional constraints and targets | |
| * should be added to the keep annotation. | |
| */ | |
| LOOKUP, | |
| /** | |
| * Indicates that the name of the target item is being used. | |
| * | |
| * <p>This usage constraint is needed if the target is being looked up reflectively by using its | |
| * name. Setting it will prohibit renaming of the target item. | |
| * | |
| * <p>Note that preserving the name of a member does not imply that the holder class of the | |
| * member will preserve its qualified or simple name. If both the class and the member need to | |
| * preserve their names, make sure to have a target for both. | |
| * | |
| * <p>Note that preserving the name of a member does not preserve the types of its parameters or | |
| * its return type for methods or the type for fields. | |
| */ | |
| NAME, | |
| /** | |
| * Indicates that the visibility of the target must be at least as visible as declared. | |
| * | |
| * <p>Setting this constraint ensures that any (reflective) access to the target that is allowed | |
| * remains valid. In other words, a public class, field or method must remain public. For a | |
| * non-public target its visibility may be relaxed in the direction: {@code private -> | |
| * package-private -> protected -> public}. | |
| * | |
| * <p>Note that this constraint does not place any restrictions on any other accesses flags than | |
| * visibility. In particular, flags such a static, final and abstract may change. | |
| * | |
| * <p>Used together with {@link #VISIBILITY_RESTRICT} the visibility will remain invariant. | |
| */ | |
| VISIBILITY_RELAX, | |
| /** | |
| * Indicates that the visibility of the target must be at most as visible as declared. | |
| * | |
| * <p>Setting this constraint ensures that any (reflective) access to the target that would fail | |
| * will continue to fail. In other words, a private class, field or method must remain private. | |
| * Concretely the visibility of the target item may be restricted in the direction: {@code | |
| * public -> protected -> package-private -> private}. | |
| * | |
| * <p>Note that this constraint does not place any restrictions on any other accesses flags than | |
| * visibility. In particular, flags such a static, final and abstract may change. | |
| * | |
| * <p>Used together with {@link #VISIBILITY_RELAX} the visibility will remain invariant. | |
| */ | |
| VISIBILITY_RESTRICT, | |
| /** | |
| * Indicates that the visibility of the target must remain as declared. | |
| * | |
| * <p>Note that this constraint does not place any restrictions on any other accesses flags than | |
| * visibility. In particular, flags such a static, final and abstract may change. | |
| * | |
| * <p>This is equivalent to using both {@link #VISIBILITY_RELAX} and | |
| * {@link #VISIBILITY_RESTRICT}. | |
| */ | |
| VISIBILITY_INVARIANT, | |
| /** | |
| * Indicates that the class target is being instantiated reflectively. | |
| * | |
| * <p>This usage constraint is only valid on class targets. | |
| * | |
| * <p>Being instantiated prohibits reasoning about the class instances at compile time. In other | |
| * words, the compiler must assume the class to be possibly instantiated at all times. | |
| * | |
| * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain a | |
| * class. This constraint only implies that if the class is referenced in the program it may be | |
| * instantiated. | |
| */ | |
| CLASS_INSTANTIATE, | |
| /** | |
| * Indicates that the method target is being invoked reflectively. | |
| * | |
| * <p>This usage constraint is only valid on method targets. | |
| * | |
| * <p>To be invoked reflectively the method must retain the structure of the method. Thus, | |
| * unused arguments cannot be removed. However, it does not imply preserving the types of its | |
| * parameters or its return type. If the parameter types are being obtained reflectively then | |
| * those need a keep target independent of the method. | |
| * | |
| * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain a | |
| * method reference. This constraint only implies that if the method is referenced in the | |
| * program it may be reflectively invoked. | |
| */ | |
| METHOD_INVOKE, | |
| /** | |
| * Indicates that the field target is reflectively read from. | |
| * | |
| * <p>This usage constraint is only valid on field targets. | |
| * | |
| * <p>A field that has its value read from, requires that the field value must remain. Thus, if | |
| * field remains, its value cannot be replaced. It can still be removed in full, be inlined and | |
| * its value reasoned about at compile time. | |
| * | |
| * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain | |
| * access to the field. This constraint only implies that if a field is referenced then it may | |
| * be reflectively read. | |
| */ | |
| FIELD_GET, | |
| /** | |
| * Indicates that the field target is reflectively written to. | |
| * | |
| * <p>This usage constraint is only valid on field targets. | |
| * | |
| * <p>A field that has its value written to, requires that the field value must be treated as | |
| * unknown. | |
| * | |
| * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain | |
| * access to the field. This constraint only implies that if a field is referenced then it may | |
| * be reflectively written. | |
| */ | |
| FIELD_SET, | |
| /** | |
| * Indicates that the target method can be replaced by an alternative definition at runtime. | |
| * | |
| * <p>This usage constraint is only valid on method targets. | |
| * | |
| * <p>Replacing a method implies that the concrete implementation of the target cannot be known | |
| * at compile time. Thus, it cannot be moved or otherwise assumed to have particular properties. | |
| * Being able to replace the method still allows the compiler to fully remove it if it is | |
| * statically found to be unused. | |
| * | |
| * <p>Note also that no restriction is placed on the method name. To ensure the same name add | |
| * {@link #NAME} to the constraint set. | |
| */ | |
| METHOD_REPLACE, | |
| /** | |
| * Indicates that the target field can be replaced by an alternative definition at runtime. | |
| * | |
| * <p>This usage constraint is only valid on field targets. | |
| * | |
| * <p>Replacing a field implies that the concrete implementation of the target cannot be known | |
| * at compile time. Thus, it cannot be moved or otherwise assumed to have particular properties. | |
| * Being able to replace the method still allows the compiler to fully remove it if it is | |
| * statically found to be unused. | |
| * | |
| * <p>Note also that no restriction is placed on the field name. To ensure the same name add | |
| * {@link #NAME} to the constraint set. | |
| */ | |
| FIELD_REPLACE, | |
| /** | |
| * Indicates that the target item must never be inlined or merged. | |
| * | |
| * <p>This ensures that if the item is actually used in the program it will remain in some form. | |
| * For example, a method may still be renamed, but it will be present as a frame in stack traces | |
| * produced by the runtime (before potentially being retraced). For classes, they too may be | |
| * renamed, but will not have been merged with other classes or have their allocations fully | |
| * eliminated (aka class inlining). | |
| * | |
| * <p>For members this also ensures that the field value or method body cannot be reasoned about | |
| * outside the item itself. For example, a field value cannot be assumed to be a particular | |
| * value, and a method cannot be assumed to have particular properties for callers, such as | |
| * always throwing or a constant return value. | |
| */ | |
| NEVER_INLINE, | |
| /** | |
| * Indicates that the class hierarchy below the target class may be extended at runtime. | |
| * | |
| * <p>This ensures that new subtypes of the target class can later be linked and/or class loaded | |
| * at runtime. | |
| * | |
| * <p>This does not ensure that the class remains if it is otherwise dead code and can be fully | |
| * removed. | |
| * | |
| * <p>Note that this constraint does not ensure that particular methods remain on the target | |
| * class. If methods or fields of the target class are being targeted by a subclass that was | |
| * classloaded or linked later, then keep annotations are needed for those targets too. Such | |
| * non-visible uses requires the same annotations to preserve as for reflective uses. | |
| */ | |
| CLASS_OPEN_HIERARCHY, | |
| /** | |
| * Indicates that the target item must retain its generic signature if present. | |
| * | |
| * <p>This ensures that the generic signature remains, but does not prohibit rewriting of the | |
| * generic signature. For example, if a type present in the generic signature is renamed, the | |
| * generic signature will also be updated to now refer to the type by its renamed name. | |
| * | |
| * <p>Note that this constraint does not otherwise restrict what can be done to the target, such | |
| * as removing the target completely, inlining it, etc. | |
| */ | |
| GENERIC_SIGNATURE, | |
| } |