diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
index 4632b51..74051a7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
@@ -64,10 +64,7 @@
     builder.addRuleDefinition(new ObjcImportBaseRule());
     builder.addRuleDefinition(new ObjcLibraryBaseRule());
     builder.addRuleDefinition(new ObjcRuleClasses.CoptsRule());
-    builder.addRuleDefinition(new ObjcRuleClasses.DylibDependingRule());
     builder.addRuleDefinition(new ObjcRuleClasses.CompilingRule());
-    builder.addRuleDefinition(new ObjcRuleClasses.PlatformRule());
-    builder.addRuleDefinition(new ObjcRuleClasses.MultiArchPlatformRule());
     builder.addRuleDefinition(new ObjcRuleClasses.AlwaysLinkRule());
     builder.addRuleDefinition(new ObjcRuleClasses.SdkFrameworksDependerRule());
     builder.addRuleDefinition(new ObjcRuleClasses.CompileDependencyRule());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
index 832f005..8e538d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchSplitTransitionProvider.java
@@ -39,7 +39,6 @@
 import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.rules.cpp.CppOptions;
-import com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.PlatformRule;
 import com.google.devtools.build.lib.starlarkbuildapi.SplitTransitionProviderApi;
 import java.util.List;
 import java.util.Map;
@@ -81,14 +80,14 @@
    */
   public static PlatformType getPlatformType(RuleContext ruleContext) throws RuleErrorException {
     String attributeValue =
-        ruleContext.attributes().get(PlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
+        ruleContext.attributes().get(ObjcRuleClasses.PLATFORM_TYPE_ATTR_NAME, STRING);
     try {
       return getPlatformType(attributeValue);
     } catch (
         @SuppressWarnings("UnusedException")
         ApplePlatform.UnsupportedPlatformTypeException exception) {
       throw ruleContext.throwWithAttributeError(
-          PlatformRule.PLATFORM_TYPE_ATTR_NAME,
+          ObjcRuleClasses.PLATFORM_TYPE_ATTR_NAME,
           String.format(UNSUPPORTED_PLATFORM_TYPE_ERROR_FORMAT, attributeValue));
     }
   }
@@ -113,8 +112,10 @@
 
   @Override
   public SplitTransition create(AttributeTransitionData data) {
-    String platformTypeString = data.attributes().get(PlatformRule.PLATFORM_TYPE_ATTR_NAME, STRING);
-    String minimumOsVersionString = data.attributes().get(PlatformRule.MINIMUM_OS_VERSION, STRING);
+    String platformTypeString =
+        data.attributes().get(ObjcRuleClasses.PLATFORM_TYPE_ATTR_NAME, STRING);
+    String minimumOsVersionString =
+        data.attributes().get(ObjcRuleClasses.MINIMUM_OS_VERSION, STRING);
     PlatformType platformType;
     Optional<DottedVersion> minimumOsVersion;
     try {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index 41832be..f6ed945 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -18,12 +18,10 @@
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.BuildType.NODEP_LABEL;
-import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
 import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
 import static com.google.devtools.build.lib.packages.Type.STRING;
 import static com.google.devtools.build.lib.packages.Type.STRING_LIST;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -38,10 +36,8 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
@@ -69,8 +65,8 @@
    */
   public static IntermediateArtifacts intermediateArtifacts(
       RuleContext ruleContext, BuildConfigurationValue buildConfiguration) {
-    return new IntermediateArtifacts(ruleContext, /*archiveFileNameSuffix*/ "",
-        /*outputPrefix*/ "", buildConfiguration);
+    return new IntermediateArtifacts(
+        ruleContext, /* archiveFileNameSuffix= */ "", /* outputPrefix= */ "", buildConfiguration);
   }
 
   /**
@@ -535,194 +531,13 @@
     }
   }
 
-  /**
-   * Template for the fat binary output (using Apple's "lipo" tool to combine binaries of multiple
-   * architectures).
-   */
-  public static final SafeImplicitOutputsFunction LIPOBIN_OUTPUT = fromTemplates("%{name}_lipobin");
+  /** Attribute name for apple platform type (e.g. ios or watchos). */
+  static final String PLATFORM_TYPE_ATTR_NAME = "platform_type";
 
-  /**
-   * Common attributes for apple rules that produce outputs for a given platform type (such as ios
-   * or watchos).
-   */
-  public static class PlatformRule implements RuleDefinition {
+  /** Attribute name for the minimum OS version (e.g. "7.3"). */
+  static final String MINIMUM_OS_VERSION = "minimum_os_version";
 
-    /**
-     * Attribute name for apple platform type (e.g. ios or watchos).
-     */
-    static final String PLATFORM_TYPE_ATTR_NAME = "platform_type";
-
-    /**
-     * Attribute name for the minimum OS version (e.g. "7.3").
-     */
-    static final String MINIMUM_OS_VERSION = "minimum_os_version";
-
-    @Override
-    public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
-      return builder
-          /* <!-- #BLAZE_RULE($apple_platform_rule).ATTRIBUTE(platform_type) -->
-          The type of platform for which to create artifacts in this rule.
-
-          This dictates which Apple platform SDK is used for compilation/linking and which flag is
-          used to determine the architectures for which to build. For example, if <code>ios</code>
-          is selected, then the output binaries/libraries will be created combining all
-          architectures specified in <code>--ios_multi_cpus</code>.
-
-          Options are:
-          <ul>
-            <li>
-              <code>ios</code>: architectures gathered from <code>--ios_multi_cpus</code>.
-            </li>
-            <li>
-              <code>macos</code>: architectures gathered from <code>--macos_cpus</code>.
-            </li>
-            <li>
-              <code>tvos</code>: architectures gathered from <code>--tvos_cpus</code>.
-            </li>
-            <li>
-              <code>watchos</code>: architectures gathered from <code>--watchos_cpus</code>.
-            </li>
-          </ul>
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(
-              attr(PLATFORM_TYPE_ATTR_NAME, STRING)
-                  .mandatory())
-          /* <!-- #BLAZE_RULE($apple_platform_rule).ATTRIBUTE(minimum_os_version) -->
-          The minimum OS version that this target and its dependencies should be built for.
-
-          This should be a dotted version string such as "7.3".
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(
-              attr(MINIMUM_OS_VERSION, STRING))
-          .build();
-    }
-
-    @Override
-    public Metadata getMetadata() {
-      return RuleDefinition.Metadata.builder()
-          .name("$apple_platform_rule")
-          .type(RuleClassType.ABSTRACT)
-          .build();
-    }
-  }
-
-  /**
-   * Common attributes for apple rules that build multi-architecture outputs for a given platform
-   * type (such as ios or watchos).
-   */
-  public static class MultiArchPlatformRule implements RuleDefinition {
-    /**
-     * Rule class names for cc rules which are allowed as targets of the 'deps' attribute of this
-     * rule.
-     */
-    static final ImmutableSet<String> ALLOWED_CC_DEPS_RULE_CLASSES =
-        ImmutableSet.of("cc_library", "cc_inc_library");
-
-    @Override
-    public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
-      MultiArchSplitTransitionProvider splitTransitionProvider =
-          new MultiArchSplitTransitionProvider();
-      return builder
-          // This is currently a hack to obtain all child configurations regardless of the attribute
-          // values of this rule -- this rule does not currently use the actual info provided by
-          // this attribute.
-          .add(
-              attr(CHILD_CONFIG_ATTR, LABEL)
-                  .cfg(splitTransitionProvider)
-                  .value(env.getToolsLabel("//tools/cpp:current_cc_toolchain")))
-          /* <!-- #BLAZE_RULE($apple_multiarch_rule).ATTRIBUTE(deps) -->
-          The list of targets that are linked together to form the final binary.
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .override(
-              attr("deps", LABEL_LIST)
-                  .direct_compile_time_input()
-                  .allowedRuleClasses(ALLOWED_CC_DEPS_RULE_CLASSES)
-                  .mandatoryProviders(ObjcProvider.STARLARK_CONSTRUCTOR.id())
-                  .cfg(splitTransitionProvider)
-                  .allowedFileTypes())
-          /* <!-- #BLAZE_RULE($apple_multiarch_rule).ATTRIBUTE(linkopts) -->
-          Extra flags to pass to the linker.
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(attr("linkopts", STRING_LIST))
-          /* <!-- #BLAZE_RULE($apple_multiarch_rule).ATTRIBUTE(additional_linker_inputs) -->
-          Extra files to pass to the linker.
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(
-              attr("additional_linker_inputs", LABEL_LIST)
-                  .orderIndependent()
-                  .direct_compile_time_input()
-                  .allowedFileTypes(FileTypeSet.ANY_FILE))
-          .add(
-              // This attribute definition must be kept in sync with
-              // third_party/bazel_rules/rules_apple/apple/internal/rule_factory.bzl
-              attr("$j2objc_dead_code_pruner", LABEL)
-                  .cfg(ExecutionTransitionFactory.create())
-                  .exec()
-                  // Allow arbitrary executable files; this gives more flexibility for the
-                  // implementation of the underlying tool.
-                  .legacyAllowAnyFileType()
-                  .value(env.getToolsLabel("//tools/objc:j2objc_dead_code_pruner_binary")))
-          .add(attr("$dummy_lib", LABEL).value(env.getToolsLabel("//tools/objc:dummy_lib")))
-          .build();
-    }
-
-    @Override
-    public Metadata getMetadata() {
-      return RuleDefinition.Metadata.builder()
-          .name("$apple_multiarch_rule")
-          .type(RuleClassType.ABSTRACT)
-          .ancestors(
-              PlatformRule.class,
-              CrosstoolRule.class,
-              BaseRuleClasses.NativeActionCreatingRule.class,
-              CppRuleClasses.CcIncludeScanningRule.class,
-              XcrunRule.class,
-              SdkFrameworksDependerRule.class)
-          .build();
-    }
-  }
-
-  /**
-   * Common attributes for apple rules that can depend on one or more dynamic libraries.
-   */
-  public static class DylibDependingRule implements RuleDefinition {
-    /**
-     * Attribute name for dylib dependencies.
-     */
-    static final String DYLIBS_ATTR_NAME = "dylibs";
-
-    @Override
-    public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
-      return builder
-          /* <!-- #BLAZE_RULE($apple_dylib_depending_rule).ATTRIBUTE(dylibs) -->
-          <p>A list of dynamic library targets to be linked against in this rule and included
-          in the final binary. Libraries which are transitive dependencies of any such dylibs will
-          not be statically linked in this target (even if they are otherwise
-          transitively depended on via the <code>deps</code> attribute) to avoid duplicate symbols.
-          <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(
-              attr(DYLIBS_ATTR_NAME, LABEL_LIST)
-                  .direct_compile_time_input()
-                  .mandatoryProviders(
-                      ImmutableList.of(
-                          StarlarkProviderIdentifier.forKey(
-                              AppleDynamicFrameworkInfo.STARLARK_CONSTRUCTOR.getKey())))
-                  .allowedFileTypes())
-          .build();
-    }
-
-    @Override
-    public Metadata getMetadata() {
-      return RuleDefinition.Metadata.builder()
-          .name("$apple_dylib_depending_rule")
-          .type(RuleClassType.ABSTRACT)
-          .build();
-    }
-  }
-
-  /**
-   * Common attributes for {@code objc_*} rules that need to call xcrun.
-   */
+  /** Common attributes for {@code objc_*} rules that need to call xcrun. */
   public static class XcrunRule implements RuleDefinition {
     @Override
     public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment env) {
