// Copyright 2015 The Bazel Authors. All rights reserved. // // 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.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import javax.annotation.Nullable; /** * The ResourceApk represents the packaged resources that serve as the basis for the signed and the * unsigned APKs. */ @Immutable public final class ResourceApk { // TODO(bazel-team): The only fields that are legitimately nullable are javaSrcJar and // mainDexProguardConfig. The rest are marked as such due to .fromTransitiveResources(). // It seems like there should be a better way to do this. @Nullable private final Artifact resourceApk; // The .ap_ file @Nullable private final Artifact resourceJavaSrcJar; // Source jar containing R.java and friends @Nullable private final Artifact resourceJavaClassJar; // Class jar containing R.class files private final ResourceDependencies resourceDeps; @Nullable private final ResourceContainer primaryResource; @Nullable private final Artifact manifest; // The non-binary XML version of AndroidManifest.xml @Nullable private final Artifact resourceProguardConfig; @Nullable private final Artifact mainDexProguardConfig; private final boolean legacy; public ResourceApk( @Nullable Artifact resourceApk, @Nullable Artifact resourceJavaSrcJar, @Nullable Artifact resourceJavaClassJar, ResourceDependencies resourceDeps, @Nullable ResourceContainer primaryResource, @Nullable Artifact manifest, @Nullable Artifact resourceProguardConfig, @Nullable Artifact mainDexProguardConfig, boolean legacy) { this.resourceApk = resourceApk; this.resourceJavaSrcJar = resourceJavaSrcJar; this.resourceJavaClassJar = resourceJavaClassJar; this.resourceDeps = resourceDeps; this.primaryResource = primaryResource; this.manifest = manifest; this.resourceProguardConfig = resourceProguardConfig; this.mainDexProguardConfig = mainDexProguardConfig; this.legacy = legacy; } public Artifact getArtifact() { return resourceApk; } public ResourceContainer getPrimaryResource() { return primaryResource; } public Artifact getManifest() { return manifest; } public Artifact getResourceJavaSrcJar() { return resourceJavaSrcJar; } public Artifact getResourceJavaClassJar() { return resourceJavaClassJar; } public boolean isLegacy() { return legacy; } public static ResourceApk fromTransitiveResources( ResourceDependencies resourceDeps) { return new ResourceApk(null, null, null, resourceDeps, null, null, null, null, false); } public Artifact getResourceProguardConfig() { return resourceProguardConfig; } public Artifact getMainDexProguardConfig() { return mainDexProguardConfig; } public ResourceDependencies getResourceDependencies() { return resourceDeps; } /** * Creates an provider from the resources in the ResourceApk. * * <p>If the ResourceApk was created from transitive resources, the provider will effectively * contain the "forwarded" resources: The merged transitive and merged direct dependencies of this * library. * * <p>If the ResourceApk was generated from a "resources" attribute, it will contain the * "resources" container in the direct dependencies and the rest as transitive. * * <p>If the ResourceApk was generated from local resources, that will be the direct dependencies and * the rest will be transitive. */ public AndroidResourcesProvider toResourceProvider(Label label) { if (primaryResource == null) { return resourceDeps.toProvider(label); } return resourceDeps.toProvider(label, primaryResource); } }