diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index 1f748ae..b54edc3 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -403,6 +403,7 @@
   const val kotlinMetadataVersion = "2.0.0"
   const val mockito = "2.10.0"
   const val smaliVersion = "3.0.3"
+  const val protobufVersion = "3.19.3"
 }
 
 object Deps {
@@ -422,6 +423,7 @@
   val mockito by lazy { "org.mockito:mockito-core:${Versions.mockito}" }
   val smali by lazy { "com.android.tools.smali:smali:${Versions.smaliVersion}" }
   val smaliUtil by lazy { "com.android.tools.smali:smali-util:${Versions.smaliVersion}" }
+  val protobuf by lazy { "com.google.protobuf:protobuf-java:${Versions.protobufVersion}" }
 }
 
 object ThirdPartyDeps {
diff --git a/d8_r8/keepanno/build.gradle.kts b/d8_r8/keepanno/build.gradle.kts
index a747444..f7c128b 100644
--- a/d8_r8/keepanno/build.gradle.kts
+++ b/d8_r8/keepanno/build.gradle.kts
@@ -51,7 +51,7 @@
 dependencies {
   compileOnly(Deps.asm)
   compileOnly(Deps.guava)
-  implementation("com.google.protobuf:protobuf-java:3.19.3")
+  compileOnly(Deps.protobuf)
 }
 
 tasks {
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index fd3282d..ed1c2c7 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -47,6 +47,7 @@
   compileOnly(Deps.gson)
   compileOnly(Deps.guava)
   compileOnly(Deps.kotlinMetadata)
+  compileOnly(Deps.protobuf)
   errorprone(Deps.errorprone)
 }
 
diff --git a/d8_r8/resourceshrinker/build.gradle.kts b/d8_r8/resourceshrinker/build.gradle.kts
index db14c2f..3016524 100644
--- a/d8_r8/resourceshrinker/build.gradle.kts
+++ b/d8_r8/resourceshrinker/build.gradle.kts
@@ -36,9 +36,9 @@
 dependencies {
   compileOnly(Deps.asm)
   compileOnly(Deps.guava)
+  compileOnly(Deps.protobuf)
   compileOnly(files(resolve(ThirdPartyDeps.r8, "r8lib_8.2.20-dev.jar")))
   implementation("com.android.tools.build:aapt2-proto:8.2.0-alpha10-10154469")
-  implementation("com.google.protobuf:protobuf-java:3.19.3")
   implementation("com.android.tools.layoutlib:layoutlib-api:31.5.0-alpha04")
   implementation("com.android.tools:common:31.5.0-alpha04")
   implementation("com.android.tools:sdk-common:31.5.0-alpha04")
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
index e80bfbd..3b32980 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepDeclaration.java
@@ -3,10 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import static com.android.tools.r8.keepanno.ast.KeepSpecUtils.doBuild;
+
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Edge;
+import com.android.tools.r8.keepanno.utils.Unimplemented;
 import java.util.function.Consumer;
 import java.util.function.Function;
 
-/** Base class for the declarations represented in the keep annoations library. */
+/** Base class for the declarations represented in the keep annotations library. */
 public abstract class KeepDeclaration {
 
   public abstract KeepEdgeMetaInfo getMetaInfo();
@@ -47,4 +52,21 @@
   public final int hashCode() {
     throw new RuntimeException();
   }
+
+  public final void buildDeclarationProto(KeepSpecProtos.Declaration.Builder builder) {
+    match(
+        edge -> doBuild(KeepSpecProtos.Edge.newBuilder(), edge::buildEdgeProto, builder::setEdge),
+        check -> {
+          throw new Unimplemented();
+        });
+  }
+
+  public static KeepDeclaration fromProto(
+      KeepSpecProtos.Declaration declaration, KeepSpecVersion version) {
+    if (declaration.hasEdge()) {
+      Edge edge = declaration.getEdge();
+      return KeepEdge.builder().applyProto(edge, version).build();
+    }
+    throw new Unimplemented();
+  }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
index 6a741ce..a56f872 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdge.java
@@ -3,7 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
-import com.android.tools.r8.keepanno.proto.KeepAnnoProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Edge;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MetaInfo;
+import com.android.tools.r8.keepanno.utils.Unimplemented;
 
 /**
  * An edge in the keep graph.
@@ -146,8 +149,9 @@
 
     private Builder() {}
 
-    public Builder applyProto(KeepAnnoProtos.Edge edge) {
+    public Builder applyProto(Edge edge, KeepSpecVersion version) {
       // TODO(b/343389186): implement this.
+      KeepEdgeMetaInfo.builder().applyProto(edge.getMetaInfo(), version).build();
       return this;
     }
 
@@ -264,7 +268,8 @@
         + '}';
   }
 
-  public void buildProto(KeepAnnoProtos.Edge.Builder builder) {
-    // TODO(b/343389186): implement this.
+  public void buildEdgeProto(KeepSpecProtos.Edge.Builder builder) {
+    KeepSpecUtils.doBuild(MetaInfo.newBuilder(), getMetaInfo()::buildProto, builder::setMetaInfo);
+    throw new Unimplemented();
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdgeMetaInfo.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdgeMetaInfo.java
index 9cf3305..2b2aa8d 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdgeMetaInfo.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepEdgeMetaInfo.java
@@ -3,24 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
+import static com.android.tools.r8.keepanno.ast.KeepSpecUtils.desc;
+
 import com.android.tools.r8.keepanno.keeprules.RulePrintingUtils;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Context;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.FieldDesc;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MetaInfo;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.MethodDesc;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.TypeDesc;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import org.objectweb.asm.Type;
 
 public class KeepEdgeMetaInfo {
 
-  public enum KeepEdgeVersion {
-    UNKNOWN;
-
-    public String toVersionString() {
-      return name();
-    }
-  }
-
   private static final KeepEdgeMetaInfo NONE =
       new KeepEdgeMetaInfo(
-          KeepEdgeVersion.UNKNOWN, KeepEdgeContext.none(), KeepEdgeDescription.empty());
+          KeepSpecVersion.UNKNOWN, KeepEdgeContext.none(), KeepEdgeDescription.empty());
 
   public static KeepEdgeMetaInfo none() {
     return NONE;
@@ -30,12 +30,12 @@
     return new Builder();
   }
 
-  private final KeepEdgeVersion version;
+  private final KeepSpecVersion version;
   private final KeepEdgeContext context;
   private final KeepEdgeDescription description;
 
   private KeepEdgeMetaInfo(
-      KeepEdgeVersion version, KeepEdgeContext context, KeepEdgeDescription description) {
+      KeepSpecVersion version, KeepEdgeContext context, KeepEdgeDescription description) {
     this.version = version;
     this.context = context;
     this.description = description;
@@ -58,10 +58,10 @@
   }
 
   public boolean hasVersion() {
-    return version != KeepEdgeVersion.UNKNOWN;
+    return version != KeepSpecVersion.UNKNOWN;
   }
 
-  public KeepEdgeVersion getVersion() {
+  public KeepSpecVersion getVersion() {
     return version;
   }
 
@@ -80,30 +80,61 @@
     return "MetaInfo{" + String.join(", ", props) + "}";
   }
 
+  public void buildProto(MetaInfo.Builder builder) {
+    KeepSpecUtils.doBuild(Context.newBuilder(), context::buildProto, builder::setContext);
+    if (!description.isEmpty()) {
+      builder.setDescription(description.description);
+    }
+  }
+
   public static class Builder {
+    private KeepSpecVersion version = KeepSpecVersion.UNKNOWN;
     private KeepEdgeContext context = KeepEdgeContext.none();
     private KeepEdgeDescription description = KeepEdgeDescription.empty();
 
+    public Builder applyProto(MetaInfo metaInfo, KeepSpecVersion version) {
+      setVersion(version);
+      context = KeepEdgeContext.fromProto(metaInfo.getContext());
+      setDescription(metaInfo.getDescription());
+      return this;
+    }
+
+    public Builder setVersion(KeepSpecVersion version) {
+      this.version = version;
+      return this;
+    }
+
     public Builder setDescription(String description) {
-      this.description = new KeepEdgeDescription(description);
+      this.description =
+          description.isEmpty() ? KeepEdgeDescription.EMPTY : new KeepEdgeDescription(description);
+      return this;
+    }
+
+    public Builder setContext(KeepEdgeContext context) {
+      this.context = context;
       return this;
     }
 
     public Builder setContextFromClassDescriptor(String classDescriptor) {
-      context = new KeepEdgeClassContext(classDescriptor);
-      return this;
+      return setContext(new KeepEdgeClassContext(classDescriptor));
     }
 
     public Builder setContextFromMethodDescriptor(
         String classDescriptor, String methodName, String methodDescriptor) {
-      context = new KeepEdgeMethodContext(classDescriptor, methodName, methodDescriptor);
-      return this;
+      Type methodType = Type.getMethodType(methodDescriptor);
+      Type[] argumentTypes = methodType.getArgumentTypes();
+      List<String> parameters = new ArrayList<>(argumentTypes.length);
+      for (Type argumentType : argumentTypes) {
+        parameters.add(argumentType.getDescriptor());
+      }
+      return setContext(
+          new KeepEdgeMethodContext(
+              classDescriptor, methodName, methodType.getReturnType().getDescriptor(), parameters));
     }
 
     public Builder setContextFromFieldDescriptor(
         String classDescriptor, String fieldName, String fieldType) {
-      context = new KeepEdgeFieldContext(classDescriptor, fieldName, fieldType);
-      return this;
+      return setContext(new KeepEdgeFieldContext(classDescriptor, fieldName, fieldType));
     }
 
     public KeepEdgeMetaInfo build() {
@@ -111,7 +142,7 @@
           && description.equals(KeepEdgeDescription.empty())) {
         return none();
       }
-      return new KeepEdgeMetaInfo(KeepEdgeVersion.UNKNOWN, context, description);
+      return new KeepEdgeMetaInfo(version, context, description);
     }
   }
 
@@ -124,6 +155,32 @@
 
     private KeepEdgeContext() {}
 
+    public static KeepEdgeContext fromProto(Context context) {
+      if (context.hasClassDesc()) {
+        return new KeepEdgeClassContext(context.getClassDesc().getDesc());
+      }
+      if (context.hasMethodDesc()) {
+        MethodDesc methodDesc = context.getMethodDesc();
+        List<String> parameters = new ArrayList<>(methodDesc.getParameterTypesCount());
+        for (TypeDesc typeDesc : methodDesc.getParameterTypesList()) {
+          parameters.add(typeDesc.getDesc());
+        }
+        return new KeepEdgeMethodContext(
+            methodDesc.getHolder().getDesc(),
+            methodDesc.getName(),
+            methodDesc.getReturnType().getDesc(),
+            parameters);
+      }
+      if (context.hasFieldDesc()) {
+        FieldDesc fieldDesc = context.getFieldDesc();
+        return new KeepEdgeFieldContext(
+            fieldDesc.getHolder().getDesc(),
+            fieldDesc.getName(),
+            fieldDesc.getFieldType().getDesc());
+      }
+      return none();
+    }
+
     public String getDescriptorString() {
       throw new KeepEdgeException("Invalid attempt to get descriptor string from none context");
     }
@@ -137,6 +194,10 @@
     public int hashCode() {
       return System.identityHashCode(this);
     }
+
+    public void buildProto(Context.Builder builder) {
+      assert this == none();
+    }
   }
 
   private static class KeepEdgeClassContext extends KeepEdgeContext {
@@ -168,26 +229,41 @@
     public int hashCode() {
       return classDescriptor.hashCode();
     }
+
+    @Override
+    public void buildProto(Context.Builder builder) {
+      builder.setClassDesc(desc(classDescriptor));
+    }
   }
 
   private static class KeepEdgeMethodContext extends KeepEdgeContext {
     private final String classDescriptor;
     private final String methodName;
-    private final String methodDescriptor;
+    private final String methodReturnType;
+    private final List<String> methodParameters;
 
     public KeepEdgeMethodContext(
-        String classDescriptor, String methodName, String methodDescriptor) {
+        String classDescriptor,
+        String methodName,
+        String methodReturnType,
+        List<String> methodParameters) {
       assert classDescriptor != null;
       assert methodName != null;
-      assert methodDescriptor != null;
+      assert methodParameters != null;
       this.classDescriptor = classDescriptor;
       this.methodName = methodName;
-      this.methodDescriptor = methodDescriptor;
+      this.methodReturnType = methodReturnType;
+      this.methodParameters = methodParameters;
     }
 
     @Override
     public String getDescriptorString() {
-      return classDescriptor + methodName + methodDescriptor;
+      StringBuilder builder = new StringBuilder();
+      builder.append(classDescriptor).append(methodName).append('(');
+      for (String parameter : methodParameters) {
+        builder.append(parameter);
+      }
+      return builder.append(')').append(methodReturnType).toString();
     }
 
     @Override
@@ -201,12 +277,26 @@
       KeepEdgeMethodContext that = (KeepEdgeMethodContext) o;
       return classDescriptor.equals(that.classDescriptor)
           && methodName.equals(that.methodName)
-          && methodDescriptor.equals(that.methodDescriptor);
+          && methodReturnType.equals(that.methodReturnType)
+          && methodParameters.equals(that.methodParameters);
     }
 
     @Override
     public int hashCode() {
-      return Objects.hash(classDescriptor, methodName, methodDescriptor);
+      return Objects.hash(classDescriptor, methodName, methodReturnType, methodParameters);
+    }
+
+    @Override
+    public void buildProto(Context.Builder builder) {
+      MethodDesc.Builder methodBuilder =
+          MethodDesc.newBuilder()
+              .setHolder(desc(classDescriptor))
+              .setName(methodName)
+              .setReturnType(desc(methodReturnType));
+      for (String methodParameter : methodParameters) {
+        methodBuilder.addParameterTypes(desc(methodParameter));
+      }
+      builder.setMethodDesc(methodBuilder.build());
     }
   }
 
@@ -244,6 +334,16 @@
     public int hashCode() {
       return Objects.hash(classDescriptor, fieldName, fieldType);
     }
+
+    @Override
+    public void buildProto(Context.Builder builder) {
+      builder.setFieldDesc(
+          FieldDesc.newBuilder()
+              .setHolder(desc(classDescriptor))
+              .setName(fieldName)
+              .setFieldType(desc(fieldType))
+              .build());
+    }
   }
 
   private static class KeepEdgeDescription {
@@ -261,12 +361,11 @@
     }
 
     @Override
-    @SuppressWarnings("EqualsGetClass")
     public boolean equals(Object o) {
       if (this == o) {
         return true;
       }
-      if (o == null || getClass() != o.getClass()) {
+      if (!(o instanceof KeepEdgeDescription)) {
         return false;
       }
       KeepEdgeDescription that = (KeepEdgeDescription) o;
@@ -282,5 +381,9 @@
     public String toString() {
       return description;
     }
+
+    public boolean isEmpty() {
+      return description.isEmpty();
+    }
   }
 }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java
new file mode 100644
index 0000000..2e45c4c
--- /dev/null
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecUtils.java
@@ -0,0 +1,29 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.keepanno.ast;
+
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.TypeDesc;
+import com.google.protobuf.MessageOrBuilder;
+import java.util.function.Consumer;
+
+public final class KeepSpecUtils {
+
+  private KeepSpecUtils() {}
+
+  public static <T extends MessageOrBuilder> void doBuild(
+      T builder, Consumer<T> buildMethod, Consumer<T> setter) {
+    buildMethod.accept(builder);
+    setter.accept(builder);
+  }
+
+  public static <T extends MessageOrBuilder> String toString(T builder, Consumer<T> buildMethod) {
+    buildMethod.accept(builder);
+    return builder.toString();
+  }
+
+  public static TypeDesc desc(String descriptor) {
+    return TypeDesc.newBuilder().setDesc(descriptor).build();
+  }
+}
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecVersion.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecVersion.java
new file mode 100644
index 0000000..c9034a6
--- /dev/null
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepSpecVersion.java
@@ -0,0 +1,48 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.keepanno.ast;
+
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Version;
+
+public enum KeepSpecVersion {
+  UNKNOWN(0, 0, 0),
+  ALPHA(0, 1, 0);
+
+  private final int major;
+  private final int minor;
+  private final int patch;
+
+  KeepSpecVersion(int major, int minor, int patch) {
+    this.major = major;
+    this.minor = minor;
+    this.patch = patch;
+  }
+
+  public static KeepSpecVersion getCurrent() {
+    return ALPHA;
+  }
+
+  public static KeepSpecVersion fromProto(Version version) {
+    for (KeepSpecVersion value : values()) {
+      if (value.major == version.getMajor()
+          && value.minor == version.getMinor()
+          && value.patch == version.getPatch()) {
+        return value;
+      }
+    }
+    return UNKNOWN;
+  }
+
+  public String toVersionString() {
+    return "" + major + "." + minor + "." + patch;
+  }
+
+  public void buildProto(KeepSpecProtos.Version.Builder builder) {
+    builder.setMajor(major);
+    builder.setMinor(minor);
+    builder.setPatch(patch);
+  }
+}
diff --git a/src/keepanno/proto/keepanno.proto b/src/keepanno/proto/keepanno.proto
deleted file mode 100644
index a4f96d7..0000000
--- a/src/keepanno/proto/keepanno.proto
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-syntax = "proto3";
-
-package com.android.tools.r8.keepanno.proto;
-
-// All messages are placed under the outer class. This makes it a bit nicer to
-// implement the AST <-> Proto conversions without type conflicts.
-option java_multiple_files = false;
-
-// Descriptive name of the outer class (default would have been `Keepanno`).
-option java_outer_classname = "KeepAnnoProtos";
-
-// Java package consistent with R8 convention.
-option java_package = "com.android.tools.r8.keepanno.proto";
-
-message Version {
-  uint32 major = 1;
-  uint32 minor = 2;
-  uint32 patch = 3;
-}
-
-message Context {
-  oneof context_oneof {
-    string class_descriptor = 1;
-    string method_descriptor = 2;
-    string field_descriptor = 3;
-  }
-}
-
-message MetaInfo {
-  Version version = 1;
-  Context context = 2;
-}
-
-message Declaration {
-  MetaInfo meta_info = 1;
-  oneof decl_oneof {
-    Edge edge = 2;
-    CheckRemoved check_removed = 3;
-    CheckDiscarded check_discarded = 4;
-  }
-}
-
-message CheckRemoved {
-  // TODO(b/343389186): Add content.
-}
-
-message CheckDiscarded {
-  // TODO(b/343389186): Add content.
-}
-
-message Edge {
-  // TODO(b/343389186): Add content.
-}
diff --git a/src/keepanno/proto/keepspec.proto b/src/keepanno/proto/keepspec.proto
new file mode 100644
index 0000000..b5d5fd3
--- /dev/null
+++ b/src/keepanno/proto/keepspec.proto
@@ -0,0 +1,85 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+syntax = "proto3";
+
+package com.android.tools.r8.keepanno.proto;
+
+// All messages are placed under the outer class. This makes it a bit nicer to
+// implement the AST <-> Proto conversions without type conflicts.
+option java_multiple_files = false;
+
+// Camel-case the outer class name (default is `Keepspec`).
+option java_outer_classname = "KeepSpecProtos";
+
+// Java package consistent with R8 convention.
+option java_package = "com.android.tools.r8.keepanno.proto";
+
+// Top-level container for the keep specification
+message KeepSpec {
+  Version version = 1;
+  repeated Declaration declarations = 2;
+}
+
+message Version {
+  uint32 major = 1;
+  uint32 minor = 2;
+  uint32 patch = 3;
+}
+
+message Declaration {
+  oneof decl_oneof {
+    Edge edge = 2;
+    CheckRemoved check_removed = 3;
+    CheckOptimizedOut check_optimized_out = 4;
+  }
+}
+
+// Note: the messages and fields avoid the use of `descriptor` in any place as
+// that name is used internally in the protobuf encodings. We consistently use
+// the short-form `desc` throughout.
+
+message Context {
+  oneof context_oneof {
+    TypeDesc class_desc = 1;
+    MethodDesc method_desc = 2;
+    FieldDesc field_desc = 3;
+  }
+}
+
+message TypeDesc {
+  string desc = 1;
+}
+
+message MethodDesc {
+  string name = 1;
+  TypeDesc holder = 2;
+  TypeDesc returnType = 3;
+  repeated TypeDesc parameterTypes = 4;
+}
+
+message FieldDesc {
+  string name = 1;
+  TypeDesc holder = 2;
+  TypeDesc fieldType = 3;
+}
+
+message MetaInfo {
+  Context context = 1;
+  string description = 2;
+}
+
+message CheckRemoved {
+  MetaInfo meta_info = 1;
+  // TODO(b/343389186): Add content.
+}
+
+message CheckOptimizedOut {
+  MetaInfo meta_info = 1;
+  // TODO(b/343389186): Add content.
+}
+
+message Edge {
+  MetaInfo meta_info = 1;
+  // TODO(b/343389186): Add content.
+}
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index ce2e296..74f9c92 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -94,6 +94,7 @@
 import com.android.tools.r8.shaking.Enqueuer.Mode;
 import com.android.tools.r8.shaking.EnqueuerFactory;
 import com.android.tools.r8.shaking.EnqueuerResult;
+import com.android.tools.r8.shaking.KeepSpecificationSource;
 import com.android.tools.r8.shaking.MainDexInfo;
 import com.android.tools.r8.shaking.MainDexListBuilder;
 import com.android.tools.r8.shaking.ProguardConfigurationRule;
@@ -310,6 +311,8 @@
       timing.begin("Register references and more setup");
       assert ArtProfileCompletenessChecker.verify(appView);
 
+      readKeepSpecifications(appView, keepDeclarations);
+
       // Check for potentially having pass-through of Cf-code for kotlin libraries.
       options.enableCfByteCodePassThrough =
           options.isGeneratingClassFiles() && KotlinMetadataUtils.mayProcessKotlinMetadata(appView);
@@ -894,6 +897,19 @@
     }
   }
 
+  private void readKeepSpecifications(
+      AppView<AppInfoWithClassHierarchy> appView, List<KeepDeclaration> keepDeclarations) {
+    timing.begin("Read keep specifications");
+    try {
+      for (KeepSpecificationSource source : appView.options().getKeepSpecifications()) {
+        source.parse(keepDeclarations::add);
+      }
+    } catch (ResourceException e) {
+      options.reporter.error(new ExceptionDiagnostic(e, e.getOrigin()));
+    }
+    timing.end();
+  }
+
   private void writeKeepDeclarationsToConfigurationConsumer(
       List<KeepDeclaration> keepDeclarations) {
     if (options.configurationConsumer == null) {
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index adfaf29..36f1ff3 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.profile.art.ArtProfileForRewriting;
 import com.android.tools.r8.shaking.FilteredClassPath;
+import com.android.tools.r8.shaking.KeepSpecificationSource;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
 import com.android.tools.r8.shaking.ProguardConfigurationParserOptions;
@@ -120,6 +121,7 @@
     private Consumer<ProguardConfiguration.Builder> proguardConfigurationConsumerForTesting = null;
     private Consumer<List<ProguardConfigurationRule>> syntheticProguardRulesConsumer = null;
     private StringConsumer desugaredLibraryKeepRuleConsumer = null;
+    private final List<KeepSpecificationSource> keepSpecifications = new ArrayList<>();
     private final List<ProguardConfigurationSource> proguardConfigs = new ArrayList<>();
     private boolean disableTreeShaking = false;
     private boolean disableMinification = false;
@@ -235,6 +237,20 @@
       return self();
     }
 
+    public Builder addKeepSpecificationFiles(Path... paths) {
+      return addKeepSpecificationFiles(Arrays.asList(paths));
+    }
+
+    public Builder addKeepSpecificationFiles(Collection<Path> paths) {
+      paths.forEach(p -> keepSpecifications.add(KeepSpecificationSource.fromFile(p)));
+      return self();
+    }
+
+    public Builder addKeepSpecificationData(byte[] data, Origin origin) {
+      keepSpecifications.add(KeepSpecificationSource.fromBytes(origin, data));
+      return self();
+    }
+
     /**
      * Set Proguard compatibility mode.
      *
@@ -755,7 +771,8 @@
               getCancelCompilationChecker(),
               androidResourceProvider,
               androidResourceConsumer,
-              resourceShrinkerConfiguration);
+              resourceShrinkerConfiguration,
+              keepSpecifications);
 
       if (inputDependencyGraphConsumer != null) {
         inputDependencyGraphConsumer.finished();
@@ -933,6 +950,7 @@
 
   private final List<ProguardConfigurationRule> mainDexKeepRules;
   private final ProguardConfiguration proguardConfiguration;
+  private final List<KeepSpecificationSource> keepSpecifications;
   private final boolean enableTreeShaking;
   private final boolean enableMinification;
   private final boolean forceProguardCompatibility;
@@ -1051,7 +1069,8 @@
       CancelCompilationChecker cancelCompilationChecker,
       AndroidResourceProvider androidResourceProvider,
       AndroidResourceConsumer androidResourceConsumer,
-      ResourceShrinkerConfiguration resourceShrinkerConfiguration) {
+      ResourceShrinkerConfiguration resourceShrinkerConfiguration,
+      List<KeepSpecificationSource> keepSpecifications) {
     super(
         inputApp,
         mode,
@@ -1078,6 +1097,7 @@
     assert mainDexKeepRules != null;
     this.mainDexKeepRules = mainDexKeepRules;
     this.proguardConfiguration = proguardConfiguration;
+    this.keepSpecifications = keepSpecifications;
     this.enableTreeShaking = enableTreeShaking;
     this.enableMinification = enableMinification;
     this.forceProguardCompatibility = forceProguardCompatibility;
@@ -1105,6 +1125,7 @@
     super(printHelp, printVersion);
     mainDexKeepRules = ImmutableList.of();
     proguardConfiguration = null;
+    keepSpecifications = null;
     enableTreeShaking = false;
     enableMinification = false;
     forceProguardCompatibility = false;
@@ -1164,6 +1185,8 @@
                 && !internal.isShrinking()
                 && !internal.isMinifying());
 
+    internal.setKeepSpecificationSources(keepSpecifications);
+
     assert !internal.verbose;
     internal.mainDexKeepRules = mainDexKeepRules;
     internal.minimalMainDex = internal.debug;
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java b/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java
new file mode 100644
index 0000000..b7c4fe8
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/shaking/KeepSpecificationSource.java
@@ -0,0 +1,91 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.shaking;
+
+import com.android.tools.r8.ResourceException;
+import com.android.tools.r8.keepanno.ast.KeepDeclaration;
+import com.android.tools.r8.keepanno.ast.KeepSpecVersion;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Declaration;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.KeepSpec;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.origin.PathOrigin;
+import com.google.protobuf.InvalidProtocolBufferException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+
+public abstract class KeepSpecificationSource {
+
+  public static KeepSpecificationSource fromFile(Path path) {
+    return new KeepSpecificationFile(path);
+  }
+
+  public static KeepSpecificationSource fromBytes(Origin origin, byte[] bytes) {
+    return new KeepSpecificationBytes(origin, bytes);
+  }
+
+  private final Origin origin;
+
+  private KeepSpecificationSource(Origin origin) {
+    this.origin = origin;
+  }
+
+  public Origin getOrigin() {
+    return origin;
+  }
+
+  public void parse(Consumer<KeepDeclaration> consumer) throws ResourceException {
+    KeepSpec spec = read();
+    KeepSpecVersion version = KeepSpecVersion.fromProto(spec.getVersion());
+    if (version == KeepSpecVersion.UNKNOWN) {
+      throw new ResourceException(getOrigin(), "Unknown keepspec version " + spec.getVersion());
+    }
+    for (Declaration declaration : spec.getDeclarationsList()) {
+      consumer.accept(KeepDeclaration.fromProto(declaration, version));
+    }
+  }
+
+  abstract KeepSpec read() throws ResourceException;
+
+  private static class KeepSpecificationFile extends KeepSpecificationSource {
+
+    private final Path path;
+
+    private KeepSpecificationFile(Path path) {
+      super(new PathOrigin(path));
+      this.path = path;
+    }
+
+    @Override
+    KeepSpec read() throws ResourceException {
+      try (InputStream stream = Files.newInputStream(path)) {
+        return KeepSpec.parseFrom(stream);
+      } catch (IOException e) {
+        throw new ResourceException(getOrigin(), e);
+      }
+    }
+  }
+
+  private static class KeepSpecificationBytes extends KeepSpecificationSource {
+
+    private final byte[] content;
+
+    public KeepSpecificationBytes(Origin origin, byte[] bytes) {
+      super(origin);
+      this.content = bytes;
+    }
+
+    @Override
+    KeepSpec read() throws ResourceException {
+      try {
+        return KeepSpec.parseFrom(content);
+      } catch (InvalidProtocolBufferException e) {
+        throw new ResourceException(getOrigin(), e);
+      }
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index b3d395b..ef49e3a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -100,6 +100,7 @@
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.Enqueuer;
 import com.android.tools.r8.shaking.GlobalKeepInfoConfiguration;
+import com.android.tools.r8.shaking.KeepSpecificationSource;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationRule;
 import com.android.tools.r8.threading.ThreadingModule;
@@ -118,6 +119,7 @@
 import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Deque;
@@ -240,6 +242,8 @@
   private final ProguardConfiguration proguardConfiguration;
   public final Reporter reporter;
 
+  private Collection<KeepSpecificationSource> keepSpecificationSources = Collections.emptyList();
+
   // TODO(zerny): Make this private-final once we have full program-consumer support.
   public ProgramConsumer programConsumer = null;
 
@@ -314,6 +318,14 @@
     return lazyThreadingModule;
   }
 
+  public Collection<KeepSpecificationSource> getKeepSpecifications() {
+    return keepSpecificationSources;
+  }
+
+  public void setKeepSpecificationSources(Collection<KeepSpecificationSource> specifications) {
+    keepSpecificationSources = specifications;
+  }
+
   private void keepDebugRelatedInformation() {
     assert !proguardConfiguration.isObfuscating();
     getProguardConfiguration().getKeepAttributes().sourceFile = true;
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index 3a4a3c4..5d93d82 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -23,7 +23,13 @@
 import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
 import com.android.tools.r8.keepanno.asm.KeepEdgeWriter;
 import com.android.tools.r8.keepanno.ast.KeepDeclaration;
+import com.android.tools.r8.keepanno.ast.KeepSpecUtils;
+import com.android.tools.r8.keepanno.ast.KeepSpecVersion;
 import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractorOptions;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Declaration;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.KeepSpec;
+import com.android.tools.r8.keepanno.proto.KeepSpecProtos.Version;
+import com.android.tools.r8.keepanno.utils.Unimplemented;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -280,6 +286,29 @@
       if (isNormalizeEdges()) {
         List<KeepDeclaration> declarations = KeepEdgeReader.readKeepEdges(classFileData);
         if (!declarations.isEmpty()) {
+          List<KeepDeclaration> legacyExtract = new ArrayList<>();
+          KeepSpec.Builder keepSpecBuilder = KeepSpec.newBuilder();
+          KeepSpecUtils.doBuild(
+              Version.newBuilder(),
+              KeepSpecVersion.getCurrent()::buildProto,
+              keepSpecBuilder::setVersion);
+          for (KeepDeclaration declaration : declarations) {
+            try {
+              KeepSpecUtils.doBuild(
+                  Declaration.newBuilder(),
+                  declaration::buildDeclarationProto,
+                  keepSpecBuilder::addDeclarations);
+            } catch (Unimplemented e) {
+              legacyExtract.add(declaration);
+            }
+          }
+          builder
+              .getBuilder()
+              .addKeepSpecificationData(keepSpecBuilder.build().toByteArray(), Origin.unknown());
+          if (legacyExtract.isEmpty()) {
+            // TODO(b/343389186): Finish the proto encoding and remove the below extraction.
+            return;
+          }
           String binaryName =
               DescriptorUtils.getBinaryNameFromDescriptor(extractClassDescriptor(classFileData));
           String synthesizingTarget = binaryName + "$$ExtractedKeepEdges";
@@ -292,7 +321,7 @@
               "java/lang/Object",
               null);
           KeepEdgeWriter.writeExtractedEdges(
-              declarations,
+              legacyExtract,
               (descriptor, visible) ->
                   KeepAnnoTestUtils.wrap(classWriter.visitAnnotation(descriptor, visible)));
           classWriter.visitEnd();
