AndroidGraphEnhancementResult createAdditionalBuildables()

in src/com/facebook/buck/android/AndroidBinaryGraphEnhancer.java [308:502]


  AndroidGraphEnhancementResult createAdditionalBuildables() {
    ImmutableList.Builder<BuildRule> additionalJavaLibrariesBuilder = ImmutableList.builder();

    AndroidPackageableCollector collector =
        new AndroidPackageableCollector(
            originalBuildTarget,
            buildTargetsToExcludeFromDex,
            resourcesToExclude,
            nativeLibsToExclude,
            nativeLinkablesToExcludeGroup,
            nativeLibAssetsToExclude,
            nativeLinkablesAssetsToExcludeGroup,
            apkModuleGraph,
            AndroidPackageableFilterFactory.createFromConfigurationMatcher(
                originalBuildTarget, androidNativeTargetConfigurationMatcher));
    collector.addPackageables(
        AndroidPackageableCollector.getPackageableRules(originalDeps), graphBuilder);
    AndroidPackageableCollection packageableCollection = collector.build();

    ImmutableList.Builder<SourcePath> proguardConfigsBuilder = ImmutableList.builder();
    proguardConfigsBuilder.addAll(packageableCollection.getProguardConfigs());

    AndroidNativeLibsGraphEnhancementResult nativeLibsEnhancementResult =
        nativeLibsEnhancer.enhance(packageableCollection);
    Optional<ImmutableMap<APKModule, CopyNativeLibraries>> copyNativeLibraries =
        nativeLibsEnhancementResult.getCopyNativeLibraries();
    copyNativeLibraries.ifPresent(
        apkModuleCopyNativeLibrariesImmutableMap ->
            apkModuleCopyNativeLibrariesImmutableMap.values().forEach(graphBuilder::addToIndex));

    nativeLibsEnhancementResult
        .getCopyNativeLibrariesForSystemLibraryLoader()
        .ifPresent(graphBuilder::addToIndex);

    if (nativeLibraryProguardConfigGenerator.isPresent()) {
      NativeLibraryProguardGenerator nativeLibraryProguardGenerator =
          createNativeLibraryProguardGenerator(
              copyNativeLibraries.get().values().stream()
                  .map(CopyNativeLibraries::getSourcePathToAllLibsDir)
                  .collect(ImmutableList.toImmutableList()));

      graphBuilder.addToIndex(nativeLibraryProguardGenerator);
      proguardConfigsBuilder.add(nativeLibraryProguardGenerator.getSourcePathToOutput());
    }

    if (nativeLibsEnhancementResult.getUnstrippedLibraries().isPresent()) {
      UnstrippedNativeLibraries unstrippedNativeLibraries =
          new UnstrippedNativeLibraries(
              originalBuildTarget.withAppendedFlavors(UNSTRIPPED_NATIVE_LIBRARIES_FLAVOR),
              projectFilesystem,
              buildRuleParams.withoutDeclaredDeps(),
              graphBuilder,
              nativeLibsEnhancementResult.getUnstrippedLibraries().get());
      graphBuilder.addToIndex(unstrippedNativeLibraries);
    }

    Optional<ImmutableSortedMap<String, String>> sonameMergeMap =
        nativeLibsEnhancementResult.getSonameMergeMap();
    if (sonameMergeMap.isPresent() && nativeLibraryMergeCodeGenerator.isPresent()) {
      BuildRule generatorRule = graphBuilder.getRule(nativeLibraryMergeCodeGenerator.get());

      GenerateCodeForMergedLibraryMap generateCodeForMergedLibraryMap =
          new GenerateCodeForMergedLibraryMap(
              originalBuildTarget.withAppendedFlavors(
                  GENERATE_NATIVE_LIB_MERGE_MAP_GENERATED_CODE_FLAVOR),
              projectFilesystem,
              buildRuleParams.withDeclaredDeps(ImmutableSortedSet.of(generatorRule)),
              sonameMergeMap.get(),
              nativeLibsEnhancementResult.getSharedObjectTargets().get(),
              generatorRule);
      graphBuilder.addToIndex(generateCodeForMergedLibraryMap);

      BuildRuleParams paramsForCompileGenCode =
          buildRuleParams.withDeclaredDeps(ImmutableSortedSet.of(generateCodeForMergedLibraryMap));
      DefaultJavaLibrary compileMergedNativeLibMapGenCode =
          DefaultJavaLibrary.rulesBuilder(
                  originalBuildTarget.withAppendedFlavors(
                      COMPILE_NATIVE_LIB_MERGE_MAP_GENERATED_CODE_FLAVOR),
                  projectFilesystem,
                  toolchainProvider,
                  paramsForCompileGenCode,
                  graphBuilder,
                  new JavaConfiguredCompilerFactory(javaBuckConfig, javacFactory),
                  javaBuckConfig,
                  null)
              // Kind of a hack: override language level to 7 to allow string switch.
              // This can be removed once no one who uses this feature sets the level
              // to 6 in their .buckconfig.
              .setJavacOptions(
                  javacOptions.withLanguageLevelOptions(
                      JavacLanguageLevelOptions.builder()
                          .setSourceLevel("7")
                          .setTargetLevel("7")
                          .build()))
              .setSrcs(
                  ImmutableSortedSet.of(generateCodeForMergedLibraryMap.getSourcePathToOutput()))
              .setSourceOnlyAbisAllowed(false)
              .setDeps(
                  new JavaLibraryDeps.Builder(graphBuilder)
                      .addAllDepTargets(
                          paramsForCompileGenCode.getDeclaredDeps().get().stream()
                              .map(BuildRule::getBuildTarget)
                              .collect(Collectors.toList()))
                      .build())
              .build()
              .buildLibrary();
      graphBuilder.addToIndex(compileMergedNativeLibMapGenCode);
      additionalJavaLibrariesBuilder.add(compileMergedNativeLibMapGenCode);
    }

    AndroidBinaryResourcesGraphEnhancer.AndroidBinaryResourcesGraphEnhancementResult
        resourcesEnhancementResult =
            androidBinaryResourcesGraphEnhancer.enhance(packageableCollection);

    // BuildConfig deps should not be added for instrumented APKs because BuildConfig.class has
    // already been added to the APK under test.
    if (packageType != PackageType.INSTRUMENTED) {
      ImmutableSortedSet<JavaLibrary> buildConfigDepsRules =
          addBuildConfigDeps(
              originalBuildTarget,
              projectFilesystem,
              packageType,
              exopackageModes,
              buildConfigValues,
              buildConfigValuesFile,
              graphBuilder,
              javac,
              javacOptions,
              packageableCollection);
      additionalJavaLibrariesBuilder.addAll(buildConfigDepsRules);
    }

    ImmutableList<BuildRule> additionalJavaLibraries = additionalJavaLibrariesBuilder.build();
    ImmutableSet<SourcePath> classpathEntriesToDex =
        ImmutableSet.<SourcePath>builder()
            .addAll(packageableCollection.getClasspathEntriesToDex())
            .addAll(
                additionalJavaLibraries.stream()
                    .map(BuildRule::getSourcePathToOutput)
                    .collect(ImmutableList.toImmutableList()))
            .build();
    if (!ignoreAaptProguardConfig) {
      proguardConfigsBuilder.addAll(
          resourcesEnhancementResult.getAaptGeneratedProguardConfigFiles());
    }
    ImmutableList<SourcePath> proguardConfigs = proguardConfigsBuilder.build();

    HasDexFiles dexMergeRule;
    if (shouldPreDex) {
      ImmutableList<DexProducedFromJavaLibrary> preDexedLibrariesExceptRDotJava =
          createPreDexRulesForLibraries(additionalJavaLibraries, packageableCollection);

      if (dexSplitMode.isShouldSplitDex()) {
        dexMergeRule =
            createPreDexMergeSplitDexRule(
                preDexedLibrariesExceptRDotJava, resourcesEnhancementResult);
      } else {
        ImmutableCollection<DexProducedFromJavaLibrary> dexUberRDotJavaParts =
            createUberRDotJavaDexes(resourcesEnhancementResult, preDexedLibrariesExceptRDotJava);
        dexMergeRule =
            createPreDexMergeSingleDexRule(
                ImmutableList.copyOf(
                    Iterables.concat(preDexedLibrariesExceptRDotJava, dexUberRDotJavaParts)));
      }
    } else {
      JavaLibrary compileUberRDotJava =
          createTrimAndCompileUberRDotJava(resourcesEnhancementResult, ImmutableList.of());
      dexMergeRule =
          createNonPredexedDexBuildable(
              dexSplitMode,
              rulesToExcludeFromDex.get(),
              xzCompressionLevel,
              proguardConfigs,
              packageableCollection,
              classpathEntriesToDex,
              compileUberRDotJava,
              javaBuckConfig.shouldDesugarInterfaceMethods());
    }

    return ImmutableAndroidGraphEnhancementResult.builder()
        .setPackageableCollection(packageableCollection)
        .setPrimaryResourcesApkPath(resourcesEnhancementResult.getPrimaryResourcesApkPath())
        .setPrimaryApkAssetZips(resourcesEnhancementResult.getPrimaryApkAssetZips())
        .setExoResources(resourcesEnhancementResult.getExoResources())
        .setAndroidManifestPath(resourcesEnhancementResult.getAndroidManifestXml())
        .setCopyNativeLibraries(copyNativeLibraries)
        .setPackageStringAssets(resourcesEnhancementResult.getPackageStringAssets())
        .setDexMergeRule(dexMergeRule)
        .setClasspathEntriesToDex(classpathEntriesToDex)
        .setAPKModuleGraph(apkModuleGraph)
        .setModuleResourceApkPaths(resourcesEnhancementResult.getModuleResourceApkPaths())
        .setCopyNativeLibrariesForSystemLibraryLoader(
            nativeLibsEnhancementResult.getCopyNativeLibrariesForSystemLibraryLoader())
        .build();
  }