// 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 static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import static com.google.devtools.build.lib.packages.BuildType.TRISTATE; import static com.google.devtools.build.lib.syntax.Type.BOOLEAN; import static com.google.devtools.build.lib.syntax.Type.STRING; import static com.google.devtools.build.lib.syntax.Type.STRING_DICT; import static com.google.devtools.build.lib.syntax.Type.STRING_LIST; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidManifestMerger; /** * Attributes for {@code android_binary} that are not present on {@code android_test}. */ public final class AndroidBinaryOnlyRule implements RuleDefinition { @Override public RuleClass build(RuleClass.Builder builder, final RuleDefinitionEnvironment env) { return builder /* Select the manifest merger to use for this rule.
Possible values: */ .add(attr("manifest_merger", STRING) .allowedValues(new AllowedValueSet(AndroidManifestMerger.getAttributeValues())) .value(AndroidManifestMerger.getRuleAttributeDefault())) /* A dictionary of values to be overridden in the manifest. Any instance of ${name} in the manifest will be replaced with the value corresponding to name in this dictionary. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion and maxSdkVersion will also override the corresponding attributes of the manifest and uses-sdk tags. packageName will be ignored and will be set from either applicationId if specified or the package in manifest. When manifest_merger is set to legacy, only applicationId, versionCode and versionName will have any effect. */ .add(attr("manifest_values", STRING_DICT)) /* A list of file extension to leave uncompressed in apk. */ .add(attr("nocompress_extensions", STRING_LIST)) /* Do PNG crunching (or not). This is independent of nine-patch processing, which is always done. Currently only supported for local resources (not android_resources). */ .add(attr("crunch_png", BOOLEAN).value(true)) /* A list of resource configuration filters, such 'en' that will limit the resources in the apk to only the ones in the 'en' configuration. */ .add(attr("resource_configuration_filters", STRING_LIST)) /* Whether to perform resource shrinking. Resources that are not used by the binary will be removed from the APK. This is only supported for rules using local resources (i.e. the manifest and resource_files attributes) and requires ProGuard. It operates in mostly the same manner as the Gradle resource shrinker (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

Notable differences:

If resource shrinking is enabled, name_files/resource_shrinker.log will also be generated, detailing the analysis and deletions performed.

Possible values:

*/ .add(attr("shrink_resources", TRISTATE).value(TriState.AUTO)) /* Densities to filter for when building the apk. This will strip out raster drawable resources that would not be loaded by a device with the specified screen densities, to reduce APK size. A corresponding compatible-screens section will also be added to the manifest if it does not already contain a superset listing. */ .add(attr("densities", STRING_LIST)) .add(attr("$android_manifest_merge_tool", LABEL) .cfg(HOST) .exec() .value(env.getToolsLabel(AndroidRuleClasses.MANIFEST_MERGE_TOOL_LABEL))) .removeAttribute("data") .build(); } @Override public Metadata getMetadata() { return RuleDefinition.Metadata.builder() .name("$android_binary_only") .type(RuleClassType.ABSTRACT) .ancestors(AndroidRuleClasses.AndroidBinaryBaseRule.class) .build(); } }