Java tutorial
/* * Copyright 2014-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package com.facebook.buck.android; import com.facebook.buck.jvm.java.CalculateAbi; import com.facebook.buck.jvm.java.JavaLibraryRules; import com.facebook.buck.jvm.java.JavacOptions; import com.facebook.buck.jvm.java.JavacToJarStepFactory; import com.facebook.buck.jvm.java.PrebuiltJar; import com.facebook.buck.model.BuildTarget; import com.facebook.buck.model.BuildTargets; import com.facebook.buck.model.Flavor; import com.facebook.buck.model.ImmutableFlavor; import com.facebook.buck.parser.NoSuchBuildTargetException; import com.facebook.buck.rules.AbstractDescriptionArg; import com.facebook.buck.rules.BuildRule; import com.facebook.buck.rules.BuildRuleParams; import com.facebook.buck.rules.BuildRuleResolver; import com.facebook.buck.rules.BuildTargetSourcePath; import com.facebook.buck.rules.Description; import com.facebook.buck.rules.SourcePath; import com.facebook.buck.rules.SourcePathResolver; import com.facebook.buck.rules.SourcePathRuleFinder; import com.facebook.buck.rules.TargetGraph; import com.facebook.infer.annotation.SuppressFieldNotInitialized; import com.google.common.base.Preconditions; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; import java.util.Optional; /** * Description for a {@link BuildRule} that wraps an {@code .aar} file as an Android dependency. * <p> * This represents an Android Library Project packaged as an {@code .aar} bundle as specified by: * http://tools.android.com/tech-docs/new-build-system/aar-format. When it is in the packageable * deps of an {@link AndroidBinary}, its contents will be included in the generated APK. * <p> * Note that the {@code aar} may be specified as a {@link SourcePath}, so it could be either * a binary {@code .aar} file checked into version control, or a zip file that conforms to the * {@code .aar} specification that is generated by another build rule. */ public class AndroidPrebuiltAarDescription implements Description<AndroidPrebuiltAarDescription.Arg> { private static final Flavor AAR_PREBUILT_JAR_FLAVOR = ImmutableFlavor.of("aar_prebuilt_jar"); public static final Flavor AAR_UNZIP_FLAVOR = ImmutableFlavor.of("aar_unzip"); private final JavacOptions javacOptions; public AndroidPrebuiltAarDescription(JavacOptions javacOptions) { this.javacOptions = javacOptions; } @Override public Arg createUnpopulatedConstructorArg() { return new Arg(); } @Override public <A extends Arg> BuildRule createBuildRule(TargetGraph targetGraph, BuildRuleParams params, BuildRuleResolver buildRuleResolver, A args) throws NoSuchBuildTargetException { SourcePathRuleFinder ruleFinder = new SourcePathRuleFinder(buildRuleResolver); ImmutableSet<Flavor> flavors = params.getBuildTarget().getFlavors(); if (flavors.contains(AAR_UNZIP_FLAVOR)) { Preconditions.checkState(flavors.size() == 1); BuildRuleParams unzipAarParams = params.copyWithDeps(Suppliers.ofInstance(ImmutableSortedSet.of()), Suppliers.ofInstance(ImmutableSortedSet.copyOf(ruleFinder.filterBuildRuleInputs(args.aar)))); return new UnzipAar(unzipAarParams, args.aar); } BuildRule unzipAarRule = buildRuleResolver .requireRule(params.getBuildTarget().withFlavors(AAR_UNZIP_FLAVOR)); Preconditions.checkState(unzipAarRule instanceof UnzipAar, "aar_unzip flavor created rule of unexpected type %s for target %s", unzipAarRule.getClass(), params.getBuildTarget()); UnzipAar unzipAar = (UnzipAar) unzipAarRule; if (flavors.contains(CalculateAbi.FLAVOR)) { return CalculateAbi.of(params.getBuildTarget(), ruleFinder, params, new BuildTargetSourcePath(unzipAar.getBuildTarget(), unzipAar.getPathToClassesJar())); } Iterable<PrebuiltJar> javaDeps = Iterables.concat( Iterables.filter(buildRuleResolver.getAllRules(args.deps), PrebuiltJar.class), Iterables.transform( Iterables.filter(buildRuleResolver.getAllRules(args.deps), AndroidPrebuiltAar.class), AndroidPrebuiltAar::getPrebuiltJar)); BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR); SourcePathResolver pathResolver = new SourcePathResolver(ruleFinder); PrebuiltJar prebuiltJar = buildRuleResolver.addToIndex(createPrebuiltJar(unzipAar, params, pathResolver, abiJarTarget, ImmutableSortedSet.copyOf(javaDeps))); BuildRuleParams androidLibraryParams = params.copyWithDeps( /* declaredDeps */ Suppliers.ofInstance(ImmutableSortedSet.of(prebuiltJar)), /* extraDeps */ Suppliers.ofInstance(ImmutableSortedSet.of(unzipAar))); return new AndroidPrebuiltAar(androidLibraryParams, /* resolver */ pathResolver, ruleFinder, /* proguardConfig */ new BuildTargetSourcePath(unzipAar.getBuildTarget(), unzipAar.getProguardConfig()), /* nativeLibsDirectory */ new BuildTargetSourcePath(unzipAar.getBuildTarget(), unzipAar.getNativeLibsDirectory()), /* prebuiltJar */ prebuiltJar, /* unzipRule */ unzipAar, /* javacOptions */ javacOptions, new JavacToJarStepFactory(javacOptions, new BootClasspathAppender()), /* exportedDeps */ javaDeps, abiJarTarget, JavaLibraryRules.getAbiInputs(buildRuleResolver, androidLibraryParams.getDeps())); } private PrebuiltJar createPrebuiltJar(UnzipAar unzipAar, BuildRuleParams params, SourcePathResolver resolver, BuildTarget abiJar, ImmutableSortedSet<BuildRule> deps) { BuildRuleParams buildRuleParams = params.copyWithChanges( /* buildTarget */ BuildTargets.createFlavoredBuildTarget(params.getBuildTarget().checkUnflavored(), AAR_PREBUILT_JAR_FLAVOR), /* declaredDeps */ Suppliers.ofInstance(deps), /* extraDeps */ Suppliers.ofInstance(ImmutableSortedSet.of(unzipAar))); return new PrebuiltJar(/* params */ buildRuleParams, /* resolver */ resolver, /* binaryJar */ new BuildTargetSourcePath(unzipAar.getBuildTarget(), unzipAar.getPathToClassesJar()), abiJar, /* sourceJar */ Optional.empty(), /* gwtJar */ Optional.empty(), /* javadocUrl */ Optional.empty(), /* mavenCoords */ Optional.empty(), /* provided */ false); } @SuppressFieldNotInitialized public static class Arg extends AbstractDescriptionArg { public SourcePath aar; public Optional<SourcePath> sourceJar; public Optional<String> javadocUrl; public ImmutableSortedSet<BuildTarget> deps = ImmutableSortedSet.of(); } }