Set up Proguard rules for the Car App Library to better apply per annotation interface rather than manual declarations that can create issues.

Test: Manual
Change-Id: I237b1f3d736caaa041678877cc11ccf755666357
diff --git a/car/app/app-automotive/build.gradle b/car/app/app-automotive/build.gradle
index bac38c9..b66fba7 100644
--- a/car/app/app-automotive/build.gradle
+++ b/car/app/app-automotive/build.gradle
@@ -55,10 +55,6 @@
     defaultConfig {
         minSdkVersion 29
     }
-    lintOptions {
-        // We rely on keeping a bunch of private variables in the library for serialization.
-        disable("BanKeepAnnotation")
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/car/app/app-automotive/proguard-rules.pro b/car/app/app-automotive/proguard-rules.pro
index 462529f..4ed66b3 100644
--- a/car/app/app-automotive/proguard-rules.pro
+++ b/car/app/app-automotive/proguard-rules.pro
@@ -7,7 +7,10 @@
 
 # Keep all IInterfaces which are needed for host communications.
 -keep class androidx.car.app.** extends android.os.IInterface { *; }
-
 # Don't obfuscate classes instantiated from outside the library via reflection
 -keep public class androidx.car.app.activity.** extends androidx.car.app.managers.Manager { *; }
 -keep public class androidx.car.app.hardware.AutomotiveCarHardwareManager { *; }
+# Keep all private final fields from a class.
+-keepclasseswithmembers @androidx.car.app.annotations.KeepFields class * {
+  *;
+}
\ No newline at end of file
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
index e92c665..a377cb9 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/LegacySurfacePackage.java
@@ -22,9 +22,9 @@
 import android.view.KeyEvent;
 import android.view.MotionEvent;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.serialization.Bundleable;
 import androidx.car.app.serialization.BundlerException;
 
@@ -35,8 +35,8 @@
  * This class exists for compatibility with Q devices. In Android R and later,
  * {@link android.view.SurfaceControlViewHost.SurfacePackage} will be used instead.
  */
+@KeepFields
 public final class LegacySurfacePackage {
-    @Keep
     @Nullable
     private ISurfaceControl mISurfaceControl;
 
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
index 8d2ddee..ce2ffdf 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/activity/renderer/surface/SurfaceWrapper.java
@@ -23,28 +23,23 @@
 import android.view.SurfaceView;
 
 import androidx.annotation.Dimension;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * A class holding the information needed to render the content on a surface.
  */
+@KeepFields
 public final class SurfaceWrapper {
-    @Keep
     @Nullable
     private IBinder mHostToken;
-    @Keep
     @Dimension
     private int mWidth;
-    @Keep
     @Dimension
     private int mHeight;
-    @Keep
     private int mDisplayId;
-    @Keep
     private int mDensityDpi;
-    @Keep
     @Nullable
     private Surface mSurface;
 
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java b/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
index f22d30f..13e76e6 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
@@ -24,12 +24,12 @@
 import android.media.AudioRecord;
 import android.media.MediaRecorder;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * A {@link CarAudioRecord} for automotive OS.
@@ -37,7 +37,7 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP)
-@Keep
+@KeepFields
 @CarProtocol
 public class AutomotiveCarAudioRecord extends CarAudioRecord {
     /**
diff --git a/car/app/app-projected/build.gradle b/car/app/app-projected/build.gradle
index 6ebd606a..219e963 100644
--- a/car/app/app-projected/build.gradle
+++ b/car/app/app-projected/build.gradle
@@ -43,10 +43,6 @@
         multiDexEnabled = true
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
-    lintOptions {
-        // We rely on keeping a bunch of private variables in the library for serialization.
-        disable("BanKeepAnnotation")
-    }
     buildFeatures {
         aidl = true
     }
diff --git a/car/app/app-projected/proguard-rules.pro b/car/app/app-projected/proguard-rules.pro
index ac3430f..61a5d822 100644
--- a/car/app/app-projected/proguard-rules.pro
+++ b/car/app/app-projected/proguard-rules.pro
@@ -10,3 +10,6 @@
 
 # Don't obfuscate classes instantiated from outside the library via reflection
 -keep public class androidx.car.app.hardware.ProjectedCarHardwareManager { *; }
+-keepclasseswithmembers @androidx.car.app.annotations.KeepFields class * {
+  *;
+}
\ No newline at end of file
diff --git a/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java b/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
index b55a5c2..9394708 100644
--- a/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
+++ b/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
@@ -30,6 +30,7 @@
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -40,7 +41,7 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP)
-@Keep
+@KeepFields
 @CarProtocol
 public class ProjectedCarAudioRecord extends CarAudioRecord {
     @Nullable
diff --git a/car/app/app/api/current.txt b/car/app/app/api/current.txt
index 0497df5..065ecce 100644
--- a/car/app/app/api/current.txt
+++ b/car/app/app/api/current.txt
@@ -634,7 +634,7 @@
     method public double getLongitude();
   }
 
-  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+  @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
     ctor public CarSpan();
     method public void updateDrawState(android.text.TextPaint);
   }
diff --git a/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt b/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
index 8157779..39d9918 100644
--- a/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
@@ -1,7 +1,7 @@
 // Signature format: 4.0
 package androidx.car.app {
 
-  @androidx.car.app.annotations.CarProtocol public final class AppInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class AppInfo {
     ctor @VisibleForTesting public AppInfo(int, int, String);
     method public int getLatestCarAppApiLevel();
     method public String getLibraryDisplayVersion();
@@ -84,7 +84,7 @@
     field public static final int LENGTH_SHORT = 0; // 0x0
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class FailureResponse {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class FailureResponse {
     ctor public FailureResponse(Throwable);
     method public int getErrorType();
     method public String getStackTrace();
@@ -97,7 +97,7 @@
     field public static final int UNKNOWN_ERROR = 0; // 0x0
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class HandshakeInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class HandshakeInfo {
     ctor public HandshakeInfo(String, int);
     method public int getHostCarAppApiLevel();
     method public String getHostPackageName();
@@ -161,7 +161,7 @@
     method public void onNewIntent(android.content.Intent);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(6) public class SessionInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(6) public class SessionInfo {
     ctor public SessionInfo(int, String);
     method public int getDisplayType();
     method public String getSessionId();
@@ -188,7 +188,7 @@
     method public default void onVisibleAreaChanged(android.graphics.Rect);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class SurfaceContainer {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class SurfaceContainer {
     ctor public SurfaceContainer(android.view.Surface?, int, int, int);
     method public int getDpi();
     method public int getHeight();
@@ -206,6 +206,9 @@
   @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface ExperimentalCarApi {
   }
 
+  @androidx.car.app.annotations.ExperimentalCarApi @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface KeepFields {
+  }
+
   @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface RequiresCarApi {
     method public abstract int value();
   }
@@ -282,7 +285,7 @@
     method public void unregisterClimateStateCallback(androidx.car.app.hardware.climate.CarClimateStateCallback);
   }
 
-  @MainThread @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class CarClimateFeature {
+  @MainThread @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class CarClimateFeature {
     method public java.util.List<androidx.car.app.hardware.common.CarZone!> getCarZones();
     method public int getFeature();
   }
@@ -575,7 +578,7 @@
     field @androidx.car.app.annotations.ExperimentalCarApi public static final int US_GALLON = 203; // 0xcb
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class CarValue<T> {
     ctor public CarValue(T?, long, int);
     ctor @androidx.car.app.annotations.ExperimentalCarApi public CarValue(T?, long, int, java.util.List<androidx.car.app.hardware.common.CarZone!>);
     method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<androidx.car.app.hardware.common.CarZone!> getCarZones();
@@ -588,7 +591,7 @@
     field public static final int STATUS_UNKNOWN = 0; // 0x0
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(5) public final class CarZone {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class CarZone {
     method public int getColumn();
     method public int getRow();
     field public static final int CAR_ZONE_COLUMN_ALL = 16; // 0x10
@@ -620,12 +623,12 @@
 
 package androidx.car.app.hardware.info {
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Accelerometer {
     ctor public Accelerometer(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
     method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getForces();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class CarHardwareLocation {
     ctor public CarHardwareLocation(androidx.car.app.hardware.common.CarValue<android.location.Location!>);
     method public androidx.car.app.hardware.common.CarValue<android.location.Location!> getLocation();
   }
@@ -659,12 +662,12 @@
     field public static final int UPDATE_RATE_UI = 2; // 0x2
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Compass {
     ctor public Compass(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
     method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getOrientations();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyLevel {
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getBatteryPercent();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEnergyIsLow();
@@ -684,7 +687,7 @@
     method public androidx.car.app.hardware.info.EnergyLevel.Builder setRangeRemainingMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class EnergyProfile {
     method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getEvConnectorTypes();
     method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!> getFuelTypes();
     field public static final int EVCONNECTOR_TYPE_CHADEMO = 3; // 0x3
@@ -722,7 +725,7 @@
     method public androidx.car.app.hardware.info.EnergyProfile.Builder setFuelTypes(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Integer!>!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi public class EvStatus {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields public class EvStatus {
     method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEvChargePortConnected();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Boolean!> getEvChargePortOpen();
   }
@@ -734,12 +737,12 @@
     method public androidx.car.app.hardware.info.EvStatus.Builder setEvChargePortOpen(androidx.car.app.hardware.common.CarValue<java.lang.Boolean!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Gyroscope {
     ctor public Gyroscope(androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!>);
     method public androidx.car.app.hardware.common.CarValue<java.util.List<java.lang.Float!>!> getRotations();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Mileage {
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getDistanceDisplayUnit();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getOdometerMeters();
   }
@@ -751,7 +754,7 @@
     method public androidx.car.app.hardware.info.Mileage.Builder setOdometerMeters(androidx.car.app.hardware.common.CarValue<java.lang.Float!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Model {
     method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getManufacturer();
     method public androidx.car.app.hardware.common.CarValue<java.lang.String!> getName();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getYear();
@@ -765,7 +768,7 @@
     method public androidx.car.app.hardware.info.Model.Builder setYear(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class Speed {
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getDisplaySpeedMetersPerSecond();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Float!> getRawSpeedMetersPerSecond();
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getSpeedDisplayUnit();
@@ -779,7 +782,7 @@
     method public androidx.car.app.hardware.info.Speed.Builder setSpeedDisplayUnit(androidx.car.app.hardware.common.CarValue<java.lang.Integer!>);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(3) public final class TollCard {
     method public androidx.car.app.hardware.common.CarValue<java.lang.Integer!> getCardState();
     field public static final int TOLLCARD_STATE_INVALID = 2; // 0x2
     field public static final int TOLLCARD_STATE_NOT_INSERTED = 3; // 0x3
@@ -808,7 +811,7 @@
     method public void onStopRecording();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public class CarAudioCallbackDelegate {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public class CarAudioCallbackDelegate {
     method public void onStopRecording();
   }
 
@@ -822,7 +825,7 @@
     field public static final int AUDIO_CONTENT_SAMPLING_RATE = 16000; // 0x3e80
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneRequest {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneRequest {
     method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallbackDelegate();
   }
 
@@ -831,7 +834,7 @@
     method public androidx.car.app.media.OpenMicrophoneRequest build();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneResponse {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class OpenMicrophoneResponse {
     method public androidx.car.app.media.CarAudioCallbackDelegate getCarAudioCallback();
     method public java.io.InputStream getCarMicrophoneInputStream();
   }
@@ -854,7 +857,7 @@
 
 package androidx.car.app.messaging.model {
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class CarMessage {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(6) public class CarMessage {
     method public androidx.car.app.model.CarText getBody();
     method public long getReceivedTimeEpochMillis();
     method public androidx.core.app.Person getSender();
@@ -892,7 +895,7 @@
 
 package androidx.car.app.model {
 
-  @androidx.car.app.annotations.CarProtocol public final class Action {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Action {
     method public androidx.car.app.model.CarColor? getBackgroundColor();
     method @androidx.car.app.annotations.RequiresCarApi(4) public int getFlags();
     method public androidx.car.app.model.CarIcon? getIcon();
@@ -927,7 +930,7 @@
     method public androidx.car.app.model.Action.Builder setTitle(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class ActionStrip {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class ActionStrip {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.Action? getFirstActionOfType(int);
   }
@@ -938,7 +941,7 @@
     method public androidx.car.app.model.ActionStrip build();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Alert {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class Alert {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.AlertCallbackDelegate? getCallbackDelegate();
     method public long getDurationMillis();
@@ -970,7 +973,7 @@
     method public void sendDismiss(androidx.car.app.OnDoneCallback);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class CarColor {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class CarColor {
     method public static androidx.car.app.model.CarColor createCustom(@ColorInt int, @ColorInt int);
     method @ColorInt public int getColor();
     method @ColorInt public int getColorDark();
@@ -992,7 +995,7 @@
     field public static final androidx.car.app.model.CarColor YELLOW;
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class CarIcon {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class CarIcon {
     method public androidx.core.graphics.drawable.IconCompat? getIcon();
     method public androidx.car.app.model.CarColor? getTint();
     method public int getType();
@@ -1016,7 +1019,7 @@
     method public androidx.car.app.model.CarIcon.Builder setTint(androidx.car.app.model.CarColor);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class CarIconSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class CarIconSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon);
     method public static androidx.car.app.model.CarIconSpan create(androidx.car.app.model.CarIcon, int);
     method public int getAlignment();
@@ -1026,7 +1029,7 @@
     field public static final int ALIGN_CENTER = 2; // 0x2
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class CarLocation {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class CarLocation {
     method public static androidx.car.app.model.CarLocation create(double, double);
     method public static androidx.car.app.model.CarLocation create(android.location.Location);
     method public double getLatitude();
@@ -1038,7 +1041,7 @@
     method public void updateDrawState(android.text.TextPaint);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class CarText {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class CarText {
     method public static androidx.car.app.model.CarText create(CharSequence);
     method public java.util.List<java.lang.CharSequence!> getVariants();
     method public boolean isEmpty();
@@ -1052,7 +1055,7 @@
     method public androidx.car.app.model.CarText build();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class ClickableSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.ClickableSpan create(androidx.car.app.model.OnClickListener);
     method public androidx.car.app.model.OnClickDelegate getOnClickDelegate();
   }
@@ -1061,7 +1064,7 @@
     method public String getContentId();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class DateTimeWithZone {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class DateTimeWithZone {
     method public static androidx.car.app.model.DateTimeWithZone create(long, @IntRange(from=0xffff02e0, to=64800) int, String);
     method public static androidx.car.app.model.DateTimeWithZone create(long, java.util.TimeZone);
     method @RequiresApi(26) public static androidx.car.app.model.DateTimeWithZone create(java.time.ZonedDateTime);
@@ -1070,7 +1073,7 @@
     method public String? getZoneShortName();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Distance {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Distance {
     method public static androidx.car.app.model.Distance create(double, int);
     method public double getDisplayDistance();
     method public int getDisplayUnit();
@@ -1083,23 +1086,23 @@
     field public static final int UNIT_YARDS = 7; // 0x7
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class DistanceSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class DistanceSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.DistanceSpan create(androidx.car.app.model.Distance);
     method public androidx.car.app.model.Distance getDistance();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class DurationSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class DurationSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.DurationSpan create(long);
     method @RequiresApi(26) public static androidx.car.app.model.DurationSpan create(java.time.Duration);
     method public long getDurationSeconds();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class ForegroundCarColorSpan extends androidx.car.app.model.CarSpan {
     method public static androidx.car.app.model.ForegroundCarColorSpan create(androidx.car.app.model.CarColor);
     method public androidx.car.app.model.CarColor getColor();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class GridItem implements androidx.car.app.model.Item {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class GridItem implements androidx.car.app.model.Item {
     method public androidx.car.app.model.CarIcon? getImage();
     method public int getImageType();
     method public androidx.car.app.model.OnClickDelegate? getOnClickDelegate();
@@ -1123,7 +1126,7 @@
     method public androidx.car.app.model.GridItem.Builder setTitle(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class GridTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class GridTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.ItemList? getSingleList();
@@ -1141,7 +1144,7 @@
     method public androidx.car.app.model.GridTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class Header {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class Header {
     method public java.util.List<androidx.car.app.model.Action!> getEndHeaderActions();
     method public androidx.car.app.model.Action? getStartHeaderAction();
     method public androidx.car.app.model.CarText? getTitle();
@@ -1169,7 +1172,7 @@
   @androidx.car.app.annotations.CarProtocol public interface Item {
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class ItemList {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class ItemList {
     method public java.util.List<androidx.car.app.model.Item!> getItems();
     method public androidx.car.app.model.CarText? getNoItemsMessage();
     method public androidx.car.app.model.OnItemVisibilityChangedDelegate? getOnItemVisibilityChangedDelegate();
@@ -1197,7 +1200,7 @@
     method public void onSelected(int);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class ListTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class ListTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public java.util.List<androidx.car.app.model.SectionedItemList!> getSectionedLists();
@@ -1219,7 +1222,7 @@
     method public androidx.car.app.model.ListTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class LongMessageTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -1236,7 +1239,7 @@
     method public androidx.car.app.model.LongMessageTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class MessageTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class MessageTemplate implements androidx.car.app.model.Template {
     method @androidx.car.app.annotations.RequiresCarApi(2) public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getDebugMessage();
@@ -1261,7 +1264,7 @@
     method public androidx.car.app.model.MessageTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Metadata {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Metadata {
     method public androidx.car.app.model.Place? getPlace();
     field public static final androidx.car.app.model.Metadata EMPTY_METADATA;
   }
@@ -1302,7 +1305,7 @@
     method public void sendSelected(int, androidx.car.app.OnDoneCallback);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Pane {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Pane {
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method @androidx.car.app.annotations.RequiresCarApi(4) public androidx.car.app.model.CarIcon? getImage();
     method public java.util.List<androidx.car.app.model.Row!> getRows();
@@ -1318,7 +1321,7 @@
     method public androidx.car.app.model.Pane.Builder setLoading(boolean);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class PaneTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class PaneTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public androidx.car.app.model.Pane getPane();
@@ -1333,12 +1336,12 @@
     method public androidx.car.app.model.PaneTemplate.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class ParkedOnlyOnClickListener implements androidx.car.app.model.OnClickListener {
     method public static androidx.car.app.model.ParkedOnlyOnClickListener create(androidx.car.app.model.OnClickListener);
     method public void onClick();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Place {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Place {
     method public androidx.car.app.model.CarLocation getLocation();
     method public androidx.car.app.model.PlaceMarker? getMarker();
   }
@@ -1350,7 +1353,7 @@
     method public androidx.car.app.model.Place.Builder setMarker(androidx.car.app.model.PlaceMarker);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class PlaceListMapTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Place? getAnchor();
     method public androidx.car.app.model.Action? getHeaderAction();
@@ -1375,7 +1378,7 @@
     method public androidx.car.app.model.PlaceListMapTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class PlaceMarker {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class PlaceMarker {
     method public androidx.car.app.model.CarColor? getColor();
     method public androidx.car.app.model.CarIcon? getIcon();
     method public int getIconType();
@@ -1392,7 +1395,7 @@
     method public androidx.car.app.model.PlaceMarker.Builder setLabel(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Row implements androidx.car.app.model.Item {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Row implements androidx.car.app.model.Item {
     method @androidx.car.app.annotations.ExperimentalCarApi public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.Metadata? getMetadata();
@@ -1435,7 +1438,7 @@
     method public void sendSearchTextChanged(String, androidx.car.app.OnDoneCallback);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class SearchTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class SearchTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Action? getHeaderAction();
     method public String? getInitialSearchText();
@@ -1463,13 +1466,13 @@
     method public default void onSearchTextChanged(String);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class SectionedItemList {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class SectionedItemList {
     method public static androidx.car.app.model.SectionedItemList create(androidx.car.app.model.ItemList, CharSequence);
     method public androidx.car.app.model.CarText getHeader();
     method public androidx.car.app.model.ItemList getItemList();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public final class Tab implements androidx.car.app.model.Content {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(6) public final class Tab implements androidx.car.app.model.Content {
     method public String getContentId();
     method public androidx.car.app.model.CarIcon getIcon();
     method public androidx.car.app.model.CarText getTitle();
@@ -1490,7 +1493,7 @@
     method public void sendTabSelected(String, androidx.car.app.OnDoneCallback);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class TabContents implements androidx.car.app.model.Content {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(6) public class TabContents implements androidx.car.app.model.Content {
     method public String getContentId();
     method public androidx.car.app.model.Template getTemplate();
     field public static final String CONTENT_ID = "TAB_CONTENTS_CONTENT_ID";
@@ -1501,7 +1504,7 @@
     method public androidx.car.app.model.TabContents build();
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class TabTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(6) public class TabTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.Action getHeaderAction();
     method public androidx.car.app.model.TabCallbackDelegate getTabCallbackDelegate();
     method public androidx.car.app.model.TabContents getTabContents();
@@ -1525,7 +1528,7 @@
   @androidx.car.app.annotations.CarProtocol public interface Template {
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class TemplateInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class TemplateInfo {
     ctor public TemplateInfo(Class<? extends androidx.car.app.model.Template>, String);
     method public Class<? extends androidx.car.app.model.Template> getTemplateClass();
     method public String getTemplateId();
@@ -1546,7 +1549,7 @@
     method public static androidx.car.app.model.TemplateWrapper wrap(androidx.car.app.model.Template, String);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Toggle {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Toggle {
     method public androidx.car.app.model.OnCheckedChangeDelegate getOnCheckedChangeDelegate();
     method public boolean isChecked();
     method @androidx.car.app.annotations.RequiresCarApi(5) public boolean isEnabled();
@@ -1567,7 +1570,7 @@
 
 package androidx.car.app.model.signin {
 
-  @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class InputSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     method public androidx.car.app.model.CarText? getDefaultValue();
     method public androidx.car.app.model.CarText? getErrorMessage();
     method public androidx.car.app.model.CarText? getHint();
@@ -1594,22 +1597,22 @@
     method public androidx.car.app.model.signin.InputSignInMethod.Builder setShowKeyboardByDefault(boolean);
   }
 
-  @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class PinSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     ctor public PinSignInMethod(CharSequence);
     method public androidx.car.app.model.CarText getPinCode();
   }
 
-  @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class ProviderSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     ctor public ProviderSignInMethod(androidx.car.app.model.Action);
     method public androidx.car.app.model.Action getAction();
   }
 
-  @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(4) public final class QRCodeSignInMethod implements androidx.car.app.model.signin.SignInTemplate.SignInMethod {
     ctor public QRCodeSignInMethod(android.net.Uri);
     method public android.net.Uri getUri();
   }
 
-  @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(2) public final class SignInTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public java.util.List<androidx.car.app.model.Action!> getActions();
     method public androidx.car.app.model.CarText? getAdditionalText();
@@ -1657,7 +1660,7 @@
 
 package androidx.car.app.navigation.model {
 
-  @androidx.car.app.annotations.CarProtocol public final class Destination {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Destination {
     method public androidx.car.app.model.CarText? getAddress();
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.CarText? getName();
@@ -1671,7 +1674,7 @@
     method public androidx.car.app.navigation.model.Destination.Builder setName(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Lane {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Lane {
     method public java.util.List<androidx.car.app.navigation.model.LaneDirection!> getDirections();
   }
 
@@ -1681,7 +1684,7 @@
     method public androidx.car.app.navigation.model.Lane build();
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class LaneDirection {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class LaneDirection {
     method public static androidx.car.app.navigation.model.LaneDirection create(int, boolean);
     method public int getShape();
     method public boolean isRecommended();
@@ -1697,7 +1700,7 @@
     field public static final int SHAPE_U_TURN_RIGHT = 10; // 0xa
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Maneuver {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Maneuver {
     method public androidx.car.app.model.CarIcon? getIcon();
     method public int getRoundaboutExitAngle();
     method public int getRoundaboutExitNumber();
@@ -1761,7 +1764,7 @@
     method public androidx.car.app.navigation.model.Maneuver.Builder setRoundaboutExitNumber(@IntRange(from=1) int);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapController {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class MapController {
     method public androidx.car.app.model.ActionStrip? getMapActionStrip();
     method public androidx.car.app.navigation.model.PanModeDelegate? getPanModeDelegate();
   }
@@ -1773,7 +1776,7 @@
     method public androidx.car.app.navigation.model.MapController.Builder setPanModeListener(androidx.car.app.navigation.model.PanModeListener);
   }
 
-  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.RequiresCarApi(5) public final class MapTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields @androidx.car.app.annotations.RequiresCarApi(5) public final class MapTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.Header? getHeader();
     method public androidx.car.app.model.ItemList? getItemList();
@@ -1791,7 +1794,7 @@
     method public androidx.car.app.navigation.model.MapTemplate.Builder setPane(androidx.car.app.model.Pane);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class MessageInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
     method public androidx.car.app.model.CarIcon? getImage();
     method public androidx.car.app.model.CarText? getText();
     method public androidx.car.app.model.CarText? getTitle();
@@ -1807,7 +1810,7 @@
     method public androidx.car.app.navigation.model.MessageInfo.Builder setTitle(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class NavigationTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class NavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method public androidx.car.app.model.CarColor? getBackgroundColor();
     method public androidx.car.app.navigation.model.TravelEstimate? getDestinationTravelEstimate();
@@ -1839,7 +1842,7 @@
     method public void onPanModeChanged(boolean);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class PlaceListNavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
     method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
@@ -1866,7 +1869,7 @@
     method @Deprecated public androidx.car.app.navigation.model.PlaceListNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class RoutePreviewNavigationTemplate implements androidx.car.app.model.Template {
     method public androidx.car.app.model.ActionStrip? getActionStrip();
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.model.Header? getHeader();
     method @Deprecated public androidx.car.app.model.Action? getHeaderAction();
@@ -1893,7 +1896,7 @@
     method @Deprecated public androidx.car.app.navigation.model.RoutePreviewNavigationTemplate.Builder setTitle(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class RoutingInfo implements androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo {
     method public androidx.car.app.model.Distance? getCurrentDistance();
     method public androidx.car.app.navigation.model.Step? getCurrentStep();
     method public androidx.car.app.model.CarIcon? getJunctionImage();
@@ -1910,7 +1913,7 @@
     method public androidx.car.app.navigation.model.RoutingInfo.Builder setNextStep(androidx.car.app.navigation.model.Step);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Step {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Step {
     method public androidx.car.app.model.CarText? getCue();
     method public java.util.List<androidx.car.app.navigation.model.Lane!> getLanes();
     method public androidx.car.app.model.CarIcon? getLanesImage();
@@ -1930,7 +1933,7 @@
     method public androidx.car.app.navigation.model.Step.Builder setRoad(CharSequence);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class TravelEstimate {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class TravelEstimate {
     method public androidx.car.app.model.DateTimeWithZone? getArrivalTimeAtDestination();
     method public androidx.car.app.model.Distance? getRemainingDistance();
     method public androidx.car.app.model.CarColor? getRemainingDistanceColor();
@@ -1953,7 +1956,7 @@
     method @androidx.car.app.annotations.RequiresCarApi(5) public androidx.car.app.navigation.model.TravelEstimate.Builder setTripText(androidx.car.app.model.CarText);
   }
 
-  @androidx.car.app.annotations.CarProtocol public final class Trip {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Trip {
     method public androidx.car.app.model.CarText? getCurrentRoad();
     method public java.util.List<androidx.car.app.navigation.model.TravelEstimate!> getDestinationTravelEstimates();
     method public java.util.List<androidx.car.app.navigation.model.Destination!> getDestinations();
@@ -2063,7 +2066,7 @@
 
 package androidx.car.app.suggestion.model {
 
-  @androidx.car.app.annotations.CarProtocol public final class Suggestion {
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.KeepFields public final class Suggestion {
     method public android.app.PendingIntent? getAction();
     method public androidx.car.app.model.CarIcon? getIcon();
     method public String getIdentifier();
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 9fb0b45..b710163 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -1054,7 +1054,7 @@
     method public double getLongitude();
   }
 
-  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+  @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
     ctor public CarSpan();
     method public void updateDrawState(android.text.TextPaint);
   }
diff --git a/car/app/app/api/restricted_current.txt b/car/app/app/api/restricted_current.txt
index 0497df5..065ecce 100644
--- a/car/app/app/api/restricted_current.txt
+++ b/car/app/app/api/restricted_current.txt
@@ -634,7 +634,7 @@
     method public double getLongitude();
   }
 
-  @Keep @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
+  @androidx.car.app.annotations.CarProtocol public class CarSpan extends android.text.style.CharacterStyle {
     ctor public CarSpan();
     method public void updateDrawState(android.text.TextPaint);
   }
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index da527c4..d7ff189 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -91,10 +91,6 @@
         resValue "string", "car_app_library_version", androidx.LibraryVersions.CAR_APP.toString()
         consumerProguardFiles "proguard-rules.pro"
     }
-    lintOptions {
-        // We rely on keeping a bunch of private variables in the library for serialization.
-        disable("BanKeepAnnotation")
-    }
 
     testOptions.unitTests.includeAndroidResources = true
     namespace "androidx.car.app"
diff --git a/car/app/app/proguard-rules.pro b/car/app/app/proguard-rules.pro
index fd43f97d..2ab8b09 100644
--- a/car/app/app/proguard-rules.pro
+++ b/car/app/app/proguard-rules.pro
@@ -7,3 +7,8 @@
 
 # Keep all IInterfaces which are needed for host communications.
 -keep class androidx.car.app.** extends android.os.IInterface { *; }
+
+# Keep all private final fields from a class.
+-keepclasseswithmembers @androidx.car.app.annotations.KeepFields class * {
+  *;
+}
\ No newline at end of file
diff --git a/car/app/app/src/main/java/androidx/car/app/AppInfo.java b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
index d74fc85..25269f9 100644
--- a/car/app/app/src/main/java/androidx/car/app/AppInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/AppInfo.java
@@ -24,13 +24,13 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.annotation.RestrictTo.Scope;
 import androidx.annotation.VisibleForTesting;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.versioning.CarAppApiLevel;
 import androidx.car.app.versioning.CarAppApiLevels;
 
@@ -57,6 +57,7 @@
  * @see CarContext#getCarAppApiLevel()
  */
 @CarProtocol
+@KeepFields
 public final class AppInfo {
     /**
      * Application meta-data tag used to define the minimum Car App API level this application is
@@ -69,13 +70,10 @@
      */
     public static final String MIN_API_LEVEL_METADATA_KEY = "androidx.car.app.minCarApiLevel";
 
-    @Keep
     @Nullable
     private final String mLibraryVersion;
-    @Keep
     @CarAppApiLevel
     private final int mMinCarAppApiLevel;
-    @Keep
     @CarAppApiLevel
     private final int mLatestCarAppApiLevel;
 
@@ -136,12 +134,12 @@
                     context.getPackageName(),
                     PackageManager.GET_META_DATA);
             int apiLevel = applicationInfo.metaData != null
-                                   ? applicationInfo.metaData.getInt(
+                    ? applicationInfo.metaData.getInt(
                     MIN_API_LEVEL_METADATA_KEY, CarAppApiLevels.UNKNOWN)
-                                   : CarAppApiLevels.UNKNOWN;
+                    : CarAppApiLevels.UNKNOWN;
             if (apiLevel == CarAppApiLevels.UNKNOWN) {
                 throw new IllegalArgumentException("Min API level not declared in manifest ("
-                    + MIN_API_LEVEL_METADATA_KEY + ")");
+                        + MIN_API_LEVEL_METADATA_KEY + ")");
             }
             return apiLevel;
         } catch (PackageManager.NameNotFoundException e) {
diff --git a/car/app/app/src/main/java/androidx/car/app/FailureResponse.java b/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
index b5bb270..a12d6f3 100644
--- a/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
+++ b/car/app/app/src/main/java/androidx/car/app/FailureResponse.java
@@ -24,11 +24,11 @@
 import android.util.Log;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.serialization.BundlerException;
 
 import java.lang.annotation.Retention;
@@ -42,6 +42,7 @@
  * <p>This is used for the failure response for an {@link androidx.car.app.IOnDoneCallback}
  */
 @CarProtocol
+@KeepFields
 public final class FailureResponse {
     /**
      * The exception type of the failure.
@@ -71,10 +72,8 @@
     public static final int RUNTIME_EXCEPTION = 5;
     public static final int REMOTE_EXCEPTION = 6;
 
-    @Keep
     @Nullable
     private final String mStackTrace;
-    @Keep
     @ErrorType
     private final int mErrorType;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java b/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
index e118317..8fefaff 100644
--- a/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/HandshakeInfo.java
@@ -18,21 +18,20 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * A container for the information conveyed by the host after the handshake with the app is
  * completed.
  */
 @CarProtocol
+@KeepFields
 public final class HandshakeInfo {
-    @Keep
     @Nullable
     private final String mHostPackageName;
-    @Keep
     private final int mHostCarAppApiLevel;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/SessionInfo.java b/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
index a971ce2..81ea916 100644
--- a/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/SessionInfo.java
@@ -18,13 +18,13 @@
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Template;
 import androidx.car.app.navigation.model.NavigationTemplate;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.versioning.CarAppApiLevel;
 import androidx.car.app.versioning.CarAppApiLevels;
 
@@ -37,6 +37,7 @@
 /** Information about a {@link Session}, such as the physical display and the session ID. */
 @RequiresCarApi(6)
 @CarProtocol
+@KeepFields
 public class SessionInfo {
     private static final char DIVIDER = '/';
 
@@ -85,12 +86,10 @@
     }
 
     /** A string identifier unique per physical display. */
-    @Keep
     @NonNull
     private final String mSessionId;
 
     /** The type of display the {@link Session} is rendering on. */
-    @Keep
     @DisplayType
     private final int mDisplayType;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/SurfaceContainer.java b/car/app/app/src/main/java/androidx/car/app/SurfaceContainer.java
index 3a5755f..c1dd6f4 100644
--- a/car/app/app/src/main/java/androidx/car/app/SurfaceContainer.java
+++ b/car/app/app/src/main/java/androidx/car/app/SurfaceContainer.java
@@ -18,21 +18,18 @@
 
 import android.view.Surface;
 
-import androidx.annotation.Keep;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /** A container for the {@link Surface} created by the host and its associated properties. */
 @CarProtocol
+@KeepFields
 public final class SurfaceContainer {
-    @Keep
     @Nullable
     private final Surface mSurface;
-    @Keep
     private final int mWidth;
-    @Keep
     private final int mHeight;
-    @Keep
     private final int mDpi;
 
     public SurfaceContainer(@Nullable Surface surface, int width, int height, int dpi) {
diff --git a/car/app/app/src/main/java/androidx/car/app/annotations/KeepFields.java b/car/app/app/src/main/java/androidx/car/app/annotations/KeepFields.java
new file mode 100644
index 0000000..4fff545
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/annotations/KeepFields.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2022 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.
+ */
+
+package androidx.car.app.annotations;
+
+import static androidx.annotation.RestrictTo.Scope.LIBRARY;
+
+import androidx.annotation.RestrictTo;
+import androidx.car.app.annotations.ExperimentalCarApi;
+
+/**
+ * Common interface to be used by Proguard rules to keep the class names and
+ * private final fields
+ *
+ */
+@ExperimentalCarApi
+@RestrictTo(LIBRARY)
+public @interface KeepFields {
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarClimateFeature.java b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarClimateFeature.java
index a58d15d..29ff10f 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarClimateFeature.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/climate/CarClimateFeature.java
@@ -16,12 +16,12 @@
 
 package androidx.car.app.hardware.climate;
 
-import androidx.annotation.Keep;
 import androidx.annotation.MainThread;
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarZone;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -36,12 +36,11 @@
 @RequiresCarApi(5)
 @MainThread
 @ExperimentalCarApi
+@KeepFields
 public final class CarClimateFeature {
-    @Keep
     @ClimateProfileRequest.ClimateProfileFeature
     private final int mFeature;
 
-    @Keep
     @NonNull
     private final List<CarZone> mCarZones;
 
@@ -106,8 +105,8 @@
         /**
          * Creates an instance of builder.
          *
-         * @param feature   one of integer flags in ClimateStateFeature or
-         *                      ClimateProfileFeatures
+         * @param feature one of integer flags in ClimateStateFeature or
+         *                ClimateProfileFeatures
          */
         public Builder(@ClimateProfileRequest.ClimateProfileFeature int feature) {
             mFeature = feature;
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarValue.java b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarValue.java
index 078a0c2..1cf1dde 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarValue.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarValue.java
@@ -18,7 +18,6 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.OptIn;
@@ -26,6 +25,7 @@
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -41,6 +41,7 @@
  */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class CarValue<T> {
     /**
      * Defines the possible status codes when trying to access car hardware properties, sensors,
@@ -89,15 +90,11 @@
     @StatusCode
     public static final int STATUS_UNAVAILABLE = 3;
 
-    @Keep
     @Nullable
     private final T mValue;
-    @Keep
     private final long mTimestampMillis;
-    @Keep
     @StatusCode
     private final int mStatus;
-    @Keep
     @NonNull
     private final List<CarZone> mCarZones;
 
@@ -226,7 +223,7 @@
      *
      * @param value           data to be returned with the result
      * @param timestampMillis the time in milliseconds when the value was generated (see
-     * {@link #getTimestampMillis})
+     *                        {@link #getTimestampMillis})
      * @param status          the status code associated with this value
      */
     @OptIn(markerClass = ExperimentalCarApi.class)
@@ -242,7 +239,7 @@
      *
      * @param value           data to be returned with the result
      * @param timestampMillis the time in milliseconds when the value was generated (see
-     * {@link #getTimestampMillis})
+     *                        {@link #getTimestampMillis})
      * @param status          the status code associated with this value
      * @param zones           the car zones associated with this value
      */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarZone.java b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarZone.java
index 7c2c718..ca2ea99 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/common/CarZone.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/common/CarZone.java
@@ -18,13 +18,13 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -45,6 +45,7 @@
 @CarProtocol
 @RequiresCarApi(5)
 @ExperimentalCarApi
+@KeepFields
 public final class CarZone {
     /**
      * Possible row values.
@@ -139,9 +140,7 @@
      */
     public static final CarZone CAR_ZONE_GLOBAL = new CarZone.Builder().build();
 
-    @Keep
     private final int mRow;
-    @Keep
     private final int mColumn;
 
     /** Returns one of the values in CarZoneRow. */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Accelerometer.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Accelerometer.java
index 010983a..3ffa96b 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Accelerometer.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Accelerometer.java
@@ -17,12 +17,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.List;
 import java.util.Objects;
@@ -30,9 +30,8 @@
 /** Information about car specific accelerometers available from the car hardware. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Accelerometer {
-
-    @Keep
     @NonNull
     private final CarValue<List<Float>> mForces;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/CarHardwareLocation.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/CarHardwareLocation.java
index ae200f2..b286c93 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/CarHardwareLocation.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/CarHardwareLocation.java
@@ -21,19 +21,20 @@
 
 import android.location.Location;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Information about car specific car location available from the car hardware. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class CarHardwareLocation {
 
     /** @hide */
@@ -46,7 +47,6 @@
     public static final CarValue<Location> UNKNOWN_LOCATION = new CarValue<>(null, 0,
             CarValue.STATUS_UNKNOWN);
 
-    @Keep
     @NonNull
     private final CarValue<Location> mLocation;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Compass.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Compass.java
index 9287ca1..72b32b1 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Compass.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Compass.java
@@ -17,12 +17,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.List;
 import java.util.Objects;
@@ -30,9 +30,8 @@
 /** Information about car specific compass available from the car hardware. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Compass {
-
-    @Keep
     @NonNull
     private final CarValue<List<Float>> mOrientations;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
index cb74f2b..96e39a8 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyLevel.java
@@ -20,7 +20,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
@@ -28,35 +27,30 @@
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarUnit;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Information of the energy (fuel and battery) levels from the car hardware. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class EnergyLevel {
-
-    @Keep
     @NonNull
     private final CarValue<Float> mBatteryPercent;
 
-    @Keep
     @NonNull
     private final CarValue<Float> mFuelPercent;
 
-    @Keep
     @NonNull
     private final CarValue<Boolean> mEnergyIsLow;
 
-    @Keep
     @Nullable
     private final CarValue<Float> mRangeRemainingMeters;
 
-    @Keep
     @NonNull
     private final CarValue<@CarDistanceUnit Integer> mDistanceDisplayUnit;
 
-    @Keep
     @NonNull
     private final CarValue<@CarVolumeUnit Integer> mFuelVolumeDisplayUnit;
 
@@ -94,7 +88,8 @@
         return requireNonNull(mDistanceDisplayUnit);
     }
 
-    /** Returns the fuel volume display unit from the car hardware.
+    /**
+     * Returns the fuel volume display unit from the car hardware.
      *
      * <p>See {@link CarUnit} for possible volume values.
      */
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyProfile.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyProfile.java
index 2422ce9..370bacc 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyProfile.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/EnergyProfile.java
@@ -20,13 +20,13 @@
 import static java.util.Objects.requireNonNull;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -38,6 +38,7 @@
 /** Information about car hardware fuel profile such as fuel types and connector ports. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class EnergyProfile {
 
     /**
@@ -186,11 +187,9 @@
     @FuelType
     public static final int FUEL_TYPE_OTHER = 12;
 
-    @Keep
     @NonNull
     private final CarValue<List<@EvConnectorType Integer>> mEvConnectorTypes;
 
-    @Keep
     @NonNull
     private final CarValue<List<@FuelType Integer>> mFuelTypes;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/EvStatus.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/EvStatus.java
index 5ae8591..8d9c55c 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/EvStatus.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/EvStatus.java
@@ -18,25 +18,23 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Information about EV car port status */
 @CarProtocol
 @ExperimentalCarApi
+@KeepFields
 public class EvStatus {
-
-    @Keep
     @NonNull
     private final CarValue<Boolean> mEvChargePortOpen;
 
-    @Keep
     @NonNull
     private final CarValue<Boolean> mEvChargePortConnected;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Gyroscope.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Gyroscope.java
index 7ecc689..7565530 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Gyroscope.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Gyroscope.java
@@ -17,12 +17,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.List;
 import java.util.Objects;
@@ -30,8 +30,8 @@
 /** Information about car specific gyroscopes available from the car hardware. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Gyroscope {
-    @Keep
     @NonNull
     private final CarValue<List<Float>> mRotations;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Mileage.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Mileage.java
index 783fd0f..2646d9f 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Mileage.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Mileage.java
@@ -19,25 +19,24 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarUnit;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Information about car mileage. */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Mileage {
-    @Keep
     @Nullable
     private final CarValue<Float> mOdometerMeters;
 
-    @Keep
     @NonNull
     private final CarValue<@CarDistanceUnit Integer> mDistanceDisplayUnit;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Model.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Model.java
index 7a0328d..d160e61 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Model.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Model.java
@@ -17,12 +17,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -31,16 +31,14 @@
  */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Model {
-    @Keep
     @NonNull
     private final CarValue<String> mName;
 
-    @Keep
     @NonNull
     private final CarValue<Integer> mYear;
 
-    @Keep
     @NonNull
     private final CarValue<String> mManufacturer;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/Speed.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/Speed.java
index bd0c4eb..aa85ace 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/Speed.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/Speed.java
@@ -19,13 +19,13 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarUnit;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -34,16 +34,14 @@
  */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class Speed {
-    @Keep
     @Nullable
     private final CarValue<Float> mRawSpeedMetersPerSecond;
 
-    @Keep
     @Nullable
     private final CarValue<Float> mDisplaySpeedMetersPerSecond;
 
-    @Keep
     @NonNull
     private final CarValue<@CarSpeedUnit Integer> mSpeedDisplayUnit;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/hardware/info/TollCard.java b/car/app/app/src/main/java/androidx/car/app/hardware/info/TollCard.java
index 9383664..6bd976a 100644
--- a/car/app/app/src/main/java/androidx/car/app/hardware/info/TollCard.java
+++ b/car/app/app/src/main/java/androidx/car/app/hardware/info/TollCard.java
@@ -20,13 +20,13 @@
 import static java.util.Objects.requireNonNull;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -39,6 +39,7 @@
  */
 @CarProtocol
 @RequiresCarApi(3)
+@KeepFields
 public final class TollCard {
 
     /**
@@ -87,7 +88,6 @@
     @TollCardState
     public static final int TOLLCARD_STATE_NOT_INSERTED = 3;
 
-    @Keep
     @NonNull
     private final CarValue<@TollCardState Integer> mCardState;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/media/CarAudioCallbackDelegate.java b/car/app/app/src/main/java/androidx/car/app/media/CarAudioCallbackDelegate.java
index 29055b4..db91b33 100644
--- a/car/app/app/src/main/java/androidx/car/app/media/CarAudioCallbackDelegate.java
+++ b/car/app/app/src/main/java/androidx/car/app/media/CarAudioCallbackDelegate.java
@@ -21,10 +21,10 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.annotations.RequiresCarApi;
 
 /**
@@ -35,8 +35,8 @@
  */
 @CarProtocol
 @RequiresCarApi(5)
+@KeepFields
 public class CarAudioCallbackDelegate {
-    @Keep
     @Nullable
     private final ICarAudioCallback mCallback;
 
@@ -67,9 +67,9 @@
         mCallback = null;
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    // We need to keep these stub for Bundler serialization logic.
+    @KeepFields
     private static class CarAudioCallbackStub extends ICarAudioCallback.Stub {
-        @Keep
         @Nullable
         private final CarAudioCallback mCarAudioCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneRequest.java b/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneRequest.java
index ec6290c..c588d3c 100644
--- a/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneRequest.java
+++ b/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneRequest.java
@@ -20,11 +20,11 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * The request for a call to open microphone.
@@ -34,8 +34,8 @@
  */
 @CarProtocol
 @RequiresCarApi(5)
+@KeepFields
 public final class OpenMicrophoneRequest {
-    @Keep
     @Nullable
     private final CarAudioCallbackDelegate mCarAudioCallbackDelegate;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneResponse.java b/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneResponse.java
index 62f62bb..68a9776 100644
--- a/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneResponse.java
+++ b/car/app/app/src/main/java/androidx/car/app/media/OpenMicrophoneResponse.java
@@ -21,11 +21,11 @@
 import android.annotation.SuppressLint;
 import android.os.ParcelFileDescriptor;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,12 +38,10 @@
  */
 @CarProtocol
 @RequiresCarApi(5)
+@KeepFields
 public final class OpenMicrophoneResponse {
-    @Keep
     @Nullable
     private final CarAudioCallbackDelegate mCarAudioCallbackDelegate;
-
-    @Keep
     @Nullable
     private final ParcelFileDescriptor mCarMicrophoneDescriptor;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
index 9cc42c6..51e24b5 100644
--- a/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
+++ b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
@@ -20,31 +20,26 @@
 
 import android.os.Bundle;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.CarText;
+import androidx.car.app.annotations.KeepFields;
 import androidx.core.app.Person;
 
 /** Represents a single message in a {@link ConversationItem} */
 @ExperimentalCarApi
 @CarProtocol
 @RequiresCarApi(6)
+@KeepFields
 public class CarMessage {
-    @Keep
     @NonNull
     private final Bundle mSender;
-
-    @Keep
     @NonNull
     private final CarText mBody;
-    @Keep
     private final long mReceivedTimeEpochMillis;
-
-    @Keep
     private final boolean mIsRead;
 
     CarMessage(@NonNull Builder builder) {
@@ -64,7 +59,8 @@
 
 
     /** Returns a {@link Person} representing the message sender */
-    @NonNull public Person getSender() {
+    @NonNull
+    public Person getSender() {
         return Person.fromBundle(mSender);
     }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationCallbackDelegateImpl.java
index a31fd66..5ab50b0 100644
--- a/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationCallbackDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationCallbackDelegateImpl.java
@@ -22,7 +22,6 @@
 
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -30,6 +29,7 @@
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.utils.RemoteUtils;
 
@@ -45,8 +45,9 @@
 @RestrictTo(LIBRARY)
 @CarProtocol
 @RequiresCarApi(6)
+@KeepFields
 class ConversationCallbackDelegateImpl implements ConversationCallbackDelegate {
-    @Keep
+
     @Nullable
     private final IConversationCallback mConversationCallbackBinder;
 
@@ -81,8 +82,9 @@
         }
     }
 
+    @KeepFields
     private static class ConversationCallbackStub extends IConversationCallback.Stub {
-        @Keep
+
         @NonNull
         private final ConversationCallback mConversationCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Action.java b/car/app/app/src/main/java/androidx/car/app/model/Action.java
index 2b47ca2..2d3b8fe 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Action.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Action.java
@@ -29,7 +29,6 @@
 import androidx.activity.OnBackPressedCallback;
 import androidx.activity.OnBackPressedDispatcher;
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -37,6 +36,7 @@
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.lifecycle.LifecycleOwner;
 
 import java.lang.annotation.Retention;
@@ -62,6 +62,7 @@
  * the action will note them accordingly.
  */
 @CarProtocol
+@KeepFields
 public final class Action {
     /**
      * The type of action represented by the {@link Action} instance.
@@ -187,23 +188,16 @@
     @NonNull
     public static final Action PAN = new Action(TYPE_PAN);
 
-    @Keep
     private final boolean mIsEnabled;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-    @Keep
     private final CarColor mBackgroundColor;
-    @Keep
     @Nullable
     private final OnClickDelegate mOnClickDelegate;
-    @Keep
     @ActionType
     private final int mType;
-    @Keep
     @ActionFlag
     private final int mFlags;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java b/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
index fad72b3..44f88a2 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ActionStrip.java
@@ -20,12 +20,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.Action.ActionType;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -46,8 +46,8 @@
  * supported.
  */
 @CarProtocol
+@KeepFields
 public final class ActionStrip {
-    @Keep
     private final List<Action> mActions;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Alert.java b/car/app/app/src/main/java/androidx/car/app/model/Alert.java
index 4638a8d..43b0247 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Alert.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Alert.java
@@ -20,12 +20,12 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -37,28 +37,22 @@
  */
 @CarProtocol
 @RequiresCarApi(5)
+@KeepFields
 public final class Alert {
 
     /* Maximum number of actions allowed on the alert. */
     private static final int MAX_ACTION_COUNT = 2;
 
-    @Keep
     private final int mId;
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-    @Keep
     @NonNull
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mSubtitle;
-    @Keep
     @NonNull
     private final List<Action> mActions;
-    @Keep
     private final long mDuration;
-    @Keep
     @Nullable
     private final AlertCallbackDelegate mCallbackDelegate;
 
@@ -186,11 +180,11 @@
          *
          * <p>Text spans are supported.
          *
-         * @param alertId The unique identifier used for the alert. Alerts with the same id are
-         *                considered equal.
-         * @param title The title of the alert.
+         * @param alertId        The unique identifier used for the alert. Alerts with the same
+         *                       id are considered equal.
+         * @param title          The title of the alert.
          * @param durationMillis The maximum duration the alert can be shown in milli seconds.
-         * @throws NullPointerException if {@code title} is {@code null}
+         * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code duration} is not positive
          * @see CarText
          */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/AlertCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/AlertCallbackDelegateImpl.java
index a96b641..ca5e408 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/AlertCallbackDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/AlertCallbackDelegateImpl.java
@@ -23,12 +23,12 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -37,9 +37,8 @@
  * @hide
  */
 @RestrictTo(LIBRARY)
+@KeepFields
 public class AlertCallbackDelegateImpl implements AlertCallbackDelegate {
-
-    @Keep
     @Nullable
     private final IAlertCallback mCallback;
 
@@ -78,7 +77,7 @@
         }
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class AlertCallbackStub extends IAlertCallback.Stub {
         private final AlertCallback mCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarColor.java b/car/app/app/src/main/java/androidx/car/app/model/CarColor.java
index e09d29e..b383013 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarColor.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarColor.java
@@ -20,11 +20,11 @@
 
 import androidx.annotation.ColorInt;
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -87,6 +87,7 @@
  * instead if the custom color does not pass the contrast requirements.
  */
 @CarProtocol
+@KeepFields
 public final class CarColor {
     /**
      * The type of color represented by the {@link CarColor} instance.
@@ -212,17 +213,14 @@
     @NonNull
     public static final CarColor YELLOW = create(TYPE_YELLOW);
 
-    @Keep
     @CarColorType
     private final int mType;
 
     /** A light-variant custom color-int, used when the type is {@link #TYPE_CUSTOM}. */
-    @Keep
     @ColorInt
     private final int mColor;
 
     /** A dark-variant custom color-int, used when the type is {@link #TYPE_CUSTOM}. */
-    @Keep
     @ColorInt
     private final int mColorDark;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
index 3e42b54f..f1deda5 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarIcon.java
@@ -26,7 +26,6 @@
 import android.graphics.PorterDuff.Mode;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -34,6 +33,7 @@
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarColorConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.core.graphics.drawable.IconCompat;
 
 import java.lang.annotation.Retention;
@@ -91,6 +91,7 @@
  * }</pre>
  */
 @CarProtocol
+@KeepFields
 public final class CarIcon {
     /** Matches with {@link android.graphics.drawable.Icon#TYPE_RESOURCE} */
     private static final int TYPE_RESOURCE = 2;
@@ -190,13 +191,10 @@
     @NonNull
     public static final CarIcon PAN = CarIcon.forStandardType(TYPE_PAN);
 
-    @Keep
     @CarIconType
     private final int mType;
-    @Keep
     @Nullable
     private final IconCompat mIcon;
-    @Keep
     @Nullable
     private final CarColor mTint;
 
@@ -341,11 +339,11 @@
     /** A builder of {@link CarIcon}. */
     public static final class Builder {
         @Nullable
-        private IconCompat mIcon;
+        private final IconCompat mIcon;
         @Nullable
         private CarColor mTint;
         @CarIconType
-        private int mType;
+        private final int mType;
 
         /**
          * Sets the tint of the icon to the given {@link CarColor}.
@@ -358,7 +356,7 @@
          * <p>The tint mode used to blend this color is {@link Mode#SRC_IN}.
          *
          * <p>Depending on contrast requirements, capabilities of the vehicle screens, or other
-         *  factors, the color may be ignored by the host or overridden by the vehicle system.
+         * factors, the color may be ignored by the host or overridden by the vehicle system.
          *
          * @throws NullPointerException if {@code tin} is {@code null}
          * @see CarColor
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarIconSpan.java b/car/app/app/src/main/java/androidx/car/app/model/CarIconSpan.java
index 363a526..e301d93 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarIconSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarIconSpan.java
@@ -21,12 +21,12 @@
 import static java.util.Objects.requireNonNull;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -60,6 +60,7 @@
  * @see CarIcon
  */
 @CarProtocol
+@KeepFields
 public final class CarIconSpan extends CarSpan {
     /**
      * Indicates how to align a car icon span with its surrounding text.
@@ -99,10 +100,8 @@
     public static final int ALIGN_CENTER = 2;
 
     @Nullable
-    @Keep
     private final CarIcon mIcon;
     @Alignment
-    @Keep
     private final int mAlignment;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarLocation.java b/car/app/app/src/main/java/androidx/car/app/model/CarLocation.java
index a0d94bd..8055b63 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarLocation.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarLocation.java
@@ -21,17 +21,16 @@
 
 import android.location.Location;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /** Represents a geographical location with a latitude and a longitude. */
 @CarProtocol
+@KeepFields
 public final class CarLocation {
-    @Keep
     private final double mLat;
-    @Keep
     private final double mLng;
 
     /** Returns a new instance of a {@link CarLocation}. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarSpan.java b/car/app/app/src/main/java/androidx/car/app/model/CarSpan.java
index e9c09f1..e556b87 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarSpan.java
@@ -19,9 +19,9 @@
 import android.text.TextPaint;
 import android.text.style.CharacterStyle;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * Base class for all span types allowed for a car app.
@@ -29,7 +29,7 @@
  * @see CarText
  */
 @CarProtocol
-@Keep
+@KeepFields
 public class CarSpan extends CharacterStyle {
     @Override
     public void updateDrawState(@NonNull TextPaint tp) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/CarText.java b/car/app/app/src/main/java/androidx/car/app/model/CarText.java
index 6b4347f..c635052 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/CarText.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/CarText.java
@@ -23,11 +23,11 @@
 import android.text.SpannableString;
 import android.text.Spanned;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.utils.CollectionUtils;
 import androidx.car.app.utils.StringUtils;
@@ -83,14 +83,11 @@
  * the text before sending it to the host.
  */
 @CarProtocol
+@KeepFields
 public final class CarText {
-    @Keep
     private final String mText;
-    @Keep
     private final List<String> mTextVariants;
-    @Keep
     private final List<SpanWrapper> mSpans;
-    @Keep
     private final List<List<SpanWrapper>> mSpansForVariants;
 
     /**
@@ -282,14 +279,11 @@
      * @hide
      */
     @RestrictTo(LIBRARY)
+    @KeepFields
     public static class SpanWrapper {
-        @Keep
         private final int mStart;
-        @Keep
         private final int mEnd;
-        @Keep
         private final int mFlags;
-        @Keep
         @NonNull
         private final CarSpan mCarSpan;
 
@@ -352,10 +346,9 @@
     }
 
     /** A builder of {@link CarText}. */
+    @KeepFields
     public static final class Builder {
-        @Keep
         CharSequence mText;
-        @Keep
         List<CharSequence> mTextVariants = new ArrayList<>();
 
         /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java b/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
index 4fa6bd8..7bf2653 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ClickableSpan.java
@@ -21,11 +21,11 @@
 import android.annotation.SuppressLint;
 import android.os.Looper;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -51,8 +51,8 @@
  */
 @RequiresCarApi(2)
 @CarProtocol
+@KeepFields
 public final class ClickableSpan extends CarSpan {
-    @Keep
     @Nullable
     private final OnClickDelegate mOnClickDelegate;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/DateTimeWithZone.java b/car/app/app/src/main/java/androidx/car/app/model/DateTimeWithZone.java
index 00b89cb..4807010 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/DateTimeWithZone.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/DateTimeWithZone.java
@@ -25,11 +25,11 @@
 
 import androidx.annotation.DoNotInline;
 import androidx.annotation.IntRange;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -55,16 +55,14 @@
  */
 @SuppressWarnings("MissingSummary")
 @CarProtocol
+@KeepFields
 public final class DateTimeWithZone {
     /** The maximum allowed offset for a time zone, in seconds. */
     private static final long MAX_ZONE_OFFSET_SECONDS = 18 * HOURS.toSeconds(1);
 
-    @Keep
     private final long mTimeSinceEpochMillis;
-    @Keep
     private final int mZoneOffsetSeconds;
     @Nullable
-    @Keep
     private final String mZoneShortName;
 
     /** Returns the number of milliseconds from the epoch of 1970-01-01T00:00:00Z. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Distance.java b/car/app/app/src/main/java/androidx/car/app/model/Distance.java
index ca961fe..58dc39a 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Distance.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Distance.java
@@ -19,11 +19,11 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -32,6 +32,7 @@
 
 /** Represents a distance value and how it should be displayed in the UI. */
 @CarProtocol
+@KeepFields
 public final class Distance {
     /**
      * Possible units used to display {@link Distance}
@@ -86,9 +87,7 @@
     @Unit
     public static final int UNIT_YARDS = 7;
 
-    @Keep
     private final double mDisplayDistance;
-    @Keep
     @Unit
     private final int mDisplayUnit;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/DistanceSpan.java b/car/app/app/src/main/java/androidx/car/app/model/DistanceSpan.java
index 56ccacd..27d2861 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/DistanceSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/DistanceSpan.java
@@ -18,10 +18,10 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -59,9 +59,9 @@
  * }</pre>
  */
 @CarProtocol
+@KeepFields
 public final class DistanceSpan extends CarSpan {
     @Nullable
-    @Keep
     private final Distance mDistance;
 
     /** Creates a {@link DistanceSpan} from a {@link CarIcon}. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/DurationSpan.java b/car/app/app/src/main/java/androidx/car/app/model/DurationSpan.java
index 6361c8c..baf74f7 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/DurationSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/DurationSpan.java
@@ -21,11 +21,11 @@
 import android.annotation.SuppressLint;
 
 import androidx.annotation.DoNotInline;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.time.Duration;
 
@@ -55,8 +55,8 @@
  * }</pre>
  */
 @CarProtocol
+@KeepFields
 public final class DurationSpan extends CarSpan {
-    @Keep
     private final long mDurationSeconds;
 
     /** Creates a {@link DurationSpan} with the given duration. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
index b33a565..1fbfd03 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ForegroundCarColorSpan.java
@@ -20,11 +20,11 @@
 
 import android.text.style.ForegroundColorSpan;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarColorConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -49,8 +49,8 @@
  * @see ForegroundColorSpan
  */
 @CarProtocol
+@KeepFields
 public final class ForegroundCarColorSpan extends CarSpan {
-    @Keep
     private final CarColor mCarColor;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
index 4b410d0..3eaa380 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/GridItem.java
@@ -24,7 +24,6 @@
 import android.os.Looper;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -32,6 +31,7 @@
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -41,6 +41,7 @@
  * Represents a grid item with an image and an optional title.
  */
 @CarProtocol
+@KeepFields
 public final class GridItem implements Item {
     /**
      * The type of images supported within grid items.
@@ -74,21 +75,15 @@
      */
     public static final int IMAGE_TYPE_LARGE = (1 << 1);
 
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mText;
-    @Keep
     @Nullable
     private final CarIcon mImage;
-    @Keep
     @GridItemImageType
     private final int mImageType;
-    @Keep
     @Nullable
     private final OnClickDelegate mOnClickDelegate;
 
@@ -307,7 +302,7 @@
          *
          * This text is truncated at the end to fit in a single line below the title
          *
-         * @throws NullPointerException if {@code text} is {@code null}
+         * @throws NullPointerException     if {@code text} is {@code null}
          * @throws IllegalArgumentException if {@code text} contains unsupported spans
          */
         @NonNull
diff --git a/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
index 5116155..8cf1272 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/GridTemplate.java
@@ -21,11 +21,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -46,19 +46,15 @@
  * </ul>
  */
 @CarProtocol
+@KeepFields
 public final class GridTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ItemList mSingleList;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Header.java b/car/app/app/src/main/java/androidx/car/app/model/Header.java
index c84814f..490659e 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Header.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Header.java
@@ -21,12 +21,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -39,14 +39,12 @@
  */
 @RequiresCarApi(5)
 @CarProtocol
+@KeepFields
 public final class Header {
-    @Keep
     @NonNull
     private final List<Action> mEndHeaderActions;
-    @Keep
     @Nullable
     private final Action mStartHeaderAction;
-    @Keep
     @Nullable
     private final CarText mTitle;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java
index e44cfa5..60b43e1 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/InputCallbackDelegateImpl.java
@@ -23,12 +23,12 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -38,8 +38,8 @@
  * @hide
  */
 @RestrictTo(LIBRARY)
+@KeepFields
 public class InputCallbackDelegateImpl implements InputCallbackDelegate {
-    @Keep
     @Nullable
     private final IInputCallback mCallback;
 
@@ -80,7 +80,7 @@
         mCallback = null;
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class OnInputCallbackStub extends IInputCallback.Stub {
         private final InputCallback mCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
index c6cce4e..8092881 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ItemList.java
@@ -22,11 +22,11 @@
 import android.os.Looper;
 
 import androidx.annotation.IntRange;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -40,6 +40,7 @@
  * ListTemplate}.
  */
 @CarProtocol
+@KeepFields
 public final class ItemList {
     /**
      * A listener for handling selection events for lists with selectable items.
@@ -74,17 +75,12 @@
         void onItemVisibilityChanged(int startIndex, int endIndex);
     }
 
-    @Keep
     private final int mSelectedIndex;
-    @Keep
     private final List<Item> mItems;
-    @Keep
     @Nullable
     private final OnSelectedDelegate mOnSelectedDelegate;
-    @Keep
     @Nullable
     private final OnItemVisibilityChangedDelegate mOnItemVisibilityChangedDelegate;
-    @Keep
     @Nullable
     private final CarText mNoItemsMessage;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
index 60fce30..ac36e87 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ListTemplate.java
@@ -22,13 +22,13 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -56,21 +56,16 @@
  * </ul>
  */
 @CarProtocol
+@KeepFields
 public final class ListTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ItemList mSingleList;
-    @Keep
     private final List<SectionedItemList> mSectionedLists;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
index f8710c8..84c1565 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/LongMessageTemplate.java
@@ -22,12 +22,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -47,19 +47,15 @@
  * @see Screen#onGetTemplate()
  */
 @RequiresCarApi(2)
+@KeepFields
 public final class LongMessageTemplate implements Template {
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mMessage;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     private final List<Action> mActionList;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
index 0ea9900..d398a38 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/MessageTemplate.java
@@ -25,13 +25,13 @@
 
 import android.util.Log;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -49,27 +49,20 @@
  * considered a refresh of a previous one if the title and messages have not changed.
  */
 @CarProtocol
+@KeepFields
 public final class MessageTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mMessage;
-    @Keep
     @Nullable
     private final CarText mDebugMessage;
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     private final List<Action> mActionList;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Metadata.java b/car/app/app/src/main/java/androidx/car/app/model/Metadata.java
index ef0176c..5412381 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Metadata.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Metadata.java
@@ -18,20 +18,19 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** A metadata class used for attaching additional properties to models. */
 @CarProtocol
+@KeepFields
 public final class Metadata {
     /** An empty {@link Metadata} instance. */
     public static final Metadata EMPTY_METADATA = new Builder().build();
-
-    @Keep
     @Nullable
     private final Place mPlace;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnCheckedChangeDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnCheckedChangeDelegateImpl.java
index 597b5d3..2daee02 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnCheckedChangeDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnCheckedChangeDelegateImpl.java
@@ -23,13 +23,13 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.model.Toggle.OnCheckedChangeListener;
 import androidx.car.app.utils.RemoteUtils;
 
@@ -40,9 +40,8 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class OnCheckedChangeDelegateImpl implements OnCheckedChangeDelegate {
-
-    @Keep
     @Nullable
     private final IOnCheckedChangeListener mStub;
 
@@ -72,8 +71,9 @@
         return new OnCheckedChangeDelegateImpl(listener);
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
-    private static class OnCheckedChangeListenerStub extends IOnCheckedChangeListener.Stub {
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
+    private static class OnCheckedChangeListenerStub extends
+            IOnCheckedChangeListener.Stub {
         private final OnCheckedChangeListener mListener;
 
         OnCheckedChangeListenerStub(OnCheckedChangeListener listener) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnClickDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnClickDelegateImpl.java
index 47521a1..7ec79ae 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnClickDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnClickDelegateImpl.java
@@ -23,13 +23,13 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -39,11 +39,9 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class OnClickDelegateImpl implements OnClickDelegate {
-
-    @Keep
     private final boolean mIsParkedOnly;
-    @Keep
     @Nullable
     private final IOnClickListener mListener;
 
@@ -85,7 +83,7 @@
         mIsParkedOnly = false;
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class OnClickListenerStub extends IOnClickListener.Stub {
         private final OnClickListener mOnClickListener;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnContentRefreshDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnContentRefreshDelegateImpl.java
index 6f9c90d..a7474d8 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnContentRefreshDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnContentRefreshDelegateImpl.java
@@ -23,13 +23,13 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -39,8 +39,8 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class OnContentRefreshDelegateImpl implements OnContentRefreshDelegate {
-    @Keep
     @Nullable
     private final IOnContentRefreshListener mListener;
 
@@ -73,8 +73,9 @@
         mListener = null;
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
-    private static class OnContentRefreshListenerStub extends IOnContentRefreshListener.Stub {
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
+    private static class OnContentRefreshListenerStub extends
+            IOnContentRefreshListener.Stub {
         private final OnContentRefreshListener mOnContentRefreshListener;
 
         OnContentRefreshListenerStub(OnContentRefreshListener onContentRefreshListener) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
index d49cfd5..d8fad0c 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnItemVisibilityChangedDelegateImpl.java
@@ -23,13 +23,13 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.model.ItemList.OnItemVisibilityChangedListener;
 import androidx.car.app.utils.RemoteUtils;
 
@@ -40,10 +40,9 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class OnItemVisibilityChangedDelegateImpl implements
         OnItemVisibilityChangedDelegate {
-
-    @Keep
     @Nullable
     private final IOnItemVisibilityChangedListener mStub;
 
@@ -77,7 +76,7 @@
     }
 
     /** Stub class for the {@link IOnItemVisibilityChangedListener} interface. */
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class OnItemVisibilityChangedListenerStub
             extends IOnItemVisibilityChangedListener.Stub {
         private final OnItemVisibilityChangedListener mListener;
diff --git a/car/app/app/src/main/java/androidx/car/app/model/OnSelectedDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/OnSelectedDelegateImpl.java
index f1e7414..d255a60 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/OnSelectedDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/OnSelectedDelegateImpl.java
@@ -23,12 +23,12 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.model.ItemList.OnSelectedListener;
 import androidx.car.app.utils.RemoteUtils;
 
@@ -38,9 +38,8 @@
  * @hide
  */
 @RestrictTo(LIBRARY)
+@KeepFields
 public class OnSelectedDelegateImpl implements OnSelectedDelegate {
-
-    @Keep
     @Nullable
     private final IOnSelectedListener mStub;
 
@@ -70,7 +69,7 @@
         return new OnSelectedDelegateImpl(listener);
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class OnSelectedListenerStub extends IOnSelectedListener.Stub {
         private final OnSelectedListener mListener;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Pane.java b/car/app/app/src/main/java/androidx/car/app/model/Pane.java
index c46d156..8dd8198 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Pane.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Pane.java
@@ -18,11 +18,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -35,14 +35,11 @@
  * that users can perform based on such content.
  */
 @CarProtocol
+@KeepFields
 public final class Pane {
-    @Keep
     private final List<Action> mActionList;
-    @Keep
     private final List<Row> mRows;
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final CarIcon mImage;
 
@@ -167,7 +164,7 @@
          *
          * <p>By default, no actions are displayed.
          *
-         * @throws NullPointerException     if {@code action} is {@code null}
+         * @throws NullPointerException if {@code action} is {@code null}
          */
         @NonNull
         public Builder addAction(@NonNull Action action) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
index 6b5d0ad..3a1a8e6 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PaneTemplate.java
@@ -23,11 +23,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -48,17 +48,14 @@
  * </ul>
  */
 @CarProtocol
+@KeepFields
 public final class PaneTemplate implements Template {
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final Pane mPane;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/ParkedOnlyOnClickListener.java b/car/app/app/src/main/java/androidx/car/app/model/ParkedOnlyOnClickListener.java
index f857e04..d238560 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/ParkedOnlyOnClickListener.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/ParkedOnlyOnClickListener.java
@@ -21,9 +21,9 @@
 import android.annotation.SuppressLint;
 import android.os.Looper;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 /**
  * An {@link OnClickListener} that wraps another one and executes its {@link #onClick} method only
@@ -45,8 +45,8 @@
 // Lint check wants this to be renamed *Callback.
 @SuppressLint("ListenerInterface")
 @CarProtocol
+@KeepFields
 public final class ParkedOnlyOnClickListener implements OnClickListener {
-    @Keep
     private final OnClickListener mListener;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Place.java b/car/app/app/src/main/java/androidx/car/app/model/Place.java
index bfcb937..db117fb 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Place.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Place.java
@@ -18,20 +18,19 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Represents a geographical location and additional information on how to display it. */
 @CarProtocol
+@KeepFields
 public final class Place {
-    @Keep
     @Nullable
     private final CarLocation mLocation;
-    @Keep
     @Nullable
     private final PlaceMarker mMarker;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
index bfa8ea1..f9ac3b3 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceListMapTemplate.java
@@ -24,13 +24,13 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.List;
@@ -57,27 +57,20 @@
  * </ul>
  */
 @CarProtocol
+@KeepFields
 public final class PlaceListMapTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     private final boolean mShowCurrentLocation;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
-    @Keep
     @Nullable
     private final Place mAnchor;
-    @Keep
     @Nullable
     private final OnContentRefreshDelegate mOnContentRefreshDelegate;
 
@@ -168,7 +161,7 @@
     public int hashCode() {
         return Objects.hash(
                 mShowCurrentLocation, mIsLoading, mTitle, mItemList, mHeaderAction, mActionStrip,
-                    mAnchor, mOnContentRefreshDelegate == null);
+                mAnchor, mOnContentRefreshDelegate == null);
     }
 
     @Override
diff --git a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
index b21f963..dd3c7b8 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/PlaceMarker.java
@@ -21,13 +21,13 @@
 import static java.util.Objects.requireNonNull;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarColorConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -35,6 +35,7 @@
 
 /** Describes how a place is to be displayed on a map. */
 @CarProtocol
+@KeepFields
 public final class PlaceMarker {
     /**
      * Describes the type of image a marker icon represents.
@@ -70,16 +71,12 @@
 
     private static final int MAX_LABEL_LENGTH = 3;
 
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-    @Keep
     @Nullable
     private final CarText mLabel;
-    @Keep
     @Nullable
     private final CarColor mColor;
-    @Keep
     @MarkerIconType
     private final int mIconType;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Row.java b/car/app/app/src/main/java/androidx/car/app/model/Row.java
index 955c258b..96e99a5 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Row.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Row.java
@@ -26,7 +26,6 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -36,6 +35,7 @@
 import androidx.car.app.model.constraints.ActionsConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.lang.annotation.Retention;
@@ -50,6 +50,7 @@
  * or switch.
  */
 @CarProtocol
+@KeepFields
 public final class Row implements Item {
     /** A boat that belongs to you. */
     private static final String YOUR_BOAT = "\uD83D\uDEA3"; // 🚣
@@ -98,31 +99,20 @@
      */
     public static final int IMAGE_TYPE_ICON = (1 << 2);
 
-    @Keep
     private final boolean mIsEnabled;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     private final List<CarText> mTexts;
-    @Keep
     @Nullable
     private final CarIcon mImage;
-    @Keep
     private final List<Action> mActions;
-    @Keep
     private final int mNumericDecoration;
-    @Keep
     @Nullable
     private final Toggle mToggle;
-    @Keep
     @Nullable
     private final OnClickDelegate mOnClickDelegate;
-    @Keep
     private final Metadata mMetadata;
-    @Keep
     private final boolean mIsBrowsable;
-    @Keep
     @RowImageType
     private final int mRowImageType;
 
@@ -367,7 +357,7 @@
          *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty, of if it contains
-     *                                      unsupported spans
+         *                                  unsupported spans
          */
         @NonNull
         public Builder setTitle(@NonNull CharSequence title) {
@@ -388,7 +378,7 @@
          *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty, of if it contains
-     *                                      unsupported spans
+         *                                  unsupported spans
          */
         @NonNull
         public Builder setTitle(@NonNull CarText title) {
@@ -560,7 +550,7 @@
          * messages in a conversation.
          *
          * @param decoration the {@code int} to display. Must be positive, zero, or equal to
-         * {@link Row#NO_DECORATION}.
+         *                   {@link Row#NO_DECORATION}.
          * @throws IllegalArgumentException if {@code decoration} is invalid
          */
         @ExperimentalCarApi
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackDelegateImpl.java
index a618bb9..80e7ebf 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchCallbackDelegateImpl.java
@@ -24,13 +24,13 @@
 import android.annotation.SuppressLint;
 import android.os.RemoteException;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -40,9 +40,8 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class SearchCallbackDelegateImpl implements SearchCallbackDelegate {
-
-    @Keep
     @Nullable
     private final ISearchCallback mStubCallback;
 
@@ -84,7 +83,7 @@
         return new SearchCallbackDelegateImpl(callback);
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class SearchCallbackStub extends ISearchCallback.Stub {
         private final SearchCallback mCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
index e3b112c..4ac4254d 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SearchTemplate.java
@@ -25,11 +25,11 @@
 import android.annotation.SuppressLint;
 import android.os.Looper;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -44,6 +44,7 @@
  * results as the user types without the templates being counted against the quota.
  */
 @CarProtocol
+@KeepFields
 public final class SearchTemplate implements Template {
 
     /** A listener for search updates. */
@@ -70,26 +71,18 @@
         }
     }
 
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final SearchCallbackDelegate mSearchCallbackDelegate;
-    @Keep
     @Nullable
     private final String mInitialSearchText;
-    @Keep
     @Nullable
     private final String mSearchHint;
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     private final boolean mShowKeyboardByDefault;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/SectionedItemList.java b/car/app/app/src/main/java/androidx/car/app/model/SectionedItemList.java
index 1c49eb5..d635d22 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/SectionedItemList.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/SectionedItemList.java
@@ -18,11 +18,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -30,11 +30,10 @@
  * Represents an {@link ItemList} that is contained inside a section, for internal use only.
  */
 @CarProtocol
+@KeepFields
 public final class SectionedItemList {
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     @Nullable
     private final CarText mHeader;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Tab.java b/car/app/app/src/main/java/androidx/car/app/model/Tab.java
index ffadbe7..732d534 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Tab.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Tab.java
@@ -18,7 +18,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
@@ -26,6 +25,7 @@
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -36,22 +36,16 @@
 @CarProtocol
 @ExperimentalCarApi
 @RequiresCarApi(6)
+@KeepFields
 public final class Tab implements Content {
     /** Content ID for an empty Tab object. */
     private static final String EMPTY_TAB_CONTENT_ID = "EMPTY_TAB_CONTENT_ID";
 
-    @Keep
     private final boolean mIsActive;
-
-    @Keep
     @Nullable
     private final CarText mTitle;
-
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-
-    @Keep
     @NonNull
     private final String mContentId;
 
@@ -136,7 +130,6 @@
 
     /**
      * Creates and returns a new {@link Builder} initialized with this {@link Tab}'s data.
-     *
      */
     @NonNull
     public Tab.Builder toBuilder() {
@@ -184,7 +177,7 @@
          *
          * @throws NullPointerException     if {@code title} is {@code null}
          * @throws IllegalArgumentException if {@code title} is empty, of if it contains
-         *                                      unsupported spans
+         *                                  unsupported spans
          */
         @NonNull
         public Tab.Builder setTitle(@NonNull CharSequence title) {
@@ -199,7 +192,6 @@
 
         /**
          * Sets the content ID of the tab.
-         *
          */
         @NonNull
         public Tab.Builder setContentId(@NonNull String contentId) {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/TabCallbackDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/model/TabCallbackDelegateImpl.java
index fd89c59..4e559ca 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/TabCallbackDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/TabCallbackDelegateImpl.java
@@ -32,6 +32,7 @@
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 /**
@@ -43,9 +44,8 @@
 @CarProtocol
 @ExperimentalCarApi
 @RequiresCarApi(6)
+@KeepFields
 public class TabCallbackDelegateImpl implements TabCallbackDelegate {
-
-    @Keep
     @Nullable
     private final ITabCallback mStubCallback;
     @Override
@@ -74,7 +74,7 @@
         return new TabCallbackDelegateImpl(callback);
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class TabCallbackStub extends ITabCallback.Stub {
         private final TabTemplate.TabCallback mCallback;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/TabContents.java b/car/app/app/src/main/java/androidx/car/app/model/TabContents.java
index e22d8fa..d27dc30 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/TabContents.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/TabContents.java
@@ -20,23 +20,23 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.TabContentsConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /**
  * Represents the contents to display for a selected tab in a {@link TabTemplate}.
- *
  */
 @CarProtocol
 @ExperimentalCarApi
 @RequiresCarApi(6)
+@KeepFields
 public class TabContents implements Content {
     /**
      * Content ID for TabContents
@@ -45,9 +45,8 @@
      */
     public static final String CONTENT_ID = "TAB_CONTENTS_CONTENT_ID";
 
-    @Keep
     @Nullable
-    private Template mTemplate;
+    private final Template mTemplate;
 
     /**
      * Returns the static content ID associated with TabContents.
@@ -123,7 +122,7 @@
          * template.
          * The host will ignore these.
          *
-         * @throws NullPointerException if {@code template} is null
+         * @throws NullPointerException     if {@code template} is null
          * @throws IllegalArgumentException if {@code template} does not meet the requirements
          */
         @SuppressLint("ExecutorRegistration")
diff --git a/car/app/app/src/main/java/androidx/car/app/model/TabTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/TabTemplate.java
index 4a963df..e3fb36f 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/TabTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/TabTemplate.java
@@ -22,13 +22,13 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.ExperimentalCarApi;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.constraints.TabsConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -56,6 +56,7 @@
 @CarProtocol
 @ExperimentalCarApi
 @RequiresCarApi(6)
+@KeepFields
 public class TabTemplate implements Template {
 
     /** A listener for tab selection. */
@@ -71,22 +72,13 @@
         }
     }
 
-    @Keep
     private final boolean mIsLoading;
-
-    @Keep
     @Nullable
     private final TabCallbackDelegate mTabCallbackDelegate;
-
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-
-    @Keep
     @Nullable
     private final TabContents mTabContents;
-
-    @Keep
     @Nullable
     private final List<Tab> mTabs;
 
@@ -244,8 +236,7 @@
         /**
          * Adds an {@link Tab} to display in the template.
          *
-         *
-         * @throws NullPointerException     if {@code tab} is {@code null}
+         * @throws NullPointerException if {@code tab} is {@code null}
          */
         @NonNull
         public TabTemplate.Builder addTab(@NonNull Tab tab) {
@@ -267,7 +258,7 @@
          * @throws IllegalStateException    if the template is in a loading state but there are
          *                                  tabs added or vice versa
          * @throws IllegalArgumentException if the added {@link Tab}(s) or header {@link Action}
-         * does not meet the template's requirements
+         *                                  does not meet the template's requirements
          */
         @NonNull
         public TabTemplate build() {
diff --git a/car/app/app/src/main/java/androidx/car/app/model/TemplateInfo.java b/car/app/app/src/main/java/androidx/car/app/model/TemplateInfo.java
index 90aa562..d94a2c8 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/TemplateInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/TemplateInfo.java
@@ -18,10 +18,10 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -32,11 +32,10 @@
  * <p><strong>This class is for use by host implementations and not by apps.</strong>
  */
 @CarProtocol
+@KeepFields
 public final class TemplateInfo {
-    @Keep
     @Nullable
     private final Class<? extends Template> mTemplateClass;
-    @Keep
     @Nullable
     private final String mTemplateId;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/TemplateWrapper.java b/car/app/app/src/main/java/androidx/car/app/model/TemplateWrapper.java
index afe889f..80fdeeb 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/TemplateWrapper.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/TemplateWrapper.java
@@ -20,11 +20,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -42,14 +42,12 @@
  * <p><strong>This class is for use by host implementations and not by apps.</strong>
  */
 @CarProtocol
+@KeepFields
 public final class TemplateWrapper {
-    @Keep
     @Nullable
     private Template mTemplate;
-    @Keep
     @Nullable
     private String mId;
-    @Keep
     private List<TemplateInfo> mTemplateInfoForScreenStack = new ArrayList<>();
 
     /** The current step in a task that the template is in. */
diff --git a/car/app/app/src/main/java/androidx/car/app/model/Toggle.java b/car/app/app/src/main/java/androidx/car/app/model/Toggle.java
index b628a8b..80f08ad 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/Toggle.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/Toggle.java
@@ -21,16 +21,17 @@
 import android.annotation.SuppressLint;
 import android.os.Looper;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Represents a toggle that can have either a checked or unchecked state. */
 @CarProtocol
+@KeepFields
 public final class Toggle {
     /** A listener for handling checked state change events. */
     public interface OnCheckedChangeListener {
@@ -38,12 +39,9 @@
         void onCheckedChange(boolean isChecked);
     }
 
-    @Keep
     @Nullable
     private final OnCheckedChangeDelegate mOnCheckedChangeDelegate;
-    @Keep
     private final boolean mIsChecked;
-    @Keep
     private final boolean mIsEnabled;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
index f7d4780..5d36b9f 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/InputSignInMethod.java
@@ -24,7 +24,6 @@
 import android.os.Looper;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
@@ -33,6 +32,7 @@
 import androidx.car.app.model.InputCallback;
 import androidx.car.app.model.InputCallbackDelegate;
 import androidx.car.app.model.InputCallbackDelegateImpl;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -45,6 +45,7 @@
  * <p>For example, this can be used to request a username, a password or an activation code.
  */
 @RequiresCarApi(2)
+@KeepFields
 public final class InputSignInMethod implements SignInTemplate.SignInMethod {
     /**
      * The type of input represented by the {@link InputSignInMethod} instance.
@@ -108,25 +109,18 @@
      */
     public static final int KEYBOARD_NUMBER = 4;
 
-    @Keep
     @Nullable
     private final CarText mHint;
-    @Keep
     @Nullable
     private final CarText mDefaultValue;
-    @Keep
     @InputType
     private final int mInputType;
-    @Keep
     @Nullable
     private final CarText mErrorMessage;
-    @Keep
     @KeyboardType
     private final int mKeyboardType;
-    @Keep
     @Nullable
     private final InputCallbackDelegate mInputCallbackDelegate;
-    @Keep
     private final boolean mShowKeyboardByDefault;
 
     /**
@@ -256,7 +250,8 @@
 
     /** A builder of {@link InputSignInMethod}. */
     public static final class Builder {
-        @Nullable final InputCallbackDelegate mInputCallbackDelegate;
+        @Nullable
+        final InputCallbackDelegate mInputCallbackDelegate;
         @Nullable
         CarText mHint;
         @Nullable
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
index b90fd66..0a137a5 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/PinSignInMethod.java
@@ -18,11 +18,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.CarText;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -31,11 +31,11 @@
  * use to sign-in.
  */
 @RequiresCarApi(2)
+@KeepFields
 public final class PinSignInMethod implements SignInTemplate.SignInMethod {
     /** Maximum length, in characters, for a PIN. */
     private static final int MAX_PIN_LENGTH = 12;
 
-    @Keep
     @Nullable
     private final CarText mPinCode;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
index 35262f6..ce0d7f6 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/ProviderSignInMethod.java
@@ -18,12 +18,12 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ForegroundCarColorSpan;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -38,8 +38,8 @@
  * Sign-In into Your Android App</a>).
  */
 @RequiresCarApi(2)
+@KeepFields
 public final class ProviderSignInMethod implements SignInTemplate.SignInMethod {
-    @Keep
     @Nullable
     private final Action mAction;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/QRCodeSignInMethod.java b/car/app/app/src/main/java/androidx/car/app/model/signin/QRCodeSignInMethod.java
index c7899d1..b84eb1e 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/QRCodeSignInMethod.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/QRCodeSignInMethod.java
@@ -20,10 +20,10 @@
 
 import android.net.Uri;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -31,9 +31,9 @@
  * A {@link SignInTemplate.SignInMethod} that presents a QR Code that the user can use to sign-in.
  */
 @RequiresCarApi(4)
+@KeepFields
 @SuppressWarnings("AcronymName")
 public final class QRCodeSignInMethod implements SignInTemplate.SignInMethod {
-    @Keep
     @Nullable
     private final Uri mUri;
 
@@ -41,7 +41,7 @@
      * Returns a {@link QRCodeSignInMethod} instance.
      *
      * @param uri the URL to be used in creating a QR Code.
-     * @throws NullPointerException     if {@code url} is {@code null}
+     * @throws NullPointerException if {@code url} is {@code null}
      */
     public QRCodeSignInMethod(@NonNull Uri uri) {
         mUri = requireNonNull(uri);
diff --git a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
index e17e815..abaa6f3 100644
--- a/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/model/signin/SignInTemplate.java
@@ -23,7 +23,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
@@ -36,6 +35,7 @@
 import androidx.car.app.model.ForegroundCarColorSpan;
 import androidx.car.app.model.Template;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -54,6 +54,7 @@
  * @see Screen#onGetTemplate()
  */
 @RequiresCarApi(2)
+@KeepFields
 public final class SignInTemplate implements Template {
     /**
      * One of the possible sign in methods that can be set on a {@link SignInTemplate}.
@@ -61,26 +62,18 @@
     public interface SignInMethod {
     }
 
-    @Keep
     private final boolean mIsLoading;
-    @Keep
     @Nullable
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mInstructions;
-    @Keep
     @Nullable
     private final CarText mAdditionalText;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
-    @Keep
     private final List<Action> mActionList;
-    @Keep
     @Nullable
     private final SignInMethod mSignInMethod;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
index f6a9642..9823249 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Destination.java
@@ -18,26 +18,24 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.CarText;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** A class representing information related to a destination. */
 @CarProtocol
+@KeepFields
 public final class Destination {
-    @Keep
     @Nullable
     private final CarText mName;
-    @Keep
     @Nullable
     private final CarText mAddress;
-    @Keep
     @Nullable
     private final CarIcon mImage;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Lane.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Lane.java
index 31b9529..db213d2 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Lane.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Lane.java
@@ -18,10 +18,10 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -36,8 +36,8 @@
  * and indicates which directions the driver could take to stay on the navigation route.
  */
 @CarProtocol
+@KeepFields
 public final class Lane {
-    @Keep
     private final List<LaneDirection> mDirections;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/LaneDirection.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/LaneDirection.java
index adb4390..cbf371a 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/LaneDirection.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/LaneDirection.java
@@ -19,11 +19,11 @@
 import static androidx.annotation.RestrictTo.Scope.LIBRARY;
 
 import androidx.annotation.IntDef;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -39,7 +39,8 @@
  * @see Lane
  */
 @CarProtocol
-public final class LaneDirection {
+@KeepFields
+public final class LaneDirection{
     /**
      * Turn amount and direction.
      *
@@ -108,10 +109,8 @@
     @Shape
     public static final int SHAPE_U_TURN_RIGHT = 10;
 
-    @Keep
     @Shape
     private final int mShape;
-    @Keep
     private final boolean mIsRecommended;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
index ab284e5..e3da0cc 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Maneuver.java
@@ -22,13 +22,13 @@
 
 import androidx.annotation.IntDef;
 import androidx.annotation.IntRange;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -37,6 +37,7 @@
 /** Information about a maneuver that the driver will be required to perform. */
 // TODO(b/154671667): Update when host(s) updates or a scheme for auto sync is established.
 @CarProtocol
+@KeepFields
 public final class Maneuver {
     /**
      * Possible maneuver types.
@@ -433,14 +434,10 @@
     @Type
     public static final int TYPE_FERRY_TRAIN_RIGHT = 50;
 
-    @Keep
     @Type
     private final int mType;
-    @Keep
     private final int mRoundaboutExitNumber;
-    @Keep
     private final int mRoundaboutExitAngle;
-    @Keep
     @Nullable
     private final CarIcon mIcon;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapController.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapController.java
index d1656b7..be2f3f6 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapController.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapController.java
@@ -22,7 +22,6 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.SurfaceCallback;
@@ -30,6 +29,7 @@
 import androidx.car.app.annotations.RequiresCarApi;
 import androidx.car.app.model.Action;
 import androidx.car.app.model.ActionStrip;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -38,11 +38,10 @@
  */
 @RequiresCarApi(5)
 @CarProtocol
+@KeepFields
 public final class MapController {
-    @Keep
     @Nullable
     private final PanModeDelegate mPanModeDelegate;
-    @Keep
     @Nullable
     private final ActionStrip mMapActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
index ddc02ca..7f94326 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MapTemplate.java
@@ -23,7 +23,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
@@ -43,6 +42,7 @@
 import androidx.car.app.model.Row;
 import androidx.car.app.model.Template;
 import androidx.car.app.model.Toggle;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.List;
 import java.util.Objects;
@@ -64,20 +64,16 @@
  */
 @RequiresCarApi(5)
 @CarProtocol
+@KeepFields
 public final class MapTemplate implements Template {
-    @Keep
     @Nullable
     private final MapController mMapController;
-    @Keep
     @Nullable
     private final Pane mPane;
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     @Nullable
     private final Header mHeader;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
index 26e0a57..fe1cb04b 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/MessageInfo.java
@@ -18,7 +18,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
@@ -29,19 +28,18 @@
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
 import androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
 /** Represents a message that can be shown in the {@link NavigationTemplate}. */
 @CarProtocol
+@KeepFields
 public final class MessageInfo implements NavigationInfo {
-    @Keep
     @Nullable
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mText;
-    @Keep
     @Nullable
     private final CarIcon mImage;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
index 24d3fc9..94190e0 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/NavigationTemplate.java
@@ -24,7 +24,6 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
@@ -36,6 +35,7 @@
 import androidx.car.app.model.CarColor;
 import androidx.car.app.model.Template;
 import androidx.car.app.model.Toggle;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -111,6 +111,7 @@
  * androidx.car.app.NAVIGATION_TEMPLATES} permission in the manifest.
  */
 @CarProtocol
+@KeepFields
 public final class NavigationTemplate implements Template {
 
     /**
@@ -120,25 +121,18 @@
     public interface NavigationInfo {
     }
 
-    @Keep
     @Nullable
     private final NavigationInfo mNavigationInfo;
-    @Keep
     @Nullable
     private final CarColor mBackgroundColor;
-    @Keep
     @Nullable
     private final TravelEstimate mDestinationTravelEstimate;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
-    @Keep
     @Nullable
     private final ActionStrip mMapActionStrip;
-    @Keep
     @Nullable
     private final Toggle mPanModeToggle;
-    @Keep
     @Nullable
     private final PanModeDelegate mPanModeDelegate;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeDelegateImpl.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeDelegateImpl.java
index 8a3c452..56d2a3c 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeDelegateImpl.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/PanModeDelegateImpl.java
@@ -30,6 +30,7 @@
 import androidx.car.app.IOnDoneCallback;
 import androidx.car.app.OnDoneCallback;
 import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.RemoteUtils;
 
 import org.jetbrains.annotations.NotNull;
@@ -41,8 +42,8 @@
  */
 @RestrictTo(LIBRARY)
 @CarProtocol
+@KeepFields
 public class PanModeDelegateImpl implements PanModeDelegate {
-    @Keep
     @Nullable
     private final IPanModeListener mStub;
 
@@ -72,7 +73,7 @@
         return new PanModeDelegateImpl(listener);
     }
 
-    @Keep // We need to keep these stub for Bundler serialization logic.
+    @KeepFields // We need to keep these stub for Bundler serialization logic.
     private static class PanModeListenerStub extends IPanModeListener.Stub {
         private final PanModeListener mListener;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
index 1987c21..ecc1017 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/PlaceListNavigationTemplate.java
@@ -25,7 +25,6 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
@@ -51,6 +50,7 @@
 import androidx.car.app.model.Template;
 import androidx.car.app.model.Toggle;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.List;
@@ -80,41 +80,33 @@
  * androidx.car.app.NAVIGATION_TEMPLATES} permission in the manifest.
  */
 @CarProtocol
+@KeepFields
 public final class PlaceListNavigationTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
     /**
      * @deprecated Use the Header to set up the Title.
      */
     // TODO(b/225914724): remove after hosts switch over to setHeader().
-    @Keep
     @Nullable
     @Deprecated
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     @Nullable
     private final Header mHeader;
     /**
      * @deprecated Use the Header to set up the HeaderAction.
      */
     // TODO(b/225914724): remove after hosts switch over to setHeader().
-    @Keep
     @Nullable
     @Deprecated
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
-    @Keep
     @Nullable
     private final ActionStrip mMapActionStrip;
-    @Keep
     @Nullable
     private final PanModeDelegate mPanModeDelegate;
-    @Keep
     @Nullable
     private final OnContentRefreshDelegate mOnContentRefreshDelegate;
 
@@ -366,7 +358,6 @@
          * @throws IllegalArgumentException if {@code headerAction} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code headerAction} is {@code null}
-         *
          * @deprecated use {@link #setHeader(Header)}
          */
         // TODO(b/225914724): remove after hosts switch over to setHeader().
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
index 7559ca2..2e33dd2 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutePreviewNavigationTemplate.java
@@ -25,7 +25,6 @@
 
 import android.annotation.SuppressLint;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.Screen;
@@ -45,6 +44,7 @@
 import androidx.car.app.model.Template;
 import androidx.car.app.model.Toggle;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Collections;
 import java.util.Objects;
@@ -84,41 +84,33 @@
  * androidx.car.app.NAVIGATION_TEMPLATES} permission in the manifest.
  */
 @CarProtocol
+@KeepFields
 public final class RoutePreviewNavigationTemplate implements Template {
-    @Keep
     private final boolean mIsLoading;
     /**
      * @deprecated Use the Header to set up the Title.
      */
     // TODO(b/225914724): remove after hosts switch over to setHeader().
-    @Keep
     @Nullable
     @Deprecated
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final Action mNavigateAction;
-    @Keep
     @Nullable
     private final ItemList mItemList;
-    @Keep
     @Nullable
     private final Header mHeader;
     /**
      * @deprecated Use the Header to set up the HeaderAction.
      */
     // TODO(b/225914724): remove after hosts switch over to setHeader().
-    @Keep
     @Nullable
     @Deprecated
     private final Action mHeaderAction;
-    @Keep
     @Nullable
     private final ActionStrip mActionStrip;
-    @Keep
     @Nullable
     private final ActionStrip mMapActionStrip;
-    @Keep
     @Nullable
     private final PanModeDelegate mPanModeDelegate;
 
@@ -368,7 +360,6 @@
          * @throws IllegalArgumentException if {@code headerAction} does not meet the template's
          *                                  requirements
          * @throws NullPointerException     if {@code headerAction} is {@code null}
-         *
          * @deprecated use {@link #setHeader(Header)}
          */
         // TODO(b/225914724): remove after hosts switch over to setHeader().
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
index fb829cb..15aee7d 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/RoutingInfo.java
@@ -18,7 +18,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
@@ -26,6 +25,7 @@
 import androidx.car.app.model.Distance;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.navigation.model.NavigationTemplate.NavigationInfo;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -34,20 +34,16 @@
  * navigation
  */
 @CarProtocol
+@KeepFields
 public final class RoutingInfo implements NavigationInfo {
-    @Keep
     @Nullable
     private final Step mCurrentStep;
-    @Keep
     @Nullable
     private final Distance mCurrentDistance;
-    @Keep
     @Nullable
     private final Step mNextStep;
-    @Keep
     @Nullable
     private final CarIcon mJunctionImage;
-    @Keep
     private final boolean mIsLoading;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
index ebb742a..8ee1378 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Step.java
@@ -18,7 +18,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
@@ -28,6 +27,7 @@
 import androidx.car.app.model.DurationSpan;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -42,19 +42,15 @@
  * highway, or continuing straight through a roundabout.
  */
 @CarProtocol
+@KeepFields
 public final class Step {
-    @Keep
     @Nullable
     private final Maneuver mManeuver;
-    @Keep
     private final List<Lane> mLanes;
-    @Keep
     @Nullable
     private final CarIcon mLanesImage;
-    @Keep
     @Nullable
     private final CarText mCue;
-    @Keep
     @Nullable
     private final CarText mRoad;
 
@@ -184,8 +180,8 @@
         private CarText mRoad;
 
         /**
-        * Constructs a new builder of {@link Step}.
-        */
+         * Constructs a new builder of {@link Step}.
+         */
         public Builder() {
         }
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
index 1514cc7..cd20b95 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/TravelEstimate.java
@@ -22,7 +22,6 @@
 
 import androidx.annotation.DoNotInline;
 import androidx.annotation.IntRange;
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
@@ -36,6 +35,7 @@
 import androidx.car.app.model.constraints.CarColorConstraints;
 import androidx.car.app.model.constraints.CarIconConstraints;
 import androidx.car.app.model.constraints.CarTextConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.time.Duration;
 import java.time.ZonedDateTime;
@@ -47,26 +47,20 @@
  */
 @SuppressWarnings("MissingSummary")
 @CarProtocol
+@KeepFields
 public final class TravelEstimate {
     /** A value used to represent an unknown remaining amount of time. */
     public static final long REMAINING_TIME_UNKNOWN = -1L;
 
-    @Keep
     @Nullable
     private final Distance mRemainingDistance;
-    @Keep
     private final long mRemainingTimeSeconds;
-    @Keep
     @Nullable
     private final DateTimeWithZone mArrivalTimeAtDestination;
-    @Keep
     private final CarColor mRemainingTimeColor;
-    @Keep
     private final CarColor mRemainingDistanceColor;
-    @Keep
     @Nullable
     private final CarText mTripText;
-    @Keep
     @Nullable
     private final CarIcon mTripIcon;
 
diff --git a/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java b/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
index 2835ce3..4d4d6f8 100644
--- a/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
+++ b/car/app/app/src/main/java/androidx/car/app/navigation/model/Trip.java
@@ -18,11 +18,11 @@
 
 import static java.util.Objects.requireNonNull;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.CarText;
+import androidx.car.app.annotations.KeepFields;
 import androidx.car.app.utils.CollectionUtils;
 
 import java.util.ArrayList;
@@ -53,19 +53,14 @@
  * </ul>
  */
 @CarProtocol
+@KeepFields
 public final class Trip {
-    @Keep
     private final List<Destination> mDestinations;
-    @Keep
     private final List<Step> mSteps;
-    @Keep
     private final List<TravelEstimate> mDestinationTravelEstimates;
-    @Keep
     private final List<TravelEstimate> mStepTravelEstimates;
-    @Keep
     @Nullable
     private final CarText mCurrentRoad;
-    @Keep
     private final boolean mIsLoading;
 
     /**
diff --git a/car/app/app/src/main/java/androidx/car/app/suggestion/model/Suggestion.java b/car/app/app/src/main/java/androidx/car/app/suggestion/model/Suggestion.java
index 3791896..c75f83d 100644
--- a/car/app/app/src/main/java/androidx/car/app/suggestion/model/Suggestion.java
+++ b/car/app/app/src/main/java/androidx/car/app/suggestion/model/Suggestion.java
@@ -20,13 +20,13 @@
 
 import android.app.PendingIntent;
 
-import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.car.app.annotations.CarProtocol;
 import androidx.car.app.model.CarIcon;
 import androidx.car.app.model.CarText;
 import androidx.car.app.model.constraints.CarIconConstraints;
+import androidx.car.app.annotations.KeepFields;
 
 import java.util.Objects;
 
@@ -40,20 +40,16 @@
  * place to drive to rather than wait for the user to enter or search for it.
  */
 @CarProtocol
+@KeepFields
 public final class Suggestion {
-    @Keep
     @NonNull
     private final String mIdentifier;
-    @Keep
     @NonNull
     private final CarText mTitle;
-    @Keep
     @Nullable
     private final CarText mSubtitle;
-    @Keep
     @Nullable
     private final CarIcon mIcon;
-    @Keep
     @Nullable
     private final PendingIntent mAction;