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