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();
}