public BuildRule createBuildRule()

in src/com/facebook/buck/android/AndroidAarDescription.java [103:280]


  public BuildRule createBuildRule(
      BuildRuleCreationContextWithTargetGraph context,
      BuildTarget buildTarget,
      BuildRuleParams originalBuildRuleParams,
      AndroidAarDescriptionArg args) {

    ProjectFilesystem projectFilesystem = context.getProjectFilesystem();
    ActionGraphBuilder graphBuilder = context.getActionGraphBuilder();
    buildTarget.assertUnflavored();
    ImmutableSortedSet.Builder<BuildRule> aarExtraDepsBuilder =
        new ImmutableSortedSet.Builder<BuildRule>(Ordering.natural())
            .addAll(originalBuildRuleParams.getExtraDeps().get());

    /* android_manifest */
    BuildTarget androidManifestTarget =
        buildTarget.withAppendedFlavors(AAR_ANDROID_MANIFEST_FLAVOR);

    AndroidManifest manifest =
        androidManifestFactory.createBuildRule(
            androidManifestTarget,
            projectFilesystem,
            graphBuilder,
            args.getDeps(),
            args.getManifestSkeleton());
    aarExtraDepsBuilder.add(graphBuilder.addToIndex(manifest));

    APKModuleGraph apkModuleGraph = new APKModuleGraph(context.getTargetGraph(), buildTarget);

    /* assemble dirs */
    AndroidPackageableCollector collector =
        new AndroidPackageableCollector(
            buildTarget, /* buildTargetsToExcludeFromDex */ ImmutableSet.of(), apkModuleGraph);
    collector.addPackageables(
        AndroidPackageableCollector.getPackageableRules(originalBuildRuleParams.getBuildDeps()),
        graphBuilder);
    AndroidPackageableCollection packageableCollection = collector.build();

    ImmutableCollection<SourcePath> assetsDirectories =
        packageableCollection.getAssetsDirectories().values();
    AssembleDirectories assembleAssetsDirectories =
        new AssembleDirectories(
            buildTarget.withAppendedFlavors(AAR_ASSEMBLE_ASSETS_FLAVOR),
            projectFilesystem,
            graphBuilder,
            assetsDirectories);
    aarExtraDepsBuilder.add(graphBuilder.addToIndex(assembleAssetsDirectories));

    ImmutableCollection<SourcePath> resDirectories =
        packageableCollection.getResourceDetails().values().stream()
            .flatMap(resourceDetails -> resourceDetails.getResourceDirectories().stream())
            .collect(ImmutableList.toImmutableList());
    MergeAndroidResourceSources assembleResourceDirectories =
        new MergeAndroidResourceSources(
            buildTarget.withAppendedFlavors(AAR_ASSEMBLE_RESOURCE_FLAVOR),
            projectFilesystem,
            graphBuilder,
            resDirectories);
    aarExtraDepsBuilder.add(graphBuilder.addToIndex(assembleResourceDirectories));

    /* android_resource */
    BuildRuleParams androidResourceParams =
        originalBuildRuleParams
            .withDeclaredDeps(
                ImmutableSortedSet.of(
                    manifest, assembleAssetsDirectories, assembleResourceDirectories))
            .withoutExtraDeps();

    AndroidResource androidResource =
        new AndroidResource(
            buildTarget.withAppendedFlavors(AAR_ANDROID_RESOURCE_FLAVOR),
            projectFilesystem,
            androidResourceParams,
            graphBuilder,
            /* deps */ ImmutableSortedSet.<BuildRule>naturalOrder()
                .add(assembleAssetsDirectories)
                .add(assembleResourceDirectories)
                .addAll(originalBuildRuleParams.getDeclaredDeps().get())
                .build(),
            assembleResourceDirectories.getSourcePathToOutput(),
            /* resSrcs */ ImmutableSortedMap.of(),
            /* rDotJavaPackage */ null,
            assembleAssetsDirectories.getSourcePathToOutput(),
            /* assetsSrcs */ ImmutableSortedMap.of(),
            manifest.getSourcePathToOutput(),
            /* hasWhitelistedStrings */ false);
    aarExtraDepsBuilder.add(graphBuilder.addToIndex(androidResource));

    ImmutableSortedSet.Builder<SourcePath> classpathToIncludeInAar =
        ImmutableSortedSet.naturalOrder();
    classpathToIncludeInAar.addAll(packageableCollection.getClasspathEntriesToDex());
    aarExtraDepsBuilder.addAll(
        BuildRules.toBuildRulesFor(
            buildTarget, graphBuilder, packageableCollection.getJavaLibrariesToDex()));

    if (!args.getBuildConfigValues().getNameToField().isEmpty()
        && !args.getIncludeBuildConfigClass()) {
      throw new HumanReadableException(
          "Rule %s has build_config_values set but does not set "
              + "include_build_config_class to True. Either indicate you want to include the "
              + "BuildConfig class in the final .aar or do not specify build config values.",
          buildTarget);
    }
    if (args.getIncludeBuildConfigClass()) {
      ImmutableSortedSet<JavaLibrary> buildConfigRules =
          AndroidBinaryGraphEnhancer.addBuildConfigDeps(
              buildTarget,
              projectFilesystem,
              PackageType.RELEASE,
              EnumSet.noneOf(ExopackageMode.class),
              args.getBuildConfigValues(),
              Optional.empty(),
              graphBuilder,
              javacFactory.create(graphBuilder, args, buildTarget.getTargetConfiguration()),
              toolchainProvider
                  .getByName(
                      JavacOptionsProvider.DEFAULT_NAME,
                      buildTarget.getTargetConfiguration(),
                      JavacOptionsProvider.class)
                  .getJavacOptions(),
              packageableCollection);
      buildConfigRules.forEach(graphBuilder::addToIndex);
      aarExtraDepsBuilder.addAll(buildConfigRules);
      classpathToIncludeInAar.addAll(
          buildConfigRules.stream()
              .map(BuildRule::getSourcePathToOutput)
              .collect(Collectors.toList()));
    }

    /* native_libraries */
    AndroidNativeLibsPackageableGraphEnhancer packageableGraphEnhancer =
        new AndroidNativeLibsPackageableGraphEnhancer(
            toolchainProvider,
            context.getCellPathResolver(),
            graphBuilder,
            buildTarget,
            projectFilesystem,
            ImmutableSet.of(),
            cxxBuckConfig,
            /* nativeLibraryMergeMap */ Optional.empty(),
            /* nativeLibraryMergeGlue */ Optional.empty(),
            Optional.empty(),
            args.isEnableRelinker() ? RelinkerMode.ENABLED : RelinkerMode.DISABLED,
            ImmutableList.of(),
            apkModuleGraph,
            new NoopAndroidNativeTargetConfigurationMatcher());
    Optional<ImmutableMap<APKModule, CopyNativeLibraries>> nativeLibrariesOptional =
        packageableGraphEnhancer.enhance(packageableCollection).getCopyNativeLibraries();
    Optional<CopyNativeLibraries> rootModuleCopyNativeLibraries =
        nativeLibrariesOptional.map(
            input -> {
              // there will be only one value for the root module
              CopyNativeLibraries copyNativeLibraries =
                  input.get(apkModuleGraph.getRootAPKModule());
              if (copyNativeLibraries == null) {
                throw new HumanReadableException(
                    "Native libraries are present but not in the root application module.");
              }
              aarExtraDepsBuilder.add(copyNativeLibraries);
              return copyNativeLibraries;
            });
    Optional<SourcePath> assembledNativeLibsDir =
        rootModuleCopyNativeLibraries.map(cnl -> cnl.getSourcePathToNativeLibsDir());
    Optional<SourcePath> assembledNativeLibsAssetsDir =
        rootModuleCopyNativeLibraries.map(cnl -> cnl.getSourcePathToNativeLibsAssetsDir());
    BuildRuleParams androidAarParams =
        originalBuildRuleParams.withExtraDeps(aarExtraDepsBuilder.build());
    return new AndroidAar(
        buildTarget,
        projectFilesystem,
        androidAarParams,
        manifest,
        androidResource,
        assembleResourceDirectories.getSourcePathToOutput(),
        assembleAssetsDirectories.getSourcePathToOutput(),
        assembledNativeLibsDir,
        assembledNativeLibsAssetsDir,
        classpathToIncludeInAar.build());
  }