Refactor DexInspector and inner classes into dexinspector package.

- Inner classes moved up to package level.
- Non-static inner classes take DexInspector in constructor.
- DexInspectorMatchers also moved into package, renamed to Matchers.
- DexInspector's private fields and methods used by the inner classes
  changed to package-private.

Change-Id: I698d3fa807ddb8db31f4b94eab9978fe7aa6f3de
diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index b3950b4..c773989 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -9,7 +9,7 @@
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 7328c6e..801abae 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -12,18 +12,17 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ToolHelper.DexVm.Kind;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ArtErrorParser;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableListMultimap;
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index be9261f..36a5fb3 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -11,9 +11,9 @@
 import com.android.tools.r8.VmTestRunner.IgnoreIfVmOlderThan;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
 import com.android.tools.r8.utils.OffOrAuto;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index b0876c9..2a17917 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -14,14 +14,14 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
@@ -49,7 +49,6 @@
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
-import org.junit.rules.TestWatcher;
 
 public abstract class RunExamplesAndroidOTest
       <B extends BaseCommand.Builder<? extends BaseCommand, B>> {
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index 4701ac3..aa17280 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -13,13 +13,13 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 60ebf39..d1894fb 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -4,9 +4,9 @@
 
 package com.android.tools.r8;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
 import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.ZIP_EXTENSION;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -14,15 +14,15 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 855265d..2d951fa 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -20,14 +20,14 @@
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.PreloadedClassFileProvider;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
 import com.android.tools.r8.utils.ZipUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
index d88f3c9..706b50b 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationTestBase.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPublic;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPublic;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -16,9 +16,9 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import org.junit.runner.RunWith;
 
 @RunWith(VmTestRunner.class)
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
index 01d5621..713c467 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/ConstructorRelaxationTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
@@ -11,8 +11,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
index 1f97c11..4459699 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.accessrelaxation;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -24,8 +24,8 @@
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.function.Consumer;
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
index d5190e6..9bfd4e2 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.accessrelaxation;
 
+
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.accessrelaxation.privateinstance.Base;
@@ -17,7 +18,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/bisect/BisectTest.java b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
index 82a4a94..a692b9e 100644
--- a/src/test/java/com/android/tools/r8/bisect/BisectTest.java
+++ b/src/test/java/com/android/tools/r8/bisect/BisectTest.java
@@ -14,9 +14,9 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
index cc8633e4..77b251d 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -16,9 +16,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
index 160ad59..8fcf7a3 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/EmptyBridgeTest.java
@@ -3,16 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
index 60df7d2..272406f 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/RemoveVisibilityBridgeMethodsTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.bridgeremoval;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
index 55ff3a2..f1eddcd 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
@@ -7,8 +7,8 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestBase;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
index fd696bc..d285dc6 100644
--- a/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
+++ b/src/test/java/com/android/tools/r8/cf/IdenticalCatchHandlerTest.java
@@ -19,7 +19,7 @@
 import com.android.tools.r8.graph.DexCode.Try;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
 import it.unimi.dsi.fastutil.ints.IntSet;
diff --git a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
index 6c9d7b6..e1d110c 100644
--- a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
@@ -18,7 +18,7 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
index 7565dee..6196081 100644
--- a/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/SynchronizedNoopTestRunner.java
@@ -15,7 +15,7 @@
 import com.android.tools.r8.graph.JarCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.util.ArrayList;
 import java.util.Collections;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
index 7635f0c..91e7b5d 100644
--- a/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/ClassMergingTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.classmerging;
 
 import static com.android.tools.r8.smali.SmaliBuilder.buildCode;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -29,11 +29,11 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
diff --git a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
index 83e711c..d524d7c 100644
--- a/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
+++ b/src/test/java/com/android/tools/r8/code/NativeMethodWithCodeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.code;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
index 502fa95..7d27c5e 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
index 178337a..0d5849b 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatProguardSmaliTestBase.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.nio.file.Path;
 import java.util.List;
 
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
index 5ef5830..3d9c912 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
index 665919b..e478115 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.code.ReturnVoid;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
index 36cdad0..d0f9d20 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
@@ -7,9 +7,9 @@
 
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.jasmin.JasminBuilder;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
index 2f995db..1bb357f 100644
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
index 4ce3b5a..aa8bc0c 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoInspector.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.HashSet;
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
index d452699..f37b5ed 100644
--- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
+++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -26,7 +26,7 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Files;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
index a0b2515..7c4c250 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
@@ -20,9 +20,9 @@
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dexsplitter.DexSplitter.Options;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.FileNotFoundException;
diff --git a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
index 6877617..8cba9a0 100644
--- a/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
+++ b/src/test/java/com/android/tools/r8/graph/TargetLookupTest.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index 39c8d28..3987e0a 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -28,12 +28,12 @@
 import com.android.tools.r8.utils.ArtErrorParser;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundFieldSubject;
-import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closer;
 import java.io.File;
diff --git a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
index d4ab6c6..f02098a 100644
--- a/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/IrInjectionTestBase.java
@@ -20,9 +20,9 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.util.List;
 import java.util.ListIterator;
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
index 16785f6..de97052 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NullabilityTest.java
@@ -25,18 +25,18 @@
 import com.android.tools.r8.ir.code.NewInstance;
 import com.android.tools.r8.ir.code.NonNull;
 import com.android.tools.r8.ir.code.Value;
+import com.android.tools.r8.ir.optimize.NonNullTracker;
 import com.android.tools.r8.ir.optimize.nonnull.FieldAccessTest;
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterArrayAccess;
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterFieldAccess;
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterInvoke;
-import com.android.tools.r8.ir.optimize.NonNullTracker;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.function.BiConsumer;
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
index aefe665..286fb56 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/TypeAnalysisTest.java
@@ -30,10 +30,10 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Smali;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.nio.charset.StandardCharsets;
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
index 1f4d2ba..6aecc60 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/annotations/CovariantReturnTypeAnnotationTransformerTest.java
@@ -4,14 +4,16 @@
 
 package com.android.tools.r8.ir.desugar.annotations;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.AsmTestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.util.Collections;
 import org.junit.Assert;
 import org.junit.Test;
@@ -156,44 +158,44 @@
     DexInspector inspector = new DexInspector(output);
 
     // Get classes A, B, and C.
-    DexInspector.ClassSubject clazzA = inspector.clazz(A.class.getCanonicalName());
+    ClassSubject clazzA = inspector.clazz(A.class.getCanonicalName());
     assertThat(clazzA, isPresent());
 
-    DexInspector.ClassSubject clazzB = inspector.clazz(B.class.getCanonicalName());
+    ClassSubject clazzB = inspector.clazz(B.class.getCanonicalName());
     assertThat(clazzB, isPresent());
 
-    DexInspector.ClassSubject clazzC = inspector.clazz(C.class.getCanonicalName());
+    ClassSubject clazzC = inspector.clazz(C.class.getCanonicalName());
     assertThat(clazzC, isPresent());
 
     // Check that the original methods are there, and that they are not synthetic.
-    DexInspector.MethodSubject methodA =
+    MethodSubject methodA =
         clazzB.method(A.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodA, isPresent());
     Assert.assertTrue(!methodA.getMethod().isSyntheticMethod());
 
-    DexInspector.MethodSubject methodB =
+    MethodSubject methodB =
         clazzB.method(A.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodB, isPresent());
     Assert.assertTrue(!methodB.getMethod().isSyntheticMethod());
 
-    DexInspector.MethodSubject methodC =
+    MethodSubject methodC =
         clazzC.method(A.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodC, isPresent());
     Assert.assertTrue(!methodC.getMethod().isSyntheticMethod());
 
     // Check that a synthetic method has been added to class B.
-    DexInspector.MethodSubject methodB2 =
+    MethodSubject methodB2 =
         clazzB.method(B.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodB2, isPresent());
     Assert.assertTrue(methodB2.getMethod().isSyntheticMethod());
 
     // Check that two synthetic methods have been added to class C.
-    DexInspector.MethodSubject methodC2 =
+    MethodSubject methodC2 =
         clazzC.method(B.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodC2, isPresent());
     Assert.assertTrue(methodC2.getMethod().isSyntheticMethod());
 
-    DexInspector.MethodSubject methodC3 =
+    MethodSubject methodC3 =
         clazzC.method(C.class.getCanonicalName(), "method", Collections.emptyList());
     assertThat(methodC3, isPresent());
     Assert.assertTrue(methodC3.getMethod().isSyntheticMethod());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
index 3f7bcfb..11c7c0f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/B87341268.java
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.optimize;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import org.junit.Test;
 
 public class B87341268 extends TestBase {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
index a5c7093..5a2bc22 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/MemberValuePropagationTest.java
@@ -18,9 +18,9 @@
 import com.android.tools.r8.code.SputObject;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
index 7c90976..2ef43fd 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullTrackerTest.java
@@ -26,9 +26,9 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.util.function.Consumer;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 5dc7f23..8e78784 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -28,10 +28,10 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Files;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
index 525e21b..43b728e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SimplifyIfNotNullTest.java
@@ -17,7 +17,7 @@
 import com.android.tools.r8.ir.optimize.nonnull.NonNullAfterInvoke;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
index e7a8285..d40e202 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
@@ -45,9 +45,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.Sets;
 import java.nio.file.Path;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
index 71dae86..0ae7971 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeInterfaceToInvokeVirtualTest.java
@@ -24,8 +24,8 @@
 import com.android.tools.r8.ir.optimize.devirtualize.invokeinterface.Main;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
index adb87e6..4b603952 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
@@ -21,10 +21,10 @@
 import com.android.tools.r8.ir.optimize.inliner.interfaces.InterfaceTargetsTestClass.IfaceNoImpl;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.nio.file.Path;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
index a143b65..c79e50e 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
@@ -11,8 +11,8 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.util.List;
 import java.util.Map;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
index 08058e5..36156eb 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B79405526.java
@@ -4,12 +4,13 @@
 
 package com.android.tools.r8.ir.regalloc;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import org.junit.Test;
 
 public class B79405526 extends TestBase {
@@ -17,7 +18,7 @@
   public void test() throws Exception {
     AndroidApp app = compileWithD8(readClasses(TestClass.class));
     DexInspector inspector = new DexInspector(app);
-    DexInspector.ClassSubject clazz = inspector.clazz(TestClass.class);
+    ClassSubject clazz = inspector.clazz(TestClass.class);
     assertThat(clazz, isPresent());
     // Throws if a method in TestClass does not verify.
     runOnArt(app, TestClass.class.getName());
diff --git a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
index 16fed9e..d8861b6 100644
--- a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
+++ b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.utils.ArtErrorParser;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
index 033183c..ed9194e 100644
--- a/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
+++ b/src/test/java/com/android/tools/r8/jasmin/AnnotationCompanionClassTest.java
@@ -7,7 +7,7 @@
 
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
index e572bfa..b56824d 100644
--- a/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/DebugLocalTests.java
@@ -12,9 +12,9 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassFileVersion;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
index 27d8d8b..c7a32b3 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JumboStringTests.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
diff --git a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
index 7b74453..c2dd7b1 100644
--- a/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
+++ b/src/test/java/com/android/tools/r8/jsr45/JSR45Tests.java
@@ -14,9 +14,9 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.AnnotationSubject;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.AnnotationSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.file.Files;
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index fd78cb7..4fd1d8d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -21,12 +21,12 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
index dc2774a..a28d0c5 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -17,8 +17,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
index 062095c..658e89a 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinLambdaMergingTest.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.optimize.lambda.CaptureSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.Lists;
 import java.io.IOException;
 import java.util.ArrayList;
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
index 2beb777..233bb24 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinxMetadataExtensionsServiceTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.kotlin.KotlinLambdaMergingTest.Lambda;
 import com.android.tools.r8.kotlin.KotlinLambdaMergingTest.Verifier;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
index 7425082..53b7925 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinAccessorTest.java
@@ -16,9 +16,9 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
 import java.nio.file.Path;
 import java.util.Collections;
 import org.junit.Assert;
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index 73d1e50..45f74af 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -7,10 +7,10 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.util.Collections;
 import java.util.function.Consumer;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index 021e045..c764974 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -5,8 +5,8 @@
 package com.android.tools.r8.kotlin;
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
index dc9b642..03c2873 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinPropertiesTest.java
@@ -10,10 +10,10 @@
 import com.android.tools.r8.kotlin.TestKotlinClass.Visibility;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
 import java.util.Map.Entry;
 import java.util.function.Consumer;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 5a30cfd..fd41344 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -10,9 +10,9 @@
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index 101bf06..dc5347e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -59,8 +59,6 @@
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
@@ -68,6 +66,8 @@
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import java.io.IOException;
diff --git a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
index 0f1359e..fea8160 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.ArrayList;
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
index aba14cf..d3805d9 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/CompositionalLenseTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.memberrebinding;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -11,15 +11,15 @@
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.code.InvokeVirtual;
+import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index 46a439d..c2ec4b7 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -11,12 +11,12 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index 3429c2a..9b120e6 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -13,10 +13,10 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Iterator;
 import java.util.function.Consumer;
diff --git a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
index bf6c895..876a758 100644
--- a/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ApplyMappingTest.java
@@ -21,11 +21,11 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index f27c88a..58e17d1 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -20,10 +20,10 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.nio.file.Path;
@@ -37,9 +37,7 @@
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 import org.junit.Before;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
index 982e935..41e514a 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -26,9 +26,9 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
index f3f1211..e081f18 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierClassSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isRenamed;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -29,8 +29,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
index a5351e2..02ec163 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierFieldSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isRenamed;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -30,9 +30,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
diff --git a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
index baeedbb..efc9855 100644
--- a/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/MinifierMethodSignatureTest.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isRenamed;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
@@ -33,9 +33,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.graph.invokesuper.Consumer;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import java.util.Arrays;
diff --git a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
index ddd0aa2..25e2358 100644
--- a/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
+++ b/src/test/java/com/android/tools/r8/naming/WarnReflectiveAccessTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -19,10 +19,10 @@
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Method;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index ec27895..4e46637 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.naming.b72391662;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -17,9 +17,9 @@
 import com.android.tools.r8.naming.b72391662.subpackage.OtherPackageTestClass;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
index 008e4ff..1b7d842 100644
--- a/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
+++ b/src/test/java/com/android/tools/r8/naming/b80083341/B80083341.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.naming.b80083341;
 
 import static com.android.tools.r8.utils.DescriptorUtils.getClassNameFromDescriptor;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -12,8 +12,8 @@
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.VmTestRunner;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
index a9eb622..0feddfd 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/OverloadAggressivelyTest.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
index 3e5ba7c..6e3e30a 100644
--- a/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
+++ b/src/test/java/com/android/tools/r8/naming/overloadaggressively/ValidNameConflictTest.java
@@ -14,10 +14,10 @@
 import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
index 878cb7c..8ae31f7 100644
--- a/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
+++ b/src/test/java/com/android/tools/r8/neverreturnsnormally/NeverReturnsNormallyTest.java
@@ -14,12 +14,12 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.DexInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Iterator;
 import java.util.function.BiConsumer;
diff --git a/src/test/java/com/android/tools/r8/regress/B76025099.java b/src/test/java/com/android/tools/r8/regress/B76025099.java
index 0a0e861..68f6fe0 100644
--- a/src/test/java/com/android/tools/r8/regress/B76025099.java
+++ b/src/test/java/com/android/tools/r8/regress/B76025099.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.regress;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -19,10 +19,10 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Files;
diff --git a/src/test/java/com/android/tools/r8/regress/Regress37740372.java b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
index 64df6ed..1d2c6fe 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress37740372.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress37740372.java
@@ -18,8 +18,8 @@
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.util.Base64;
 import java.util.Set;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
index 84fc5c4..2e050ca 100644
--- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
+++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.regress.b111250398;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -15,11 +15,11 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
index a185f4c..9cc17af 100644
--- a/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b69825683/Regress69825683Test.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.FoundClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundClassSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
index 03614b9..448e472 100644
--- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
+++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/resolution/B77944861.java b/src/test/java/com/android/tools/r8/resolution/B77944861.java
index aa5552a..a35adbc 100644
--- a/src/test/java/com/android/tools/r8/resolution/B77944861.java
+++ b/src/test/java/com/android/tools/r8/resolution/B77944861.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.resolution;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
@@ -19,10 +19,10 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
index 6574e7b..ca62dee 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
@@ -18,10 +18,10 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.function.Consumer;
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
index e0d9ecf..f92b1dc 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/LongCompare.java
@@ -9,12 +9,12 @@
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
index a50a667..c3037f8 100644
--- a/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/longcompare/RequireNonNullRewriteTest.java
@@ -11,11 +11,11 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InvokeInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InvokeInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
index 087b5f8..5fe2abd 100644
--- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -25,9 +25,9 @@
 import com.android.tools.r8.smali.SmaliBuilder;
 import com.android.tools.r8.smali.SmaliTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import org.junit.Test;
 
 public class StaticValuesTest extends SmaliTestBase {
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
index ae88c12..7ea9cdd 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingJarTest.java
@@ -18,9 +18,9 @@
 import com.android.tools.r8.jasmin.JasminTestBase;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import java.util.stream.Collectors;
diff --git a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
index 38247bd..7eae052 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switchmaps/RewriteSwitchMapsTest.java
@@ -10,7 +10,7 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Paths;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
index 3475871..9242842 100644
--- a/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ClassKindTest.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.shaking.classkinds.Enum;
 import com.android.tools.r8.shaking.classkinds.Interface;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
index 8f00f8d..5fa8edc 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldTypeTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
@@ -17,8 +17,8 @@
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
index 6ecdb09..c6ccc61 100644
--- a/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/LibraryProvidedProguardRulesTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.shaking;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -31,7 +31,7 @@
 import com.android.tools.r8.origin.PathOrigin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.CharSource;
diff --git a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
index 1379b95..22b6790 100644
--- a/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ProguardConfigurationParserTest.java
@@ -27,11 +27,11 @@
 import com.android.tools.r8.shaking.ProguardConfigurationParser.IdentifierPatternWithWildcards;
 import com.android.tools.r8.utils.AbortException;
 import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
-import com.android.tools.r8.utils.DexInspector;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions.PackageObfuscationMode;
 import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.io.IOException;
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index b6a1ac6..24d4ba5 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -14,13 +14,13 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FoundFieldSubject;
-import com.android.tools.r8.utils.DexInspector.FoundMethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.TestDescriptionWatcher;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FoundFieldSubject;
+import com.android.tools.r8.utils.dexinspector.FoundMethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Files;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
index 46feb00..d739348 100644
--- a/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/defaultmethods/DefaultMethodsTest.java
@@ -15,9 +15,9 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
index 54bec20..f7889ee 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking11Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
index 7bbde47..d58d975 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking12Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
index 4729897..6cfcd87 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
@@ -5,11 +5,11 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldAccessInstructionSubject;
-import com.android.tools.r8.utils.DexInspector.InstructionSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldAccessInstructionSubject;
+import com.android.tools.r8.utils.dexinspector.InstructionSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
index 6891708..8ea939a 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking14Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
index 98a7a28..1651fca 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking15Test.java
@@ -5,10 +5,10 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
index be0f529..ba01d2f 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking17Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
index 97d9bfc..26ea045 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking18Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
index e5be477..0c662bb 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking19Test.java
@@ -3,15 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.examples;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
index ad2aea7..6b90ec9 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking1Test.java
@@ -6,8 +6,8 @@
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
 import com.android.tools.r8.utils.DescriptorUtils;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
index 39dd4ab..4c2cfe1 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
index 0aa431a..3996622 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking3Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
index f7b0b47..ad13070 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking5Test.java
@@ -5,7 +5,7 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
index f93ccd2..9fb2029 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking6Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
index 7762040..b44f3aa 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking7Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
index afa3003..02cda2a 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking8Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
index e3c8b8a..18a1141 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking9Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
index a235df5..dfe1806 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingAnnotationremovalTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
index 7570990..e544edf 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingEnumprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
index 2ff5dfc..6650860 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
index cb61962..d7a8af5 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingNestedproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
index 44f5f89..18f4648 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingOneofprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
index bd27c7f..e55d822 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingRepeatedprotoTest.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
index 8c3f4a4..2b49803 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto1Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
index 30a9131..ce9659b 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShakingSimpleproto2Test.java
@@ -5,8 +5,8 @@
 
 import com.android.tools.r8.TestBase.MinifyMode;
 import com.android.tools.r8.shaking.TreeShakingTest;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
index 642045c..31c97ca 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ForceProguardCompatibilityTest.java
@@ -36,12 +36,12 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DefaultDiagnosticsHandler;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.Reporter;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import it.unimi.dsi.fastutil.objects.Object2BooleanArrayMap;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
index e3bffc6..f76d402 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/ProguardCompatabilityTestBase.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.forceproguardcompatibility;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
@@ -17,10 +17,10 @@
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.File;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
index d8615e0..d752e39 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/ImplicitlyKeptDefaultConstructorTest.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.shaking.forceproguardcompatibility.defaultctor;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.hasDefaultConstructor;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.hasDefaultConstructor;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.smali.ConstantFoldingTest.TriConsumer;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index 65d1763..e64983d 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
@@ -11,9 +11,9 @@
 
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
index 4d0281f..ac92146 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
index 76c1023..1f5ba35 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnClassTest.java
@@ -3,18 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking.ifrule;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isNotRenamed;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isRenamed;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isNotRenamed;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
index 7480e2e..0292344 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnFieldTest.java
@@ -4,7 +4,7 @@
 package com.android.tools.r8.shaking.ifrule;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
index 22f9ef6..cd2ce6a 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/inlining/IfRuleWithInlining.java
@@ -4,15 +4,15 @@
 
 package com.android.tools.r8.shaking.ifrule.inlining;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
index b484d73..aed9596 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/IfRuleWithVerticalClassMerging.java
@@ -4,16 +4,16 @@
 
 package com.android.tools.r8.shaking.ifrule.verticalclassmerging;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import java.util.List;
diff --git a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
index cae3b06..c841996 100644
--- a/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/includedescriptorclasses/IncludeDescriptorClassesTest.java
@@ -9,7 +9,7 @@
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.ArrayList;
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
index 12bcdfd..b1ae8bb 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersTest.java
@@ -4,18 +4,18 @@
 
 package com.android.tools.r8.shaking.keepclassmembers;
 
-import static com.android.tools.r8.utils.DexInspectorMatchers.isAbstract;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isAbstract;
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.core.IsNot.not;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.shaking.forceproguardcompatibility.ProguardCompatabilityTestBase;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.FieldSubject;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import org.junit.Test;
 
diff --git a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
index 8e39b67..8c71ff7 100644
--- a/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/proxy/ProxiesTest.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.shaking.proxy.testclasses.SubInterface;
 import com.android.tools.r8.shaking.proxy.testclasses.TestClass;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
index e4be101..365d039 100644
--- a/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/testrules/ForceInlineTest.java
@@ -7,17 +7,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 package com.android.tools.r8.shaking.testrules;
-import static com.android.tools.r8.utils.DexInspectorMatchers.isPresent;
-import static org.junit.Assert.assertThat;
+
+import static com.android.tools.r8.utils.dexinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
index 3381473..5f9a6fd 100644
--- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
+++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -20,8 +20,8 @@
 import com.android.tools.r8.ir.code.SingleConstant;
 import com.android.tools.r8.ir.code.WideConstant;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Collections;
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
index 371c4d1..41e894e 100644
--- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java
+++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -32,11 +32,11 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.Arrays;
diff --git a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
index 86c4242..b6ec9c3 100644
--- a/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/smali/RemoveWriteOfUnusedFieldsTest.java
@@ -11,8 +11,8 @@
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
index b6db233..7287cc3 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliBuildTest.java
@@ -9,8 +9,8 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import org.junit.Test;
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 6c4b884..7aabadb 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -23,10 +23,10 @@
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
 import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.DexInspector;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Collection;
diff --git a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
index 406c63f..51c6ca5 100644
--- a/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
+++ b/src/test/java/com/android/tools/r8/utils/ArtErrorParser.java
@@ -4,8 +4,9 @@
 package com.android.tools.r8.utils;
 
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
+import com.android.tools.r8.utils.dexinspector.ClassSubject;
+import com.android.tools.r8.utils.dexinspector.DexInspector;
+import com.android.tools.r8.utils.dexinspector.MethodSubject;
 import java.util.ArrayList;
 import java.util.List;
 
diff --git a/src/test/java/com/android/tools/r8/utils/DexInspector.java b/src/test/java/com/android/tools/r8/utils/DexInspector.java
deleted file mode 100644
index 059a24a..0000000
--- a/src/test/java/com/android/tools/r8/utils/DexInspector.java
+++ /dev/null
@@ -1,1540 +0,0 @@
-// Copyright (c) 2016, 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.utils;
-
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.StringResource;
-import com.android.tools.r8.code.Const4;
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.Goto;
-import com.android.tools.r8.code.IfEqz;
-import com.android.tools.r8.code.IfNez;
-import com.android.tools.r8.code.Iget;
-import com.android.tools.r8.code.IgetBoolean;
-import com.android.tools.r8.code.IgetByte;
-import com.android.tools.r8.code.IgetChar;
-import com.android.tools.r8.code.IgetObject;
-import com.android.tools.r8.code.IgetShort;
-import com.android.tools.r8.code.IgetWide;
-import com.android.tools.r8.code.Instruction;
-import com.android.tools.r8.code.InvokeDirect;
-import com.android.tools.r8.code.InvokeDirectRange;
-import com.android.tools.r8.code.InvokeInterface;
-import com.android.tools.r8.code.InvokeInterfaceRange;
-import com.android.tools.r8.code.InvokeStatic;
-import com.android.tools.r8.code.InvokeStaticRange;
-import com.android.tools.r8.code.InvokeSuper;
-import com.android.tools.r8.code.InvokeSuperRange;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.InvokeVirtualRange;
-import com.android.tools.r8.code.Iput;
-import com.android.tools.r8.code.IputBoolean;
-import com.android.tools.r8.code.IputByte;
-import com.android.tools.r8.code.IputChar;
-import com.android.tools.r8.code.IputObject;
-import com.android.tools.r8.code.IputShort;
-import com.android.tools.r8.code.IputWide;
-import com.android.tools.r8.code.Nop;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.Sget;
-import com.android.tools.r8.code.SgetBoolean;
-import com.android.tools.r8.code.SgetByte;
-import com.android.tools.r8.code.SgetChar;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.code.SgetShort;
-import com.android.tools.r8.code.SgetWide;
-import com.android.tools.r8.code.Sput;
-import com.android.tools.r8.code.SputBoolean;
-import com.android.tools.r8.code.SputByte;
-import com.android.tools.r8.code.SputChar;
-import com.android.tools.r8.code.SputObject;
-import com.android.tools.r8.code.SputShort;
-import com.android.tools.r8.code.SputWide;
-import com.android.tools.r8.code.Throw;
-import com.android.tools.r8.dex.ApplicationReader;
-import com.android.tools.r8.graph.Code;
-import com.android.tools.r8.graph.DexAnnotation;
-import com.android.tools.r8.graph.DexAnnotationElement;
-import com.android.tools.r8.graph.DexAnnotationSet;
-import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexEncodedAnnotation;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.DexValue.DexValueArray;
-import com.android.tools.r8.graph.DexValue.DexValueString;
-import com.android.tools.r8.graph.InnerClassAttribute;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.MemberNaming;
-import com.android.tools.r8.naming.MemberNaming.FieldSignature;
-import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.naming.MemberNaming.Signature;
-import com.android.tools.r8.naming.signature.GenericSignatureAction;
-import com.android.tools.r8.naming.signature.GenericSignatureParser;
-import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.utils.DexInspector.FieldAccessInstructionSubject;
-import com.google.common.collect.BiMap;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.concurrent.ExecutionException;
-import java.util.function.BiConsumer;
-import java.util.function.BiFunction;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-public class DexInspector {
-
-  private final DexApplication application;
-  private final DexItemFactory dexItemFactory;
-  private final ClassNameMapper mapping;
-  private final BiMap<String, String> originalToObfuscatedMapping;
-
-  public static MethodSignature MAIN =
-      new MethodSignature("main", "void", new String[]{"java.lang.String[]"});
-
-  public DexInspector(Path file, String mappingFile) throws IOException, ExecutionException {
-    this(Collections.singletonList(file), mappingFile);
-  }
-
-  public DexInspector(Path file) throws IOException, ExecutionException {
-    this(Collections.singletonList(file), null);
-  }
-
-  public DexInspector(List<Path> files) throws IOException, ExecutionException {
-    this(files, null);
-  }
-
-  public DexInspector(List<Path> files, String mappingFile)
-      throws IOException, ExecutionException {
-    if (mappingFile != null) {
-      this.mapping = ClassNameMapper.mapperFromFile(Paths.get(mappingFile));
-      originalToObfuscatedMapping = this.mapping.getObfuscatedToOriginalMapping().inverse();
-    } else {
-      this.mapping = null;
-      originalToObfuscatedMapping = null;
-    }
-    Timing timing = new Timing("DexInspector");
-    InternalOptions options = new InternalOptions();
-    dexItemFactory = options.itemFactory;
-    AndroidApp input = AndroidApp.builder().addProgramFiles(files).build();
-    application = new ApplicationReader(input, options, timing).read();
-  }
-
-  public DexInspector(AndroidApp app) throws IOException, ExecutionException {
-    this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
-            .read(app.getProguardMapOutputData()));
-  }
-
-  public DexInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
-      throws IOException, ExecutionException {
-    this(
-        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("DexInspector"))
-            .read(app.getProguardMapOutputData()));
-  }
-
-  private static InternalOptions runOptionsConsumer(Consumer<InternalOptions> optionsConsumer) {
-    InternalOptions internalOptions = new InternalOptions();
-    optionsConsumer.accept(internalOptions);
-    return internalOptions;
-  }
-
-  public DexInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
-    this(
-        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
-            .read(StringResource.fromFile(proguardMap)));
-  }
-
-  public DexInspector(DexApplication application) {
-    dexItemFactory = application.dexItemFactory;
-    this.application = application;
-    this.mapping = application.getProguardMap();
-    originalToObfuscatedMapping =
-        mapping == null ? null : mapping.getObfuscatedToOriginalMapping().inverse();
-  }
-
-  public DexItemFactory getFactory() {
-    return dexItemFactory;
-  }
-
-  private DexType toDexType(String string) {
-    return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptor(string));
-  }
-
-  private DexType toDexTypeIgnorePrimitives(String string) {
-    return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptorIgnorePrimitives(string));
-  }
-
-  private static <S, T extends Subject> void forAll(S[] items,
-      BiFunction<S, FoundClassSubject, ? extends T> constructor,
-      FoundClassSubject clazz,
-      Consumer<T> consumer) {
-    for (S item : items) {
-      consumer.accept(constructor.apply(item, clazz));
-    }
-  }
-
-  private static <S, T extends Subject> void forAll(Iterable<S> items, Function<S, T> constructor,
-      Consumer<T> consumer) {
-    for (S item : items) {
-      consumer.accept(constructor.apply(item));
-    }
-  }
-
-  DexAnnotation findAnnotation(String name, DexAnnotationSet annotations) {
-    for (DexAnnotation annotation : annotations.annotations) {
-      DexType type = annotation.annotation.type;
-      String original = mapping == null ? type.toSourceString() : mapping.originalNameOf(type);
-      if (original.equals(name)) {
-        return annotation;
-      }
-    }
-    return null;
-  }
-
-  public String getFinalSignatureAttribute(DexAnnotationSet annotations) {
-    DexAnnotation annotation =
-        findAnnotation("dalvik.annotation.Signature", annotations);
-    if (annotation == null) {
-      return null;
-    }
-    assert annotation.annotation.elements.length == 1;
-    DexAnnotationElement element = annotation.annotation.elements[0];
-    assert element.value instanceof DexValueArray;
-    StringBuilder builder = new StringBuilder();
-    DexValueArray valueArray = (DexValueArray) element.value;
-    for (DexValue value : valueArray.getValues()) {
-      assertTrue(value instanceof DexValueString);
-      DexValueString s = (DexValueString) value;
-      builder.append(s.getValue());
-    }
-    return builder.toString();
-  }
-
-  public String getOriginalSignatureAttribute(
-      DexAnnotationSet annotations, BiConsumer<GenericSignatureParser, String> parse) {
-    String finalSignature = getFinalSignatureAttribute(annotations);
-    if (finalSignature == null || mapping == null) {
-      return finalSignature;
-    }
-
-    GenericSignatureGenerater rewriter = new GenericSignatureGenerater();
-    GenericSignatureParser<String> parser = new GenericSignatureParser<>(rewriter);
-    parse.accept(parser, finalSignature);
-    return rewriter.getSignature();
-  }
-
-
-  public ClassSubject clazz(Class clazz) {
-    return clazz(clazz.getTypeName());
-  }
-
-  /**
-   * Lookup a class by name. This allows both original and obfuscated names.
-   */
-  public ClassSubject clazz(String name) {
-    ClassNamingForNameMapper naming = null;
-    if (mapping != null) {
-      String obfuscated = originalToObfuscatedMapping.get(name);
-      if (obfuscated != null) {
-        naming = mapping.getClassNaming(obfuscated);
-        name = obfuscated;
-      } else {
-        // Figure out if the name is an already obfuscated name.
-        String original = originalToObfuscatedMapping.inverse().get(name);
-        if (original != null) {
-          naming = mapping.getClassNaming(name);
-        }
-      }
-    }
-    DexClass clazz = application.definitionFor(toDexTypeIgnorePrimitives(name));
-    if (clazz == null) {
-      return new AbsentClassSubject();
-    }
-    return new FoundClassSubject(clazz, naming);
-  }
-
-  public void forAllClasses(Consumer<FoundClassSubject> inspection) {
-    forAll(application.classes(), cls -> {
-      ClassSubject subject = clazz(cls.type.toSourceString());
-      assert subject.isPresent();
-      return (FoundClassSubject) subject;
-    }, inspection);
-  }
-
-  public List<FoundClassSubject> allClasses() {
-    ImmutableList.Builder<FoundClassSubject> builder = ImmutableList.builder();
-    forAllClasses(builder::add);
-    return builder.build();
-  }
-
-  public MethodSubject method(Method method) {
-    ClassSubject clazz = clazz(method.getDeclaringClass());
-    if (!clazz.isPresent()) {
-      return new AbsentMethodSubject();
-    }
-    return clazz.method(method);
-  }
-
-  private String getObfuscatedTypeName(String originalTypeName) {
-    String obfuscatedType = null;
-    if (mapping != null) {
-      obfuscatedType = originalToObfuscatedMapping.get(originalTypeName);
-    }
-    obfuscatedType = obfuscatedType == null ? originalTypeName : obfuscatedType;
-    return obfuscatedType;
-  }
-
-  public abstract static class Subject {
-
-    public abstract boolean isPresent();
-    public abstract boolean isRenamed();
-  }
-
-  public abstract static class AnnotationSubject extends Subject {
-
-    public abstract DexEncodedAnnotation getAnnotation();
-  }
-
-  public static class FoundAnnotationSubject extends AnnotationSubject {
-
-    private final DexAnnotation annotation;
-
-    private FoundAnnotationSubject(DexAnnotation annotation) {
-      this.annotation = annotation;
-    }
-
-    @Override
-    public boolean isPresent() {
-      return true;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    @Override
-    public DexEncodedAnnotation getAnnotation() {
-      return annotation.annotation;
-    }
-  }
-
-  public static class AbsentAnnotationSubject extends AnnotationSubject {
-
-    @Override
-    public boolean isPresent() {
-      return false;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    @Override
-    public DexEncodedAnnotation getAnnotation() {
-      throw new UnsupportedOperationException();
-    }
-  }
-
-  public abstract static class ClassSubject extends Subject {
-
-    public abstract void forAllMethods(Consumer<FoundMethodSubject> inspection);
-
-    public MethodSubject method(Method method) {
-      List<String> parameters = new ArrayList<>();
-      for (Class<?> parameterType : method.getParameterTypes()) {
-        parameters.add(parameterType.getTypeName());
-      }
-      return method(method.getReturnType().getTypeName(), method.getName(), parameters);
-    }
-
-    public abstract MethodSubject method(String returnType, String name, List<String> parameters);
-
-    public MethodSubject clinit() {
-      return method("void", "<clinit>", ImmutableList.of());
-    }
-
-    public MethodSubject init(List<String> parameters) {
-      return method("void", "<init>", parameters);
-    }
-
-    public MethodSubject method(MethodSignature signature) {
-      return method(signature.type, signature.name, ImmutableList.copyOf(signature.parameters));
-    }
-
-    public MethodSubject method(SmaliBuilder.MethodSignature signature) {
-      return method(
-          signature.returnType, signature.name, ImmutableList.copyOf(signature.parameterTypes));
-    }
-
-    public abstract void forAllFields(Consumer<FoundFieldSubject> inspection);
-
-    public abstract FieldSubject field(String type, String name);
-
-    public abstract boolean isAbstract();
-
-    public abstract boolean isAnnotation();
-
-    public String dumpMethods() {
-      StringBuilder dump = new StringBuilder();
-      forAllMethods((FoundMethodSubject method) ->
-          dump.append(method.getMethod().toString())
-              .append(method.getMethod().codeToString()));
-      return dump.toString();
-    }
-
-    public abstract DexClass getDexClass();
-
-    public abstract AnnotationSubject annotation(String name);
-
-    public abstract String getOriginalName();
-
-    public abstract String getOriginalDescriptor();
-
-    public abstract String getFinalName();
-
-    public abstract String getFinalDescriptor();
-
-    public abstract boolean isMemberClass();
-
-    public abstract boolean isLocalClass();
-
-    public abstract boolean isAnonymousClass();
-
-    public abstract boolean isSynthesizedJavaLambdaClass();
-
-    public abstract String getOriginalSignatureAttribute();
-
-    public abstract String getFinalSignatureAttribute();
-  }
-
-  private class AbsentClassSubject extends ClassSubject {
-
-    @Override
-    public boolean isPresent() {
-      return false;
-    }
-
-    @Override
-    public void forAllMethods(Consumer<FoundMethodSubject> inspection) {
-    }
-
-    @Override
-    public MethodSubject method(String returnType, String name, List<String> parameters) {
-      return new AbsentMethodSubject();
-    }
-
-    @Override
-    public void forAllFields(Consumer<FoundFieldSubject> inspection) {
-    }
-
-    @Override
-    public FieldSubject field(String type, String name) {
-      return new AbsentFieldSubject();
-    }
-
-    @Override
-    public boolean isAbstract() {
-      return false;
-    }
-
-    @Override
-    public boolean isAnnotation() {
-      return false;
-    }
-
-    @Override
-    public DexClass getDexClass() {
-      return null;
-    }
-
-    @Override
-    public AnnotationSubject annotation(String name) {
-      return new AbsentAnnotationSubject();
-    }
-
-    @Override
-    public String getOriginalName() {
-      return null;
-    }
-
-    @Override
-    public String getOriginalDescriptor() {
-      return null;
-    }
-
-    @Override
-    public String getFinalName() {
-      return null;
-    }
-
-    @Override
-    public String getFinalDescriptor() {
-      return null;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    @Override
-    public boolean isMemberClass() {
-      return false;
-    }
-
-    @Override
-    public boolean isLocalClass() {
-      return false;
-    }
-
-    @Override
-    public boolean isAnonymousClass() {
-      return false;
-    }
-
-    @Override
-    public boolean isSynthesizedJavaLambdaClass() {
-      return false;
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return null;
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return null;
-    }
-  }
-
-  public class FoundClassSubject extends ClassSubject {
-
-    private final DexClass dexClass;
-    private final ClassNamingForNameMapper naming;
-
-    private FoundClassSubject(DexClass dexClass, ClassNamingForNameMapper naming) {
-      this.dexClass = dexClass;
-      this.naming = naming;
-    }
-
-    @Override
-    public boolean isPresent() {
-      return true;
-    }
-
-    @Override
-    public void forAllMethods(Consumer<FoundMethodSubject> inspection) {
-      forAll(dexClass.directMethods(), FoundMethodSubject::new, this, inspection);
-      forAll(dexClass.virtualMethods(), FoundMethodSubject::new, this, inspection);
-    }
-
-    @Override
-    public MethodSubject method(String returnType, String name, List<String> parameters) {
-      DexType[] parameterTypes = new DexType[parameters.size()];
-      for (int i = 0; i < parameters.size(); i++) {
-        parameterTypes[i] = toDexType(getObfuscatedTypeName(parameters.get(i)));
-      }
-      DexProto proto = dexItemFactory.createProto(toDexType(getObfuscatedTypeName(returnType)),
-          parameterTypes);
-      if (naming != null) {
-        String[] parameterStrings = new String[parameterTypes.length];
-        Signature signature = new MethodSignature(name, returnType,
-            parameters.toArray(parameterStrings));
-        MemberNaming methodNaming = naming.lookupByOriginalSignature(signature);
-        if (methodNaming != null) {
-          name = methodNaming.getRenamedName();
-        }
-      }
-      DexMethod dexMethod =
-          dexItemFactory.createMethod(dexClass.type, proto, dexItemFactory.createString(name));
-      DexEncodedMethod encoded = findMethod(dexClass.directMethods(), dexMethod);
-      if (encoded == null) {
-        encoded = findMethod(dexClass.virtualMethods(), dexMethod);
-      }
-      return encoded == null ? new AbsentMethodSubject() : new FoundMethodSubject(encoded, this);
-    }
-
-    private DexEncodedMethod findMethod(DexEncodedMethod[] methods, DexMethod dexMethod) {
-      for (DexEncodedMethod method : methods) {
-        if (method.method.equals(dexMethod)) {
-          return method;
-        }
-      }
-      return null;
-    }
-
-    @Override
-    public void forAllFields(Consumer<FoundFieldSubject> inspection) {
-      forAll(dexClass.staticFields(), FoundFieldSubject::new, this, inspection);
-      forAll(dexClass.instanceFields(), FoundFieldSubject::new, this, inspection);
-    }
-
-    @Override
-    public FieldSubject field(String type, String name) {
-      String obfuscatedType = getObfuscatedTypeName(type);
-      MemberNaming fieldNaming = null;
-      if (naming != null) {
-        fieldNaming = naming.lookupByOriginalSignature(
-            new FieldSignature(name, type));
-      }
-      String obfuscatedName = fieldNaming == null ? name : fieldNaming.getRenamedName();
-
-      DexField field = dexItemFactory.createField(dexClass.type,
-          toDexType(obfuscatedType), dexItemFactory.createString(obfuscatedName));
-      DexEncodedField encoded = findField(dexClass.staticFields(), field);
-      if (encoded == null) {
-        encoded = findField(dexClass.instanceFields(), field);
-      }
-      return encoded == null ? new AbsentFieldSubject() : new FoundFieldSubject(encoded, this);
-    }
-
-    @Override
-    public boolean isAbstract() {
-      return dexClass.accessFlags.isAbstract();
-    }
-
-    @Override
-    public boolean isAnnotation() {
-      return dexClass.accessFlags.isAnnotation();
-    }
-
-    private DexEncodedField findField(DexEncodedField[] fields, DexField dexField) {
-      for (DexEncodedField field : fields) {
-        if (field.field.equals(dexField)) {
-          return field;
-        }
-      }
-      return null;
-    }
-
-    @Override
-    public DexClass getDexClass() {
-      return dexClass;
-    }
-
-    @Override
-    public AnnotationSubject annotation(String name) {
-      // Ensure we don't check for annotations represented as attributes.
-      assert !name.endsWith("EnclosingClass")
-          && !name.endsWith("EnclosingMethod")
-          && !name.endsWith("InnerClass");
-      DexAnnotation annotation = findAnnotation(name, dexClass.annotations);
-      return annotation == null
-          ? new AbsentAnnotationSubject()
-          : new FoundAnnotationSubject(annotation);
-    }
-
-    @Override
-    public String getOriginalName() {
-      if (naming != null) {
-        return naming.originalName;
-      } else {
-        return getFinalName();
-      }
-    }
-
-    @Override
-    public String getOriginalDescriptor() {
-      if (naming != null) {
-        return DescriptorUtils.javaTypeToDescriptor(naming.originalName);
-      } else {
-        return getFinalDescriptor();
-      }
-    }
-
-    @Override
-    public String getFinalName() {
-      return DescriptorUtils.descriptorToJavaType(getFinalDescriptor());
-    }
-
-    @Override
-    public String getFinalDescriptor() {
-      return dexClass.type.descriptor.toString();
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return naming != null && !getFinalDescriptor().equals(getOriginalDescriptor());
-    }
-
-    private InnerClassAttribute getInnerClassAttribute() {
-      for (InnerClassAttribute innerClassAttribute : dexClass.getInnerClasses()) {
-        if (dexClass.type == innerClassAttribute.getInner()) {
-          return innerClassAttribute;
-        }
-      }
-      return null;
-    }
-
-    @Override
-    public boolean isLocalClass() {
-      InnerClassAttribute innerClass = getInnerClassAttribute();
-      return innerClass != null
-          && innerClass.isNamed()
-          && dexClass.getEnclosingMethod() != null;
-    }
-
-    @Override
-    public boolean isMemberClass() {
-      InnerClassAttribute innerClass = getInnerClassAttribute();
-      return innerClass != null
-          && innerClass.getOuter() != null
-          && innerClass.isNamed()
-          && dexClass.getEnclosingMethod() == null;
-    }
-
-    @Override
-    public boolean isAnonymousClass() {
-      InnerClassAttribute innerClass = getInnerClassAttribute();
-      return innerClass != null
-          && innerClass.isAnonymous()
-          && dexClass.getEnclosingMethod() != null;
-    }
-
-    @Override
-    public boolean isSynthesizedJavaLambdaClass() {
-      return dexClass.type.getName().contains("$Lambda$");
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return DexInspector.this.getOriginalSignatureAttribute(
-          dexClass.annotations, GenericSignatureParser::parseClassSignature);
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return DexInspector.this.getFinalSignatureAttribute(dexClass.annotations);
-    }
-
-    @Override
-    public String toString() {
-      return dexClass.toSourceString();
-    }
-  }
-
-  public abstract static class MemberSubject extends Subject {
-
-    public abstract boolean isPublic();
-
-    public abstract boolean isStatic();
-
-    public abstract boolean isFinal();
-
-    public abstract Signature getOriginalSignature();
-
-    public abstract Signature getFinalSignature();
-
-    public String getOriginalName() {
-      Signature originalSignature = getOriginalSignature();
-      return originalSignature == null ? null : originalSignature.name;
-    }
-
-    public String getFinalName() {
-      Signature finalSignature = getFinalSignature();
-      return finalSignature == null ? null : finalSignature.name;
-    }
-  }
-
-  public abstract static class MethodSubject extends MemberSubject {
-
-    public abstract boolean isAbstract();
-
-    public abstract boolean isBridge();
-
-    public abstract boolean isInstanceInitializer();
-
-    public abstract boolean isClassInitializer();
-
-    public abstract String getOriginalSignatureAttribute();
-
-    public abstract String getFinalSignatureAttribute();
-
-    public abstract DexEncodedMethod getMethod();
-
-    public Iterator<InstructionSubject> iterateInstructions() {
-      return null;
-    }
-
-    public <T extends InstructionSubject> Iterator<T> iterateInstructions(
-        Predicate<InstructionSubject> filter) {
-      return null;
-    }
-  }
-
-  public class AbsentMethodSubject extends MethodSubject {
-
-    @Override
-    public boolean isPresent() {
-      return false;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    @Override
-    public boolean isPublic() {
-      return false;
-    }
-
-    @Override
-    public boolean isStatic() {
-      return false;
-    }
-
-    @Override
-    public boolean isFinal() {
-      return false;
-    }
-
-    @Override
-    public boolean isAbstract() {
-      return false;
-    }
-
-    @Override
-    public boolean isBridge() {
-      return false;
-    }
-
-    @Override
-    public boolean isInstanceInitializer() {
-      return false;
-    }
-
-    @Override
-    public boolean isClassInitializer() {
-      return false;
-    }
-
-    @Override
-    public DexEncodedMethod getMethod() {
-      return null;
-    }
-
-    @Override
-    public Signature getOriginalSignature() {
-      return null;
-    }
-
-    @Override
-    public Signature getFinalSignature() {
-      return null;
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return null;
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return null;
-    }
-  }
-
-  public class FoundMethodSubject extends MethodSubject {
-
-    private final FoundClassSubject clazz;
-    private final DexEncodedMethod dexMethod;
-
-    public FoundMethodSubject(DexEncodedMethod encoded, FoundClassSubject clazz) {
-      this.clazz = clazz;
-      this.dexMethod = encoded;
-    }
-
-    @Override
-    public boolean isPresent() {
-      return true;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return clazz.naming != null && !getFinalSignature().name.equals(getOriginalSignature().name);
-    }
-
-    @Override
-    public boolean isPublic() {
-      return dexMethod.accessFlags.isPublic();
-    }
-
-    @Override
-    public boolean isStatic() {
-      return dexMethod.accessFlags.isStatic();
-    }
-
-    @Override
-    public boolean isFinal() {
-      return dexMethod.accessFlags.isFinal();
-    }
-
-    @Override
-    public boolean isAbstract() {
-      return dexMethod.accessFlags.isAbstract();
-    }
-
-    @Override
-    public boolean isBridge() {
-      return dexMethod.accessFlags.isBridge();
-    }
-
-    @Override
-    public boolean isInstanceInitializer() {
-      return dexMethod.isInstanceInitializer();
-    }
-
-    @Override
-    public boolean isClassInitializer() {
-      return dexMethod.isClassInitializer();
-    }
-
-    @Override
-    public DexEncodedMethod getMethod() {
-      return dexMethod;
-    }
-
-    @Override
-    public MethodSignature getOriginalSignature() {
-      MethodSignature signature = getFinalSignature();
-      if (clazz.naming == null) {
-        return signature;
-      }
-
-      // Map the parameters and return type to original names. This is needed as the in the
-      // Proguard map the names on the left side are the original names. E.g.
-      //
-      //   X -> a
-      //     X method(X) -> a
-      //
-      // whereas the final signature is for X.a is "a (a)"
-      String[] OriginalParameters = new String[signature.parameters.length];
-      for (int i = 0; i < OriginalParameters.length; i++) {
-        String obfuscated = signature.parameters[i];
-        String original = originalToObfuscatedMapping.inverse().get(obfuscated);
-        OriginalParameters[i] = original != null ? original : obfuscated;
-      }
-      String obfuscatedReturnType = signature.type;
-      String originalReturnType = originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
-      String returnType = originalReturnType != null ? originalReturnType : obfuscatedReturnType;
-
-      MethodSignature lookupSignature =
-          new MethodSignature(signature.name, returnType, OriginalParameters);
-
-      MemberNaming memberNaming = clazz.naming.lookup(lookupSignature);
-      return memberNaming != null
-          ? (MethodSignature) memberNaming.getOriginalSignature()
-          : signature;
-    }
-
-    @Override
-    public MethodSignature getFinalSignature() {
-      return MemberNaming.MethodSignature.fromDexMethod(dexMethod.method);
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return DexInspector.this.getOriginalSignatureAttribute(
-          dexMethod.annotations, GenericSignatureParser::parseMethodSignature);
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return DexInspector.this.getFinalSignatureAttribute(dexMethod.annotations);
-    }
-
-    @Override
-    public Iterator<InstructionSubject> iterateInstructions() {
-      return createInstructionIterator(this);
-    }
-
-    @Override
-    public <T extends InstructionSubject> Iterator<T> iterateInstructions(
-        Predicate<InstructionSubject> filter) {
-      return new FilteredInstructionIterator<>(this, filter);
-    }
-
-    @Override
-    public String toString() {
-      return dexMethod.toSourceString();
-    }
-  }
-
-  public abstract static class FieldSubject extends MemberSubject {
-    public abstract boolean hasExplicitStaticValue();
-
-    public abstract DexEncodedField getField();
-
-    public abstract DexValue getStaticValue();
-
-    public abstract boolean isRenamed();
-
-    public abstract String getOriginalSignatureAttribute();
-
-    public abstract String getFinalSignatureAttribute();
-  }
-
-  public static class AbsentFieldSubject extends FieldSubject {
-
-    @Override
-    public boolean isPublic() {
-      return false;
-    }
-
-    @Override
-    public boolean isStatic() {
-      return false;
-    }
-
-    @Override
-    public boolean isFinal() {
-      return false;
-    }
-
-    @Override
-    public boolean isPresent() {
-      return false;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    @Override
-    public Signature getOriginalSignature() {
-      return null;
-    }
-
-    @Override
-    public Signature getFinalSignature() {
-      return null;
-    }
-
-    @Override
-    public boolean hasExplicitStaticValue() {
-      return false;
-    }
-
-    @Override
-    public DexValue getStaticValue() {
-      return null;
-    }
-
-    @Override
-    public DexEncodedField getField() {
-      return null;
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return null;
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return null;
-    }
-  }
-
-  public class FoundFieldSubject extends FieldSubject {
-
-    private final FoundClassSubject clazz;
-    private final DexEncodedField dexField;
-
-    public FoundFieldSubject(DexEncodedField dexField, FoundClassSubject clazz) {
-      this.clazz = clazz;
-      this.dexField = dexField;
-    }
-
-    @Override
-    public boolean isPublic() {
-      return dexField.accessFlags.isPublic();
-    }
-
-    @Override
-    public boolean isStatic() {
-      return dexField.accessFlags.isStatic();
-    }
-
-    @Override
-    public boolean isFinal() {
-      return dexField.accessFlags.isFinal();
-    }
-
-    @Override
-    public boolean isPresent() {
-      return true;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return clazz.naming != null && !getFinalSignature().name.equals(getOriginalSignature().name);
-    }
-
-
-    public TypeSubject type() {
-      return new TypeSubject(dexField.field.type);
-    }
-
-    @Override
-    public FieldSignature getOriginalSignature() {
-      FieldSignature signature = getFinalSignature();
-      if (clazz.naming == null) {
-        return signature;
-      }
-
-      // Map the type to the original name. This is needed as the in the Proguard map the
-      // names on the left side are the original names. E.g.
-      //
-      //   X -> a
-      //     X field -> a
-      //
-      // whereas the final signature is for X.a is "a a"
-      String obfuscatedType = signature.type;
-      String originalType = originalToObfuscatedMapping.inverse().get(obfuscatedType);
-      String fieldType = originalType != null ? originalType : obfuscatedType;
-
-      FieldSignature lookupSignature = new FieldSignature(signature.name, fieldType);
-
-      MemberNaming memberNaming = clazz.naming.lookup(lookupSignature);
-      return memberNaming != null
-          ? (FieldSignature) memberNaming.getOriginalSignature()
-          : signature;
-    }
-
-    @Override
-    public FieldSignature getFinalSignature() {
-      return MemberNaming.FieldSignature.fromDexField(dexField.field);
-    }
-
-    @Override
-    public boolean hasExplicitStaticValue() {
-      return isStatic() && dexField.hasExplicitStaticValue();
-    }
-
-    @Override
-    public DexValue getStaticValue() {
-      return dexField.getStaticValue();
-    }
-
-    @Override
-    public DexEncodedField getField() {
-      return dexField;
-    }
-
-    @Override
-    public String getOriginalSignatureAttribute() {
-      return DexInspector.this.getOriginalSignatureAttribute(
-          dexField.annotations, GenericSignatureParser::parseFieldSignature);
-    }
-
-    @Override
-    public String getFinalSignatureAttribute() {
-      return DexInspector.this.getFinalSignatureAttribute(dexField.annotations);
-    }
-
-    @Override
-    public String toString() {
-      return dexField.toSourceString();
-    }
-  }
-
-  public class TypeSubject extends Subject {
-
-    private final DexType dexType;
-
-    TypeSubject(DexType dexType) {
-      this.dexType = dexType;
-    }
-
-    @Override
-    public boolean isPresent() {
-      return true;
-    }
-
-    @Override
-    public boolean isRenamed() {
-      return false;
-    }
-
-    public boolean is(String type) {
-      return dexType.equals(toDexType(type));
-    }
-
-    public String toString() {
-      return dexType.toSourceString();
-    }
-  }
-
-  public interface InstructionSubject {
-    boolean isFieldAccess();
-
-    boolean isInvokeVirtual();
-
-    boolean isInvokeInterface();
-
-    boolean isInvokeDirect();
-
-    boolean isInvokeSuper();
-
-    boolean isInvokeStatic();
-
-    boolean isNop();
-
-    boolean isConstString();
-
-    boolean isConstString(String value);
-
-    boolean isGoto();
-
-    boolean isIfNez();
-
-    boolean isIfEqz();
-
-    boolean isReturnVoid();
-
-    boolean isThrow();
-
-    default boolean isInvoke() {
-      return isInvokeVirtual()
-          || isInvokeInterface()
-          || isInvokeDirect()
-          || isInvokeSuper()
-          || isInvokeStatic();
-    }
-  }
-
-  public InstructionSubject createInstructionSubject(Instruction instruction) {
-    DexInstructionSubject dexInst = new DexInstructionSubject(instruction);
-    if (dexInst.isInvoke()) {
-      return new InvokeDexInstructionSubject(instruction);
-    } else if (dexInst.isFieldAccess()) {
-      return new FieldAccessDexInstructionSubject(instruction);
-    } else {
-      return dexInst;
-    }
-  }
-
-  public class DexInstructionSubject implements InstructionSubject {
-    protected Instruction instruction;
-
-    public DexInstructionSubject(Instruction instruction) {
-      this.instruction = instruction;
-    }
-
-    @Override
-    public boolean isFieldAccess() {
-      return isInstanceGet() || isInstancePut() || isStaticGet() || isStaticSet();
-    }
-
-    @Override
-    public boolean isInvokeVirtual() {
-      return instruction instanceof InvokeVirtual || instruction instanceof InvokeVirtualRange;
-    }
-
-    @Override
-    public boolean isInvokeInterface() {
-      return instruction instanceof InvokeInterface || instruction instanceof InvokeInterfaceRange;
-    }
-
-    @Override
-    public boolean isInvokeDirect() {
-      return instruction instanceof InvokeDirect || instruction instanceof InvokeDirectRange;
-    }
-
-    @Override
-    public boolean isInvokeSuper() {
-      return instruction instanceof InvokeSuper || instruction instanceof InvokeSuperRange;
-    }
-
-    @Override
-    public boolean isInvokeStatic() {
-      return instruction instanceof InvokeStatic || instruction instanceof InvokeStaticRange;
-    }
-
-    @Override
-    public boolean isNop() {
-      return instruction instanceof Nop;
-    }
-
-    @Override
-    public boolean isConstString() {
-      return instruction instanceof ConstString;
-    }
-
-    @Override
-    public boolean isConstString(String value) {
-      return instruction instanceof ConstString
-          && ((ConstString) instruction).BBBB.toSourceString().equals(value);
-    }
-
-    @Override
-    public boolean isGoto() {
-
-      return instruction instanceof Goto;
-    }
-
-    @Override
-    public boolean isIfNez() {
-      return instruction instanceof IfNez;
-    }
-
-    @Override
-    public boolean isIfEqz() {
-      return instruction instanceof IfEqz;
-    }
-
-    @Override
-    public boolean isReturnVoid() {
-      return instruction instanceof ReturnVoid;
-    }
-
-    @Override
-    public boolean isThrow() {
-      return instruction instanceof Throw;
-    }
-
-    public boolean isConst4() {
-      return instruction instanceof Const4;
-    }
-
-    public boolean isInstanceGet() {
-      return instruction instanceof Iget
-          || instruction instanceof IgetBoolean
-          || instruction instanceof IgetByte
-          || instruction instanceof IgetShort
-          || instruction instanceof IgetChar
-          || instruction instanceof IgetWide
-          || instruction instanceof IgetObject;
-    }
-
-    public boolean isInstancePut() {
-      return instruction instanceof Iput
-          || instruction instanceof IputBoolean
-          || instruction instanceof IputByte
-          || instruction instanceof IputShort
-          || instruction instanceof IputChar
-          || instruction instanceof IputWide
-          || instruction instanceof IputObject;
-    }
-
-    public boolean isStaticGet() {
-      return instruction instanceof Sget
-          || instruction instanceof SgetBoolean
-          || instruction instanceof SgetByte
-          || instruction instanceof SgetShort
-          || instruction instanceof SgetChar
-          || instruction instanceof SgetWide
-          || instruction instanceof SgetObject;
-    }
-
-    public boolean isStaticSet() {
-      return instruction instanceof Sput
-          || instruction instanceof SputBoolean
-          || instruction instanceof SputByte
-          || instruction instanceof SputShort
-          || instruction instanceof SputChar
-          || instruction instanceof SputWide
-          || instruction instanceof SputObject;
-    }
-  }
-
-  public interface InvokeInstructionSubject extends InstructionSubject {
-    TypeSubject holder();
-
-    DexMethod invokedMethod();
-  }
-
-  public interface FieldAccessInstructionSubject extends InstructionSubject {
-    TypeSubject holder();
-  }
-
-  public class InvokeDexInstructionSubject extends DexInstructionSubject
-      implements InvokeInstructionSubject {
-
-    public InvokeDexInstructionSubject(Instruction instruction) {
-      super(instruction);
-      assert isInvoke();
-    }
-
-    public TypeSubject holder() {
-      return new TypeSubject(invokedMethod().getHolder());
-    }
-
-    public DexMethod invokedMethod() {
-      return instruction.getMethod();
-    }
-  }
-
-  public class FieldAccessDexInstructionSubject extends DexInstructionSubject
-      implements FieldAccessInstructionSubject {
-
-    public FieldAccessDexInstructionSubject(Instruction instruction) {
-      super(instruction);
-      assert isFieldAccess();
-    }
-
-    public TypeSubject holder() {
-      return new TypeSubject(instruction.getField().getHolder());
-    }
-  }
-
-  private interface InstructionIterator extends Iterator<InstructionSubject> {}
-
-  private InstructionIterator createInstructionIterator(MethodSubject method) {
-    Code code = method.getMethod().getCode();
-    assert code != null && code.isDexCode();
-    return new DexInstructionIterator(method);
-  }
-
-  private class DexInstructionIterator implements InstructionIterator {
-
-    private final DexCode code;
-    private int index;
-
-    DexInstructionIterator(MethodSubject method) {
-      assert method.isPresent();
-      Code code = method.getMethod().getCode();
-      assert code != null && code.isDexCode();
-      this.code = code.asDexCode();
-      this.index = 0;
-    }
-
-    @Override
-    public boolean hasNext() {
-      return index < code.instructions.length;
-    }
-
-    @Override
-    public InstructionSubject next() {
-      if (index == code.instructions.length) {
-        throw new NoSuchElementException();
-      }
-      return createInstructionSubject(code.instructions[index++]);
-    }
-  }
-
-  private class FilteredInstructionIterator<T extends InstructionSubject> implements Iterator<T> {
-
-    private final InstructionIterator iterator;
-    private final Predicate<InstructionSubject> predicate;
-    private InstructionSubject pendingNext = null;
-
-    FilteredInstructionIterator(MethodSubject method, Predicate<InstructionSubject> predicate) {
-      this.iterator = createInstructionIterator(method);
-      this.predicate = predicate;
-      hasNext();
-    }
-
-    @Override
-    public boolean hasNext() {
-      if (pendingNext == null) {
-        while (iterator.hasNext()) {
-          pendingNext = iterator.next();
-          if (predicate.test(pendingNext)) {
-            break;
-          }
-          pendingNext = null;
-        }
-      }
-      return pendingNext != null;
-    }
-
-    @Override
-    public T next() {
-      hasNext();
-      if (pendingNext == null) {
-        throw new NoSuchElementException();
-      }
-      // We cannot tell if the provided predicate will only match instruction subjects of type T.
-      @SuppressWarnings("unchecked")
-      T result = (T) pendingNext;
-      pendingNext = null;
-      return result;
-    }
-  }
-
-  // Build the generic signature using the current mapping if any.
-  class GenericSignatureGenerater implements GenericSignatureAction<String> {
-
-    private StringBuilder signature;
-
-    public String getSignature() {
-      return signature.toString();
-    }
-
-    @Override
-    public void parsedSymbol(char symbol) {
-      signature.append(symbol);
-    }
-
-    @Override
-    public void parsedIdentifier(String identifier) {
-      signature.append(identifier);
-    }
-
-    @Override
-    public String parsedTypeName(String name) {
-      String type = name;
-      if (originalToObfuscatedMapping != null) {
-        String original = originalToObfuscatedMapping.inverse().get(name);
-        type = original != null ? original : name;
-      }
-      signature.append(type);
-      return type;
-    }
-
-    @Override
-    public String parsedInnerTypeName(String enclosingType, String name) {
-      String type;
-      if (originalToObfuscatedMapping != null) {
-        // The enclosingType has already been mapped if a mapping is present.
-        String minifiedEnclosing = originalToObfuscatedMapping.get(enclosingType);
-        type = originalToObfuscatedMapping.inverse().get(minifiedEnclosing + "$" + name);
-        if (type != null) {
-          assert type.startsWith(enclosingType + "$");
-          name = type.substring(enclosingType.length() + 1);
-        }
-      } else {
-        type = enclosingType + "$" + name;
-      }
-      signature.append(name);
-      return type;
-    }
-
-    @Override
-    public void start() {
-      signature = new StringBuilder();
-    }
-
-    @Override
-    public void stop() {
-      // nothing to do
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
new file mode 100644
index 0000000..e6d9306
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentAnnotationSubject.java
@@ -0,0 +1,25 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedAnnotation;
+
+public class AbsentAnnotationSubject extends AnnotationSubject {
+
+  @Override
+  public boolean isPresent() {
+    return false;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  @Override
+  public DexEncodedAnnotation getAnnotation() {
+    throw new UnsupportedOperationException();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
new file mode 100644
index 0000000..7213a54
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentClassSubject.java
@@ -0,0 +1,114 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexClass;
+import java.util.List;
+import java.util.function.Consumer;
+
+public class AbsentClassSubject extends ClassSubject {
+
+  private DexInspector dexInspector;
+
+  public AbsentClassSubject(DexInspector dexInspector) {
+    this.dexInspector = dexInspector;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return false;
+  }
+
+  @Override
+  public void forAllMethods(Consumer<FoundMethodSubject> inspection) {}
+
+  @Override
+  public MethodSubject method(String returnType, String name, List<String> parameters) {
+    return new AbsentMethodSubject();
+  }
+
+  @Override
+  public void forAllFields(Consumer<FoundFieldSubject> inspection) {}
+
+  @Override
+  public FieldSubject field(String type, String name) {
+    return new AbsentFieldSubject();
+  }
+
+  @Override
+  public boolean isAbstract() {
+    return false;
+  }
+
+  @Override
+  public boolean isAnnotation() {
+    return false;
+  }
+
+  @Override
+  public DexClass getDexClass() {
+    return null;
+  }
+
+  @Override
+  public AnnotationSubject annotation(String name) {
+    return new AbsentAnnotationSubject();
+  }
+
+  @Override
+  public String getOriginalName() {
+    return null;
+  }
+
+  @Override
+  public String getOriginalDescriptor() {
+    return null;
+  }
+
+  @Override
+  public String getFinalName() {
+    return null;
+  }
+
+  @Override
+  public String getFinalDescriptor() {
+    return null;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  @Override
+  public boolean isMemberClass() {
+    return false;
+  }
+
+  @Override
+  public boolean isLocalClass() {
+    return false;
+  }
+
+  @Override
+  public boolean isAnonymousClass() {
+    return false;
+  }
+
+  @Override
+  public boolean isSynthesizedJavaLambdaClass() {
+    return false;
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return null;
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return null;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
new file mode 100644
index 0000000..f79fc00
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentFieldSubject.java
@@ -0,0 +1,72 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexValue;
+import com.android.tools.r8.naming.MemberNaming.Signature;
+
+public class AbsentFieldSubject extends FieldSubject {
+
+  @Override
+  public boolean isPublic() {
+    return false;
+  }
+
+  @Override
+  public boolean isStatic() {
+    return false;
+  }
+
+  @Override
+  public boolean isFinal() {
+    return false;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return false;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  @Override
+  public Signature getOriginalSignature() {
+    return null;
+  }
+
+  @Override
+  public Signature getFinalSignature() {
+    return null;
+  }
+
+  @Override
+  public boolean hasExplicitStaticValue() {
+    return false;
+  }
+
+  @Override
+  public DexValue getStaticValue() {
+    return null;
+  }
+
+  @Override
+  public DexEncodedField getField() {
+    return null;
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return null;
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return null;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
new file mode 100644
index 0000000..5f10dd7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/AbsentMethodSubject.java
@@ -0,0 +1,81 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.naming.MemberNaming.Signature;
+
+public class AbsentMethodSubject extends MethodSubject {
+
+  @Override
+  public boolean isPresent() {
+    return false;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  @Override
+  public boolean isPublic() {
+    return false;
+  }
+
+  @Override
+  public boolean isStatic() {
+    return false;
+  }
+
+  @Override
+  public boolean isFinal() {
+    return false;
+  }
+
+  @Override
+  public boolean isAbstract() {
+    return false;
+  }
+
+  @Override
+  public boolean isBridge() {
+    return false;
+  }
+
+  @Override
+  public boolean isInstanceInitializer() {
+    return false;
+  }
+
+  @Override
+  public boolean isClassInitializer() {
+    return false;
+  }
+
+  @Override
+  public DexEncodedMethod getMethod() {
+    return null;
+  }
+
+  @Override
+  public Signature getOriginalSignature() {
+    return null;
+  }
+
+  @Override
+  public Signature getFinalSignature() {
+    return null;
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return null;
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return null;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
new file mode 100644
index 0000000..24682be
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/AnnotationSubject.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedAnnotation;
+
+public abstract class AnnotationSubject extends Subject {
+
+  public abstract DexEncodedAnnotation getAnnotation();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
new file mode 100644
index 0000000..afb4928
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/ClassSubject.java
@@ -0,0 +1,86 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.smali.SmaliBuilder;
+import com.google.common.collect.ImmutableList;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+
+public abstract class ClassSubject extends Subject {
+
+  public abstract void forAllMethods(Consumer<FoundMethodSubject> inspection);
+
+  public MethodSubject method(Method method) {
+    List<String> parameters = new ArrayList<>();
+    for (Class<?> parameterType : method.getParameterTypes()) {
+      parameters.add(parameterType.getTypeName());
+    }
+    return method(method.getReturnType().getTypeName(), method.getName(), parameters);
+  }
+
+  public abstract MethodSubject method(String returnType, String name, List<String> parameters);
+
+  public MethodSubject clinit() {
+    return method("void", "<clinit>", ImmutableList.of());
+  }
+
+  public MethodSubject init(List<String> parameters) {
+    return method("void", "<init>", parameters);
+  }
+
+  public MethodSubject method(MethodSignature signature) {
+    return method(signature.type, signature.name, ImmutableList.copyOf(signature.parameters));
+  }
+
+  public MethodSubject method(SmaliBuilder.MethodSignature signature) {
+    return method(
+        signature.returnType, signature.name, ImmutableList.copyOf(signature.parameterTypes));
+  }
+
+  public abstract void forAllFields(Consumer<FoundFieldSubject> inspection);
+
+  public abstract FieldSubject field(String type, String name);
+
+  public abstract boolean isAbstract();
+
+  public abstract boolean isAnnotation();
+
+  public String dumpMethods() {
+    StringBuilder dump = new StringBuilder();
+    forAllMethods(
+        (FoundMethodSubject method) ->
+            dump.append(method.getMethod().toString()).append(method.getMethod().codeToString()));
+    return dump.toString();
+  }
+
+  public abstract DexClass getDexClass();
+
+  public abstract AnnotationSubject annotation(String name);
+
+  public abstract String getOriginalName();
+
+  public abstract String getOriginalDescriptor();
+
+  public abstract String getFinalName();
+
+  public abstract String getFinalDescriptor();
+
+  public abstract boolean isMemberClass();
+
+  public abstract boolean isLocalClass();
+
+  public abstract boolean isAnonymousClass();
+
+  public abstract boolean isSynthesizedJavaLambdaClass();
+
+  public abstract String getOriginalSignatureAttribute();
+
+  public abstract String getFinalSignatureAttribute();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
new file mode 100644
index 0000000..51e4ce2
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInspector.java
@@ -0,0 +1,322 @@
+// Copyright (c) 2016, 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.utils.dexinspector;
+
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.StringResource;
+import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.graph.Code;
+import com.android.tools.r8.graph.DexAnnotation;
+import com.android.tools.r8.graph.DexAnnotationElement;
+import com.android.tools.r8.graph.DexAnnotationSet;
+import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.DexValue;
+import com.android.tools.r8.graph.DexValue.DexValueArray;
+import com.android.tools.r8.graph.DexValue.DexValueString;
+import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.naming.ClassNamingForNameMapper;
+import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.naming.signature.GenericSignatureAction;
+import com.android.tools.r8.naming.signature.GenericSignatureParser;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.Timing;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+public class DexInspector {
+
+  private final DexApplication application;
+  final DexItemFactory dexItemFactory;
+  private final ClassNameMapper mapping;
+  final BiMap<String, String> originalToObfuscatedMapping;
+
+  public static MethodSignature MAIN =
+      new MethodSignature("main", "void", new String[] {"java.lang.String[]"});
+
+  public DexInspector(Path file, String mappingFile) throws IOException, ExecutionException {
+    this(Collections.singletonList(file), mappingFile);
+  }
+
+  public DexInspector(Path file) throws IOException, ExecutionException {
+    this(Collections.singletonList(file), null);
+  }
+
+  public DexInspector(List<Path> files) throws IOException, ExecutionException {
+    this(files, null);
+  }
+
+  public DexInspector(List<Path> files, String mappingFile) throws IOException, ExecutionException {
+    if (mappingFile != null) {
+      this.mapping = ClassNameMapper.mapperFromFile(Paths.get(mappingFile));
+      originalToObfuscatedMapping = this.mapping.getObfuscatedToOriginalMapping().inverse();
+    } else {
+      this.mapping = null;
+      originalToObfuscatedMapping = null;
+    }
+    Timing timing = new Timing("DexInspector");
+    InternalOptions options = new InternalOptions();
+    dexItemFactory = options.itemFactory;
+    AndroidApp input = AndroidApp.builder().addProgramFiles(files).build();
+    application = new ApplicationReader(input, options, timing).read();
+  }
+
+  public DexInspector(AndroidApp app) throws IOException, ExecutionException {
+    this(
+        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+            .read(app.getProguardMapOutputData()));
+  }
+
+  public DexInspector(AndroidApp app, Consumer<InternalOptions> optionsConsumer)
+      throws IOException, ExecutionException {
+    this(
+        new ApplicationReader(app, runOptionsConsumer(optionsConsumer), new Timing("DexInspector"))
+            .read(app.getProguardMapOutputData()));
+  }
+
+  private static InternalOptions runOptionsConsumer(Consumer<InternalOptions> optionsConsumer) {
+    InternalOptions internalOptions = new InternalOptions();
+    optionsConsumer.accept(internalOptions);
+    return internalOptions;
+  }
+
+  public DexInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
+    this(
+        new ApplicationReader(app, new InternalOptions(), new Timing("DexInspector"))
+            .read(StringResource.fromFile(proguardMap)));
+  }
+
+  public DexInspector(DexApplication application) {
+    dexItemFactory = application.dexItemFactory;
+    this.application = application;
+    this.mapping = application.getProguardMap();
+    originalToObfuscatedMapping =
+        mapping == null ? null : mapping.getObfuscatedToOriginalMapping().inverse();
+  }
+
+  public DexItemFactory getFactory() {
+    return dexItemFactory;
+  }
+
+  DexType toDexType(String string) {
+    return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptor(string));
+  }
+
+  private DexType toDexTypeIgnorePrimitives(String string) {
+    return dexItemFactory.createType(DescriptorUtils.javaTypeToDescriptorIgnorePrimitives(string));
+  }
+
+  static <S, T extends Subject> void forAll(
+      S[] items,
+      BiFunction<S, FoundClassSubject, ? extends T> constructor,
+      FoundClassSubject clazz,
+      Consumer<T> consumer) {
+    for (S item : items) {
+      consumer.accept(constructor.apply(item, clazz));
+    }
+  }
+
+  private static <S, T extends Subject> void forAll(
+      Iterable<S> items, Function<S, T> constructor, Consumer<T> consumer) {
+    for (S item : items) {
+      consumer.accept(constructor.apply(item));
+    }
+  }
+
+  DexAnnotation findAnnotation(String name, DexAnnotationSet annotations) {
+    for (DexAnnotation annotation : annotations.annotations) {
+      DexType type = annotation.annotation.type;
+      String original = mapping == null ? type.toSourceString() : mapping.originalNameOf(type);
+      if (original.equals(name)) {
+        return annotation;
+      }
+    }
+    return null;
+  }
+
+  public String getFinalSignatureAttribute(DexAnnotationSet annotations) {
+    DexAnnotation annotation = findAnnotation("dalvik.annotation.Signature", annotations);
+    if (annotation == null) {
+      return null;
+    }
+    assert annotation.annotation.elements.length == 1;
+    DexAnnotationElement element = annotation.annotation.elements[0];
+    assert element.value instanceof DexValueArray;
+    StringBuilder builder = new StringBuilder();
+    DexValueArray valueArray = (DexValueArray) element.value;
+    for (DexValue value : valueArray.getValues()) {
+      assertTrue(value instanceof DexValueString);
+      DexValueString s = (DexValueString) value;
+      builder.append(s.getValue());
+    }
+    return builder.toString();
+  }
+
+  public String getOriginalSignatureAttribute(
+      DexAnnotationSet annotations, BiConsumer<GenericSignatureParser, String> parse) {
+    String finalSignature = getFinalSignatureAttribute(annotations);
+    if (finalSignature == null || mapping == null) {
+      return finalSignature;
+    }
+
+    GenericSignatureGenerator rewriter = new GenericSignatureGenerator();
+    GenericSignatureParser<String> parser = new GenericSignatureParser<>(rewriter);
+    parse.accept(parser, finalSignature);
+    return rewriter.getSignature();
+  }
+
+  public ClassSubject clazz(Class clazz) {
+    return clazz(clazz.getTypeName());
+  }
+
+  /** Lookup a class by name. This allows both original and obfuscated names. */
+  public ClassSubject clazz(String name) {
+    ClassNamingForNameMapper naming = null;
+    if (mapping != null) {
+      String obfuscated = originalToObfuscatedMapping.get(name);
+      if (obfuscated != null) {
+        naming = mapping.getClassNaming(obfuscated);
+        name = obfuscated;
+      } else {
+        // Figure out if the name is an already obfuscated name.
+        String original = originalToObfuscatedMapping.inverse().get(name);
+        if (original != null) {
+          naming = mapping.getClassNaming(name);
+        }
+      }
+    }
+    DexClass clazz = application.definitionFor(toDexTypeIgnorePrimitives(name));
+    if (clazz == null) {
+      return new AbsentClassSubject(this);
+    }
+    return new FoundClassSubject(this, clazz, naming);
+  }
+
+  public void forAllClasses(Consumer<FoundClassSubject> inspection) {
+    forAll(
+        application.classes(),
+        cls -> {
+          ClassSubject subject = clazz(cls.type.toSourceString());
+          assert subject.isPresent();
+          return (FoundClassSubject) subject;
+        },
+        inspection);
+  }
+
+  public List<FoundClassSubject> allClasses() {
+    ImmutableList.Builder<FoundClassSubject> builder = ImmutableList.builder();
+    forAllClasses(builder::add);
+    return builder.build();
+  }
+
+  public MethodSubject method(Method method) {
+    ClassSubject clazz = clazz(method.getDeclaringClass());
+    if (!clazz.isPresent()) {
+      return new AbsentMethodSubject();
+    }
+    return clazz.method(method);
+  }
+
+  String getObfuscatedTypeName(String originalTypeName) {
+    String obfuscatedType = null;
+    if (mapping != null) {
+      obfuscatedType = originalToObfuscatedMapping.get(originalTypeName);
+    }
+    obfuscatedType = obfuscatedType == null ? originalTypeName : obfuscatedType;
+    return obfuscatedType;
+  }
+
+  InstructionSubject createInstructionSubject(Instruction instruction) {
+    DexInstructionSubject dexInst = new DexInstructionSubject(instruction);
+    if (dexInst.isInvoke()) {
+      return new InvokeDexInstructionSubject(this, instruction);
+    } else if (dexInst.isFieldAccess()) {
+      return new FieldAccessDexInstructionSubject(this, instruction);
+    } else {
+      return dexInst;
+    }
+  }
+
+  InstructionIterator createInstructionIterator(MethodSubject method) {
+    Code code = method.getMethod().getCode();
+    assert code != null && code.isDexCode();
+    return new DexInstructionIterator(this, method);
+  }
+
+  // Build the generic signature using the current mapping if any.
+  class GenericSignatureGenerator implements GenericSignatureAction<String> {
+
+    private StringBuilder signature;
+
+    public String getSignature() {
+      return signature.toString();
+    }
+
+    @Override
+    public void parsedSymbol(char symbol) {
+      signature.append(symbol);
+    }
+
+    @Override
+    public void parsedIdentifier(String identifier) {
+      signature.append(identifier);
+    }
+
+    @Override
+    public String parsedTypeName(String name) {
+      String type = name;
+      if (originalToObfuscatedMapping != null) {
+        String original = originalToObfuscatedMapping.inverse().get(name);
+        type = original != null ? original : name;
+      }
+      signature.append(type);
+      return type;
+    }
+
+    @Override
+    public String parsedInnerTypeName(String enclosingType, String name) {
+      String type;
+      if (originalToObfuscatedMapping != null) {
+        // The enclosingType has already been mapped if a mapping is present.
+        String minifiedEnclosing = originalToObfuscatedMapping.get(enclosingType);
+        type = originalToObfuscatedMapping.inverse().get(minifiedEnclosing + "$" + name);
+        if (type != null) {
+          assert type.startsWith(enclosingType + "$");
+          name = type.substring(enclosingType.length() + 1);
+        }
+      } else {
+        type = enclosingType + "$" + name;
+      }
+      signature.append(name);
+      return type;
+    }
+
+    @Override
+    public void start() {
+      signature = new StringBuilder();
+    }
+
+    @Override
+    public void stop() {
+      // nothing to do
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
new file mode 100644
index 0000000..eaff010
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionIterator.java
@@ -0,0 +1,38 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.Code;
+import com.android.tools.r8.graph.DexCode;
+import java.util.NoSuchElementException;
+
+class DexInstructionIterator implements InstructionIterator {
+
+  private DexInspector dexInspector;
+  private final DexCode code;
+  private int index;
+
+  DexInstructionIterator(DexInspector dexInspector, MethodSubject method) {
+    this.dexInspector = dexInspector;
+    assert method.isPresent();
+    Code code = method.getMethod().getCode();
+    assert code != null && code.isDexCode();
+    this.code = code.asDexCode();
+    this.index = 0;
+  }
+
+  @Override
+  public boolean hasNext() {
+    return index < code.instructions.length;
+  }
+
+  @Override
+  public InstructionSubject next() {
+    if (index == code.instructions.length) {
+      throw new NoSuchElementException();
+    }
+    return dexInspector.createInstructionSubject(code.instructions[index++]);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
new file mode 100644
index 0000000..b2320d3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/DexInstructionSubject.java
@@ -0,0 +1,177 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.code.Const4;
+import com.android.tools.r8.code.ConstString;
+import com.android.tools.r8.code.Goto;
+import com.android.tools.r8.code.IfEqz;
+import com.android.tools.r8.code.IfNez;
+import com.android.tools.r8.code.Iget;
+import com.android.tools.r8.code.IgetBoolean;
+import com.android.tools.r8.code.IgetByte;
+import com.android.tools.r8.code.IgetChar;
+import com.android.tools.r8.code.IgetObject;
+import com.android.tools.r8.code.IgetShort;
+import com.android.tools.r8.code.IgetWide;
+import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.code.InvokeDirect;
+import com.android.tools.r8.code.InvokeDirectRange;
+import com.android.tools.r8.code.InvokeInterface;
+import com.android.tools.r8.code.InvokeInterfaceRange;
+import com.android.tools.r8.code.InvokeStatic;
+import com.android.tools.r8.code.InvokeStaticRange;
+import com.android.tools.r8.code.InvokeSuper;
+import com.android.tools.r8.code.InvokeSuperRange;
+import com.android.tools.r8.code.InvokeVirtual;
+import com.android.tools.r8.code.InvokeVirtualRange;
+import com.android.tools.r8.code.Iput;
+import com.android.tools.r8.code.IputBoolean;
+import com.android.tools.r8.code.IputByte;
+import com.android.tools.r8.code.IputChar;
+import com.android.tools.r8.code.IputObject;
+import com.android.tools.r8.code.IputShort;
+import com.android.tools.r8.code.IputWide;
+import com.android.tools.r8.code.Nop;
+import com.android.tools.r8.code.ReturnVoid;
+import com.android.tools.r8.code.Sget;
+import com.android.tools.r8.code.SgetBoolean;
+import com.android.tools.r8.code.SgetByte;
+import com.android.tools.r8.code.SgetChar;
+import com.android.tools.r8.code.SgetObject;
+import com.android.tools.r8.code.SgetShort;
+import com.android.tools.r8.code.SgetWide;
+import com.android.tools.r8.code.Sput;
+import com.android.tools.r8.code.SputBoolean;
+import com.android.tools.r8.code.SputByte;
+import com.android.tools.r8.code.SputChar;
+import com.android.tools.r8.code.SputObject;
+import com.android.tools.r8.code.SputShort;
+import com.android.tools.r8.code.SputWide;
+import com.android.tools.r8.code.Throw;
+
+public class DexInstructionSubject implements InstructionSubject {
+  protected Instruction instruction;
+
+  public DexInstructionSubject(Instruction instruction) {
+    this.instruction = instruction;
+  }
+
+  @Override
+  public boolean isFieldAccess() {
+    return isInstanceGet() || isInstancePut() || isStaticGet() || isStaticSet();
+  }
+
+  @Override
+  public boolean isInvokeVirtual() {
+    return instruction instanceof InvokeVirtual || instruction instanceof InvokeVirtualRange;
+  }
+
+  @Override
+  public boolean isInvokeInterface() {
+    return instruction instanceof InvokeInterface || instruction instanceof InvokeInterfaceRange;
+  }
+
+  @Override
+  public boolean isInvokeDirect() {
+    return instruction instanceof InvokeDirect || instruction instanceof InvokeDirectRange;
+  }
+
+  @Override
+  public boolean isInvokeSuper() {
+    return instruction instanceof InvokeSuper || instruction instanceof InvokeSuperRange;
+  }
+
+  @Override
+  public boolean isInvokeStatic() {
+    return instruction instanceof InvokeStatic || instruction instanceof InvokeStaticRange;
+  }
+
+  @Override
+  public boolean isNop() {
+    return instruction instanceof Nop;
+  }
+
+  @Override
+  public boolean isConstString() {
+    return instruction instanceof ConstString;
+  }
+
+  @Override
+  public boolean isConstString(String value) {
+    return instruction instanceof ConstString
+        && ((ConstString) instruction).BBBB.toSourceString().equals(value);
+  }
+
+  @Override
+  public boolean isGoto() {
+
+    return instruction instanceof Goto;
+  }
+
+  @Override
+  public boolean isIfNez() {
+    return instruction instanceof IfNez;
+  }
+
+  @Override
+  public boolean isIfEqz() {
+    return instruction instanceof IfEqz;
+  }
+
+  @Override
+  public boolean isReturnVoid() {
+    return instruction instanceof ReturnVoid;
+  }
+
+  @Override
+  public boolean isThrow() {
+    return instruction instanceof Throw;
+  }
+
+  public boolean isConst4() {
+    return instruction instanceof Const4;
+  }
+
+  public boolean isInstanceGet() {
+    return instruction instanceof Iget
+        || instruction instanceof IgetBoolean
+        || instruction instanceof IgetByte
+        || instruction instanceof IgetShort
+        || instruction instanceof IgetChar
+        || instruction instanceof IgetWide
+        || instruction instanceof IgetObject;
+  }
+
+  public boolean isInstancePut() {
+    return instruction instanceof Iput
+        || instruction instanceof IputBoolean
+        || instruction instanceof IputByte
+        || instruction instanceof IputShort
+        || instruction instanceof IputChar
+        || instruction instanceof IputWide
+        || instruction instanceof IputObject;
+  }
+
+  public boolean isStaticGet() {
+    return instruction instanceof Sget
+        || instruction instanceof SgetBoolean
+        || instruction instanceof SgetByte
+        || instruction instanceof SgetShort
+        || instruction instanceof SgetChar
+        || instruction instanceof SgetWide
+        || instruction instanceof SgetObject;
+  }
+
+  public boolean isStaticSet() {
+    return instruction instanceof Sput
+        || instruction instanceof SputBoolean
+        || instruction instanceof SputByte
+        || instruction instanceof SputShort
+        || instruction instanceof SputChar
+        || instruction instanceof SputWide
+        || instruction instanceof SputObject;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
new file mode 100644
index 0000000..c3ea3fc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessDexInstructionSubject.java
@@ -0,0 +1,23 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.code.Instruction;
+
+public class FieldAccessDexInstructionSubject extends DexInstructionSubject
+    implements FieldAccessInstructionSubject {
+
+  private DexInspector dexInspector;
+
+  public FieldAccessDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
+    super(instruction);
+    this.dexInspector = dexInspector;
+    assert isFieldAccess();
+  }
+
+  public TypeSubject holder() {
+    return new TypeSubject(dexInspector, instruction.getField().getHolder());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
new file mode 100644
index 0000000..54b27c7
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldAccessInstructionSubject.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+public interface FieldAccessInstructionSubject extends InstructionSubject {
+  TypeSubject holder();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
new file mode 100644
index 0000000..1e9471b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FieldSubject.java
@@ -0,0 +1,22 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexValue;
+
+public abstract class FieldSubject extends MemberSubject {
+  public abstract boolean hasExplicitStaticValue();
+
+  public abstract DexEncodedField getField();
+
+  public abstract DexValue getStaticValue();
+
+  public abstract boolean isRenamed();
+
+  public abstract String getOriginalSignatureAttribute();
+
+  public abstract String getFinalSignatureAttribute();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
new file mode 100644
index 0000000..33ac77f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FilteredInstructionIterator.java
@@ -0,0 +1,52 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.function.Predicate;
+
+class FilteredInstructionIterator<T extends InstructionSubject> implements Iterator<T> {
+
+  private DexInspector dexInspector;
+  private final InstructionIterator iterator;
+  private final Predicate<InstructionSubject> predicate;
+  private InstructionSubject pendingNext = null;
+
+  FilteredInstructionIterator(
+      DexInspector dexInspector, MethodSubject method, Predicate<InstructionSubject> predicate) {
+    this.dexInspector = dexInspector;
+    this.iterator = dexInspector.createInstructionIterator(method);
+    this.predicate = predicate;
+    hasNext();
+  }
+
+  @Override
+  public boolean hasNext() {
+    if (pendingNext == null) {
+      while (iterator.hasNext()) {
+        pendingNext = iterator.next();
+        if (predicate.test(pendingNext)) {
+          break;
+        }
+        pendingNext = null;
+      }
+    }
+    return pendingNext != null;
+  }
+
+  @Override
+  public T next() {
+    hasNext();
+    if (pendingNext == null) {
+      throw new NoSuchElementException();
+    }
+    // We cannot tell if the provided predicate will only match instruction subjects of type T.
+    @SuppressWarnings("unchecked")
+    T result = (T) pendingNext;
+    pendingNext = null;
+    return result;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
new file mode 100644
index 0000000..ed85b24
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundAnnotationSubject.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexAnnotation;
+import com.android.tools.r8.graph.DexEncodedAnnotation;
+
+public class FoundAnnotationSubject extends AnnotationSubject {
+
+  private final DexAnnotation annotation;
+
+  public FoundAnnotationSubject(DexAnnotation annotation) {
+    this.annotation = annotation;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return true;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  @Override
+  public DexEncodedAnnotation getAnnotation() {
+    return annotation.annotation;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
new file mode 100644
index 0000000..12dbaeb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundClassSubject.java
@@ -0,0 +1,253 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexAnnotation;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.InnerClassAttribute;
+import com.android.tools.r8.naming.ClassNamingForNameMapper;
+import com.android.tools.r8.naming.MemberNaming;
+import com.android.tools.r8.naming.MemberNaming.FieldSignature;
+import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.naming.MemberNaming.Signature;
+import com.android.tools.r8.naming.signature.GenericSignatureParser;
+import com.android.tools.r8.utils.DescriptorUtils;
+import java.util.List;
+import java.util.function.Consumer;
+
+public class FoundClassSubject extends ClassSubject {
+
+  private DexInspector dexInspector;
+  private final DexClass dexClass;
+  final ClassNamingForNameMapper naming;
+
+  FoundClassSubject(DexInspector dexInspector, DexClass dexClass, ClassNamingForNameMapper naming) {
+    this.dexInspector = dexInspector;
+    this.dexClass = dexClass;
+    this.naming = naming;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return true;
+  }
+
+  @Override
+  public void forAllMethods(Consumer<FoundMethodSubject> inspection) {
+    DexInspector.forAll(
+        dexClass.directMethods(),
+        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        this,
+        inspection);
+    DexInspector.forAll(
+        dexClass.virtualMethods(),
+        (encoded, clazz) -> new FoundMethodSubject(dexInspector, encoded, clazz),
+        this,
+        inspection);
+  }
+
+  @Override
+  public MethodSubject method(String returnType, String name, List<String> parameters) {
+    DexType[] parameterTypes = new DexType[parameters.size()];
+    for (int i = 0; i < parameters.size(); i++) {
+      parameterTypes[i] =
+          dexInspector.toDexType(dexInspector.getObfuscatedTypeName(parameters.get(i)));
+    }
+    DexProto proto =
+        dexInspector.dexItemFactory.createProto(
+            dexInspector.toDexType(dexInspector.getObfuscatedTypeName(returnType)), parameterTypes);
+    if (naming != null) {
+      String[] parameterStrings = new String[parameterTypes.length];
+      Signature signature =
+          new MethodSignature(name, returnType, parameters.toArray(parameterStrings));
+      MemberNaming methodNaming = naming.lookupByOriginalSignature(signature);
+      if (methodNaming != null) {
+        name = methodNaming.getRenamedName();
+      }
+    }
+    DexMethod dexMethod =
+        dexInspector.dexItemFactory.createMethod(
+            dexClass.type, proto, dexInspector.dexItemFactory.createString(name));
+    DexEncodedMethod encoded = findMethod(dexClass.directMethods(), dexMethod);
+    if (encoded == null) {
+      encoded = findMethod(dexClass.virtualMethods(), dexMethod);
+    }
+    return encoded == null
+        ? new AbsentMethodSubject()
+        : new FoundMethodSubject(dexInspector, encoded, this);
+  }
+
+  private DexEncodedMethod findMethod(DexEncodedMethod[] methods, DexMethod dexMethod) {
+    for (DexEncodedMethod method : methods) {
+      if (method.method.equals(dexMethod)) {
+        return method;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public void forAllFields(Consumer<FoundFieldSubject> inspection) {
+    DexInspector.forAll(
+        dexClass.staticFields(),
+        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        this,
+        inspection);
+    DexInspector.forAll(
+        dexClass.instanceFields(),
+        (dexField, clazz) -> new FoundFieldSubject(dexInspector, dexField, clazz),
+        this,
+        inspection);
+  }
+
+  @Override
+  public FieldSubject field(String type, String name) {
+    String obfuscatedType = dexInspector.getObfuscatedTypeName(type);
+    MemberNaming fieldNaming = null;
+    if (naming != null) {
+      fieldNaming = naming.lookupByOriginalSignature(new FieldSignature(name, type));
+    }
+    String obfuscatedName = fieldNaming == null ? name : fieldNaming.getRenamedName();
+
+    DexField field =
+        dexInspector.dexItemFactory.createField(
+            dexClass.type,
+            dexInspector.toDexType(obfuscatedType),
+            dexInspector.dexItemFactory.createString(obfuscatedName));
+    DexEncodedField encoded = findField(dexClass.staticFields(), field);
+    if (encoded == null) {
+      encoded = findField(dexClass.instanceFields(), field);
+    }
+    return encoded == null
+        ? new AbsentFieldSubject()
+        : new FoundFieldSubject(dexInspector, encoded, this);
+  }
+
+  @Override
+  public boolean isAbstract() {
+    return dexClass.accessFlags.isAbstract();
+  }
+
+  @Override
+  public boolean isAnnotation() {
+    return dexClass.accessFlags.isAnnotation();
+  }
+
+  private DexEncodedField findField(DexEncodedField[] fields, DexField dexField) {
+    for (DexEncodedField field : fields) {
+      if (field.field.equals(dexField)) {
+        return field;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public DexClass getDexClass() {
+    return dexClass;
+  }
+
+  @Override
+  public AnnotationSubject annotation(String name) {
+    // Ensure we don't check for annotations represented as attributes.
+    assert !name.endsWith("EnclosingClass")
+        && !name.endsWith("EnclosingMethod")
+        && !name.endsWith("InnerClass");
+    DexAnnotation annotation = dexInspector.findAnnotation(name, dexClass.annotations);
+    return annotation == null
+        ? new AbsentAnnotationSubject()
+        : new FoundAnnotationSubject(annotation);
+  }
+
+  @Override
+  public String getOriginalName() {
+    if (naming != null) {
+      return naming.originalName;
+    } else {
+      return getFinalName();
+    }
+  }
+
+  @Override
+  public String getOriginalDescriptor() {
+    if (naming != null) {
+      return DescriptorUtils.javaTypeToDescriptor(naming.originalName);
+    } else {
+      return getFinalDescriptor();
+    }
+  }
+
+  @Override
+  public String getFinalName() {
+    return DescriptorUtils.descriptorToJavaType(getFinalDescriptor());
+  }
+
+  @Override
+  public String getFinalDescriptor() {
+    return dexClass.type.descriptor.toString();
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return naming != null && !getFinalDescriptor().equals(getOriginalDescriptor());
+  }
+
+  private InnerClassAttribute getInnerClassAttribute() {
+    for (InnerClassAttribute innerClassAttribute : dexClass.getInnerClasses()) {
+      if (dexClass.type == innerClassAttribute.getInner()) {
+        return innerClassAttribute;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public boolean isLocalClass() {
+    InnerClassAttribute innerClass = getInnerClassAttribute();
+    return innerClass != null && innerClass.isNamed() && dexClass.getEnclosingMethod() != null;
+  }
+
+  @Override
+  public boolean isMemberClass() {
+    InnerClassAttribute innerClass = getInnerClassAttribute();
+    return innerClass != null
+        && innerClass.getOuter() != null
+        && innerClass.isNamed()
+        && dexClass.getEnclosingMethod() == null;
+  }
+
+  @Override
+  public boolean isAnonymousClass() {
+    InnerClassAttribute innerClass = getInnerClassAttribute();
+    return innerClass != null && innerClass.isAnonymous() && dexClass.getEnclosingMethod() != null;
+  }
+
+  @Override
+  public boolean isSynthesizedJavaLambdaClass() {
+    return dexClass.type.getName().contains("$Lambda$");
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return dexInspector.getOriginalSignatureAttribute(
+        dexClass.annotations, GenericSignatureParser::parseClassSignature);
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return dexInspector.getFinalSignatureAttribute(dexClass.annotations);
+  }
+
+  @Override
+  public String toString() {
+    return dexClass.toSourceString();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
new file mode 100644
index 0000000..52aa0ce
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundFieldSubject.java
@@ -0,0 +1,114 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedField;
+import com.android.tools.r8.graph.DexValue;
+import com.android.tools.r8.naming.MemberNaming;
+import com.android.tools.r8.naming.MemberNaming.FieldSignature;
+import com.android.tools.r8.naming.signature.GenericSignatureParser;
+
+public class FoundFieldSubject extends FieldSubject {
+
+  private DexInspector dexInspector;
+  private final FoundClassSubject clazz;
+  private final DexEncodedField dexField;
+
+  public FoundFieldSubject(
+      DexInspector dexInspector, DexEncodedField dexField, FoundClassSubject clazz) {
+    this.dexInspector = dexInspector;
+    this.clazz = clazz;
+    this.dexField = dexField;
+  }
+
+  @Override
+  public boolean isPublic() {
+    return dexField.accessFlags.isPublic();
+  }
+
+  @Override
+  public boolean isStatic() {
+    return dexField.accessFlags.isStatic();
+  }
+
+  @Override
+  public boolean isFinal() {
+    return dexField.accessFlags.isFinal();
+  }
+
+  @Override
+  public boolean isPresent() {
+    return true;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return clazz.naming != null && !getFinalSignature().name.equals(getOriginalSignature().name);
+  }
+
+  public TypeSubject type() {
+    return new TypeSubject(dexInspector, dexField.field.type);
+  }
+
+  @Override
+  public FieldSignature getOriginalSignature() {
+    FieldSignature signature = getFinalSignature();
+    if (clazz.naming == null) {
+      return signature;
+    }
+
+    // Map the type to the original name. This is needed as the in the Proguard map the
+    // names on the left side are the original names. E.g.
+    //
+    //   X -> a
+    //     X field -> a
+    //
+    // whereas the final signature is for X.a is "a a"
+    String obfuscatedType = signature.type;
+    String originalType = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedType);
+    String fieldType = originalType != null ? originalType : obfuscatedType;
+
+    FieldSignature lookupSignature = new FieldSignature(signature.name, fieldType);
+
+    MemberNaming memberNaming = clazz.naming.lookup(lookupSignature);
+    return memberNaming != null ? (FieldSignature) memberNaming.getOriginalSignature() : signature;
+  }
+
+  @Override
+  public FieldSignature getFinalSignature() {
+    return FieldSignature.fromDexField(dexField.field);
+  }
+
+  @Override
+  public boolean hasExplicitStaticValue() {
+    return isStatic() && dexField.hasExplicitStaticValue();
+  }
+
+  @Override
+  public DexValue getStaticValue() {
+    return dexField.getStaticValue();
+  }
+
+  @Override
+  public DexEncodedField getField() {
+    return dexField;
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return dexInspector.getOriginalSignatureAttribute(
+        dexField.annotations, GenericSignatureParser::parseFieldSignature);
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return dexInspector.getFinalSignatureAttribute(dexField.annotations);
+  }
+
+  @Override
+  public String toString() {
+    return dexField.toSourceString();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
new file mode 100644
index 0000000..e245258
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/FoundMethodSubject.java
@@ -0,0 +1,140 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.naming.MemberNaming;
+import com.android.tools.r8.naming.MemberNaming.MethodSignature;
+import com.android.tools.r8.naming.signature.GenericSignatureParser;
+import java.util.Iterator;
+import java.util.function.Predicate;
+
+public class FoundMethodSubject extends MethodSubject {
+
+  private DexInspector dexInspector;
+  private final FoundClassSubject clazz;
+  private final DexEncodedMethod dexMethod;
+
+  public FoundMethodSubject(
+      DexInspector dexInspector, DexEncodedMethod encoded, FoundClassSubject clazz) {
+    this.dexInspector = dexInspector;
+    this.clazz = clazz;
+    this.dexMethod = encoded;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return true;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return clazz.naming != null && !getFinalSignature().name.equals(getOriginalSignature().name);
+  }
+
+  @Override
+  public boolean isPublic() {
+    return dexMethod.accessFlags.isPublic();
+  }
+
+  @Override
+  public boolean isStatic() {
+    return dexMethod.accessFlags.isStatic();
+  }
+
+  @Override
+  public boolean isFinal() {
+    return dexMethod.accessFlags.isFinal();
+  }
+
+  @Override
+  public boolean isAbstract() {
+    return dexMethod.accessFlags.isAbstract();
+  }
+
+  @Override
+  public boolean isBridge() {
+    return dexMethod.accessFlags.isBridge();
+  }
+
+  @Override
+  public boolean isInstanceInitializer() {
+    return dexMethod.isInstanceInitializer();
+  }
+
+  @Override
+  public boolean isClassInitializer() {
+    return dexMethod.isClassInitializer();
+  }
+
+  @Override
+  public DexEncodedMethod getMethod() {
+    return dexMethod;
+  }
+
+  @Override
+  public MethodSignature getOriginalSignature() {
+    MethodSignature signature = getFinalSignature();
+    if (clazz.naming == null) {
+      return signature;
+    }
+
+    // Map the parameters and return type to original names. This is needed as the in the
+    // Proguard map the names on the left side are the original names. E.g.
+    //
+    //   X -> a
+    //     X method(X) -> a
+    //
+    // whereas the final signature is for X.a is "a (a)"
+    String[] OriginalParameters = new String[signature.parameters.length];
+    for (int i = 0; i < OriginalParameters.length; i++) {
+      String obfuscated = signature.parameters[i];
+      String original = dexInspector.originalToObfuscatedMapping.inverse().get(obfuscated);
+      OriginalParameters[i] = original != null ? original : obfuscated;
+    }
+    String obfuscatedReturnType = signature.type;
+    String originalReturnType =
+        dexInspector.originalToObfuscatedMapping.inverse().get(obfuscatedReturnType);
+    String returnType = originalReturnType != null ? originalReturnType : obfuscatedReturnType;
+
+    MethodSignature lookupSignature =
+        new MethodSignature(signature.name, returnType, OriginalParameters);
+
+    MemberNaming memberNaming = clazz.naming.lookup(lookupSignature);
+    return memberNaming != null ? (MethodSignature) memberNaming.getOriginalSignature() : signature;
+  }
+
+  @Override
+  public MethodSignature getFinalSignature() {
+    return MethodSignature.fromDexMethod(dexMethod.method);
+  }
+
+  @Override
+  public String getOriginalSignatureAttribute() {
+    return dexInspector.getOriginalSignatureAttribute(
+        dexMethod.annotations, GenericSignatureParser::parseMethodSignature);
+  }
+
+  @Override
+  public String getFinalSignatureAttribute() {
+    return dexInspector.getFinalSignatureAttribute(dexMethod.annotations);
+  }
+
+  @Override
+  public Iterator<InstructionSubject> iterateInstructions() {
+    return dexInspector.createInstructionIterator(this);
+  }
+
+  @Override
+  public <T extends InstructionSubject> Iterator<T> iterateInstructions(
+      Predicate<InstructionSubject> filter) {
+    return new FilteredInstructionIterator<>(dexInspector, this, filter);
+  }
+
+  @Override
+  public String toString() {
+    return dexMethod.toSourceString();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java b/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
new file mode 100644
index 0000000..a777319
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionIterator.java
@@ -0,0 +1,9 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import java.util.Iterator;
+
+interface InstructionIterator extends Iterator<InstructionSubject> {}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
new file mode 100644
index 0000000..00102e5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/InstructionSubject.java
@@ -0,0 +1,43 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+public interface InstructionSubject {
+  boolean isFieldAccess();
+
+  boolean isInvokeVirtual();
+
+  boolean isInvokeInterface();
+
+  boolean isInvokeDirect();
+
+  boolean isInvokeSuper();
+
+  boolean isInvokeStatic();
+
+  boolean isNop();
+
+  boolean isConstString();
+
+  boolean isConstString(String value);
+
+  boolean isGoto();
+
+  boolean isIfNez();
+
+  boolean isIfEqz();
+
+  boolean isReturnVoid();
+
+  boolean isThrow();
+
+  default boolean isInvoke() {
+    return isInvokeVirtual()
+        || isInvokeInterface()
+        || isInvokeDirect()
+        || isInvokeSuper()
+        || isInvokeStatic();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
new file mode 100644
index 0000000..a4f5636
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeDexInstructionSubject.java
@@ -0,0 +1,28 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.code.Instruction;
+import com.android.tools.r8.graph.DexMethod;
+
+public class InvokeDexInstructionSubject extends DexInstructionSubject
+    implements InvokeInstructionSubject {
+
+  private DexInspector dexInspector;
+
+  public InvokeDexInstructionSubject(DexInspector dexInspector, Instruction instruction) {
+    super(instruction);
+    this.dexInspector = dexInspector;
+    assert isInvoke();
+  }
+
+  public TypeSubject holder() {
+    return new TypeSubject(dexInspector, invokedMethod().getHolder());
+  }
+
+  public DexMethod invokedMethod() {
+    return instruction.getMethod();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
new file mode 100644
index 0000000..9b59340
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/InvokeInstructionSubject.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexMethod;
+
+public interface InvokeInstructionSubject extends InstructionSubject {
+  TypeSubject holder();
+
+  DexMethod invokedMethod();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/DexInspectorMatchers.java b/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
similarity index 93%
rename from src/test/java/com/android/tools/r8/utils/DexInspectorMatchers.java
rename to src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
index 1986bbc..ab3ef13 100644
--- a/src/test/java/com/android/tools/r8/utils/DexInspectorMatchers.java
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/Matchers.java
@@ -2,18 +2,14 @@
 // 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.utils;
+package com.android.tools.r8.utils.dexinspector;
 
-import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.android.tools.r8.utils.DexInspector.FieldSubject;
-import com.android.tools.r8.utils.DexInspector.MethodSubject;
-import com.android.tools.r8.utils.DexInspector.Subject;
 import com.google.common.collect.ImmutableList;
 import org.hamcrest.Description;
 import org.hamcrest.Matcher;
 import org.hamcrest.TypeSafeMatcher;
 
-public class DexInspectorMatchers {
+public class Matchers {
 
   private static String type(Subject subject) {
     String type = "<unknown subject type>";
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
new file mode 100644
index 0000000..1852659
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/MemberSubject.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.naming.MemberNaming.Signature;
+
+public abstract class MemberSubject extends Subject {
+
+  public abstract boolean isPublic();
+
+  public abstract boolean isStatic();
+
+  public abstract boolean isFinal();
+
+  public abstract Signature getOriginalSignature();
+
+  public abstract Signature getFinalSignature();
+
+  public String getOriginalName() {
+    Signature originalSignature = getOriginalSignature();
+    return originalSignature == null ? null : originalSignature.name;
+  }
+
+  public String getFinalName() {
+    Signature finalSignature = getFinalSignature();
+    return finalSignature == null ? null : finalSignature.name;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
new file mode 100644
index 0000000..3427924
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/MethodSubject.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexEncodedMethod;
+import java.util.Iterator;
+import java.util.function.Predicate;
+
+public abstract class MethodSubject extends MemberSubject {
+
+  public abstract boolean isAbstract();
+
+  public abstract boolean isBridge();
+
+  public abstract boolean isInstanceInitializer();
+
+  public abstract boolean isClassInitializer();
+
+  public abstract String getOriginalSignatureAttribute();
+
+  public abstract String getFinalSignatureAttribute();
+
+  public abstract DexEncodedMethod getMethod();
+
+  public Iterator<InstructionSubject> iterateInstructions() {
+    return null;
+  }
+
+  public <T extends InstructionSubject> Iterator<T> iterateInstructions(
+      Predicate<InstructionSubject> filter) {
+    return null;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
new file mode 100644
index 0000000..f83eb14
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/Subject.java
@@ -0,0 +1,12 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+public abstract class Subject {
+
+  public abstract boolean isPresent();
+
+  public abstract boolean isRenamed();
+}
diff --git a/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java b/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
new file mode 100644
index 0000000..6a911eb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/dexinspector/TypeSubject.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2018, 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.utils.dexinspector;
+
+import com.android.tools.r8.graph.DexType;
+
+public class TypeSubject extends Subject {
+
+  private DexInspector dexInspector;
+  private final DexType dexType;
+
+  TypeSubject(DexInspector dexInspector, DexType dexType) {
+    this.dexInspector = dexInspector;
+    this.dexType = dexType;
+  }
+
+  @Override
+  public boolean isPresent() {
+    return true;
+  }
+
+  @Override
+  public boolean isRenamed() {
+    return false;
+  }
+
+  public boolean is(String type) {
+    return dexType.equals(dexInspector.toDexType(type));
+  }
+
+  public String toString() {
+    return dexType.toSourceString();
+  }
+}