diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index a939e1a..2c9ca25 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -1076,7 +1076,7 @@
     private final Map<DexProgramClass, DexEncodedArray> classToStaticFieldValues =
         new IdentityHashMap<>();
 
-    private final AndroidApiLevel minApiLevel;
+    private final InternalOptions options;
 
     private static <T> Object2IntMap<T> createObject2IntMap() {
       Object2IntMap<T> result = new Object2IntLinkedOpenHashMap<>();
@@ -1091,7 +1091,7 @@
     }
 
     private MixedSectionOffsets(InternalOptions options) {
-      this.minApiLevel = options.getMinApiLevel();
+      this.options = options;
     }
 
     private <T> boolean add(Object2IntMap<T> map, T item) {
@@ -1122,9 +1122,7 @@
 
     @Override
     public boolean add(DexAnnotationSet annotationSet) {
-      // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
-      // work around a DALVIK bug. See b/36951668.
-      if (minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1) && annotationSet.isEmpty()) {
+      if (!options.canHaveDalvikEmptyAnnotationSetBug() && annotationSet.isEmpty()) {
         return false;
       }
       return add(annotationSets, annotationSet);
@@ -1281,9 +1279,7 @@
     }
 
     public int getOffsetFor(DexAnnotationSet annotationSet) {
-      // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
-      // work around a DALVIK bug. See b/36951668.
-      if ((minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) && annotationSet.isEmpty()) {
+      if (!options.canHaveDalvikEmptyAnnotationSetBug() && annotationSet.isEmpty()) {
         return 0;
       }
       return lookup(annotationSet, annotationSets);
@@ -1332,9 +1328,7 @@
     }
 
     void setOffsetFor(DexAnnotationSet annotationSet, int offset) {
-      // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to
-      // work around a DALVIK bug. See b/36951668.
-      assert (minApiLevel.isLessThan(AndroidApiLevel.J_MR1)) || !annotationSet.isEmpty();
+      assert options.canHaveDalvikEmptyAnnotationSetBug() || !annotationSet.isEmpty();
       setOffsetFor(annotationSet, offset, annotationSets);
     }
 
diff --git a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
index 11a22f6..b5ccc6b 100644
--- a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
@@ -143,17 +143,35 @@
 
   private class StartupIndexedItemCollection implements IndexedItemCollection {
 
+    private void addAnnotation(DexAnnotation annotation) {
+      annotationLayout.add(annotation);
+    }
+
+    private void addAnnotationSet(DexAnnotationSet annotationSet) {
+      if (appView.options().canHaveDalvikEmptyAnnotationSetBug() || !annotationSet.isEmpty()) {
+        annotationSetLayout.add(annotationSet);
+      }
+    }
+
+    private void addAnnotationSetRefList(ParameterAnnotationsList annotationSetRefList) {
+      if (!annotationSetRefList.isEmpty()) {
+        annotationSetRefListLayout.add(annotationSetRefList);
+      }
+    }
+
     @Override
     public boolean addClass(DexProgramClass clazz) {
-      classDataLayout.add(clazz);
-      typeListLayout.add(clazz.getInterfaces());
+      if (clazz.hasMethodsOrFields()) {
+        classDataLayout.add(clazz);
+      }
+      addTypeList(clazz.getInterfaces());
       clazz.forEachProgramMethodMatching(DexEncodedMethod::hasCode, codeLayout::add);
       DexAnnotationDirectory annotationDirectory =
           mixedSectionOffsets.getAnnotationDirectoryForClass(clazz);
       if (annotationDirectory != null) {
         annotationDirectoryLayout.add(annotationDirectory);
         annotationDirectory.visitAnnotations(
-            annotationLayout::add, annotationSetLayout::add, annotationSetRefListLayout::add);
+            this::addAnnotation, this::addAnnotationSet, this::addAnnotationSetRefList);
       }
       DexEncodedArray staticFieldValues = mixedSectionOffsets.getStaticFieldValuesForClass(clazz);
       if (staticFieldValues != null) {
@@ -179,7 +197,7 @@
 
     @Override
     public boolean addProto(DexProto proto) {
-      typeListLayout.add(proto.getParameters());
+      addTypeList(proto.getParameters());
       return true;
     }
 
@@ -188,6 +206,12 @@
       return true;
     }
 
+    private void addTypeList(DexTypeList typeList) {
+      if (!typeList.isEmpty()) {
+        typeListLayout.add(typeList);
+      }
+    }
+
     @Override
     public boolean addCallSite(DexCallSite callSite) {
       encodedArrayLayout.add(callSite.getEncodedArray());
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 06a3be7..95120b2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2517,4 +2517,10 @@
   public boolean canHaveInvokeInterfaceToObjectMethodBug() {
     return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.P);
   }
+
+  // Until we fully drop support for API levels < 16, we have to emit an empty annotation set to
+  // work around a DALVIK bug. See b/36951668.
+  public boolean canHaveDalvikEmptyAnnotationSetBug() {
+    return minApiLevel.isLessThan(AndroidApiLevel.J_MR1);
+  }
 }
