platform_build/core/proguard_basic_keeps.flags
Jared Duke dd1fd79728 Ensure line numbers are preserved in default Proguard config
Explicitly keep the `LineNumberTable,SourceFile` attributes, ensuring
positional information is preserved for stack traces. While this isn't
required in R8's Proguard compat mode (still the default in soong), it
is needed for R8's full mode or when optimizations are enabled.

Bug: 215530220
Test: m
Change-Id: If1994e92f694c1a82317d79267714ad8114f3d99
2022-10-13 16:31:45 -07:00

100 lines
4.3 KiB
Text

# Some classes in the libraries extend package private classes to chare common functionality
# that isn't explicitly part of the API
-dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers
# Preserve line number information for debugging stack traces.
-keepattributes SourceFile,LineNumberTable
# Annotations are implemented as attributes, so we have to explicitly keep them.
# Keep all runtime-visible annotations like RuntimeVisibleParameterAnnotations
# and RuntimeVisibleTypeAnnotations, as well as associated defaults.
-keepattributes RuntimeVisible*Annotation*,AnnotationDefault
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# class$ methods are inserted by some compilers to implement .class construct,
# see http://proguard.sourceforge.net/manual/examples.html#library
-keepclassmembernames class * {
java.lang.Class class$(java.lang.String);
java.lang.Class class$(java.lang.String, boolean);
}
# Keep serializable classes and necessary members for serializable classes
# Copied from the ProGuard manual at http://proguard.sourceforge.net.
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Keep Throwable's constructor that takes a String argument.
-keepclassmembers class * extends java.lang.Throwable {
<init>(java.lang.String);
}
# Please specify classes to be kept explicitly in your package's configuration.
# -keep class * extends android.app.Activity
# -keep class * extends android.view.View
# -keep class * extends android.app.Service
# -keep class * extends android.content.BroadcastReceiver
# -keep class * extends android.content.ContentProvider
# -keep class * extends android.preference.Preference
# -keep class * extends android.app.BackupAgent
# Parcelable CREATORs must be kept for Parcelable functionality
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
# See proguard-android.txt in the SDK package.
#
# DO NOT USE THIS: We figured it's dangerous to blindly ignore all support library warnings.
# ProGuard may strip members of subclass of unknown super classes, in case an app is linking against
# LOCAL_SDK_VERSION lower than the support library's LOCAL_SDK_VERSION.
# See bug/20658265.
# -dontwarn android.support.**
# From https://github.com/google/guava/wiki/UsingProGuardWithGuava
# Striped64, LittleEndianByteArray, UnsignedBytes, AbstractFuture
-dontwarn sun.misc.Unsafe
# Futures.getChecked (which often won't work with Proguard anyway) uses this. It
# has a fallback, but again, don't use Futures.getChecked on Android regardless.
-dontwarn java.lang.ClassValue
# Ignore missing annotation references for various support libraries.
# While this is not ideal, it should be relatively safe given that
# 1) runtime-visible annotations will still be kept, and 2) compile-time
# annotations are stripped by R8 anyway.
# Note: The ** prefix is used to accommodate jarjar repackaging.
# TODO(b/242088131): Remove these exemptions after resolving transitive libs
# dependencies that are provided to R8.
-dontwarn **android**.annotation*.**
-dontwarn **com.google.errorprone.annotations.**
-dontwarn javax.annotation.**
-dontwarn org.checkerframework.**
-dontwarn org.jetbrains.annotations.**
# Less spammy.
-dontnote
# The lite proto runtime uses reflection to access fields based on the names in
# the schema, keep all the fields. Wildcard is used to apply the rule to classes
# that have been renamed with jarjar.
-keepclassmembers class * extends **.protobuf.MessageLite { <fields>; }