// 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.syntax.Type.STRING; 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.rules.android.AndroidRuleClasses.MultidexMode; /** * 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 // /* // A full Java-language-style package name for the application. The name should be unique. // The name may contain uppercase or lowercase letters ('A' through 'Z'), numbers, and // underscores ('_'). However, individual package name parts may only start with letters. // The package name serves as a unique identifier for the application. It's also the default // name for the application process (see the <application> element's process attribute) // and the default task affinity of an activity. // // This overrides the value declared in the manifest. // */ .add(attr("application_id", STRING).undocumented("not ready for production use")) // /* // An internal version number. This number is used only to determine whether one version is // more recent than another, with higher numbers indicating more recent versions. This is not // the version number shown to users; that number is set by the version_name attribute. // The value must be set as an integer, such as "100". Each successive version must have a // higher number. // This overrides the value declared in the manifest. // // Subject to "Make" variable substitution. // Suggested practice is to declare a varrdef and reference it here so that a particular build // invocation will be used to generate apks for release. // */ .add(attr("version_code", STRING).undocumented("not ready for production use")) // /* // The version number shown to users. The string has no other purpose than to be displayed to // users. The version_code attribute holds the significant version number used internally. // This overrides the value declared in the manifest. // // Subject to "Make" variable substitution. // Suggested practice is to declare a varrdef and reference it here so that a particular build // invocation will be used to generate apks for release. // */ .add(attr("version_name", STRING).undocumented("not ready for production use")) /* A list of file extension to leave uncompressed in apk. */ .add(attr("nocompress_extensions", STRING_LIST)) /* 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)) /* 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))) /* Whether to split code into multiple dex files. Possible values: */ .add(attr("multidex", STRING) .allowedValues(new AllowedValueSet(MultidexMode.getValidValues())) .value(MultidexMode.OFF.getAttributeValue())) .removeAttribute("data") .build(); } @Override public Metadata getMetadata() { return RuleDefinition.Metadata.builder() .name("$android_binary_only") .type(RuleClassType.ABSTRACT) .ancestors(AndroidRuleClasses.AndroidBinaryBaseRule.class) .build(); } }