blob: 794a87b0faa580589c558606022de14930688379 [file] [log] [blame]
Ryan Mitchell833a1a62018-07-10 13:51:36 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef AAPT2_OPTIMIZE_H
18#define AAPT2_OPTIMIZE_H
19
20#include "AppInfo.h"
21#include "Command.h"
22#include "configuration/ConfigurationParser.h"
23#include "format/binary/TableFlattener.h"
24#include "split/TableSplitter.h"
25
26namespace aapt {
27
28struct OptimizeOptions {
Ryan Mitchell833a1a62018-07-10 13:51:36 -070029 // Path to the output APK.
Ryan Mitchell4382e442021-07-14 12:53:01 -070030 std::optional<std::string> output_path;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070031 // Path to the output APK directory for splits.
Ryan Mitchell4382e442021-07-14 12:53:01 -070032 std::optional<std::string> output_dir;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070033
34 // Details of the app extracted from the AndroidManifest.xml
35 AppInfo app_info;
36
Ryan Mitchell4ea90752020-07-31 08:21:43 -070037 // Exclude list of unused resources that should be removed from the apk.
38 std::unordered_set<ResourceName> resources_exclude_list;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070039
40 // Split APK options.
41 TableSplitterOptions table_splitter_options;
42
43 // List of output split paths. These are in the same order as `split_constraints`.
44 std::vector<std::string> split_paths;
45
46 // List of SplitConstraints governing what resources go into each split. Ordered by `split_paths`.
47 std::vector<SplitConstraints> split_constraints;
48
49 TableFlattenerOptions table_flattener_options;
50
Ryan Mitchell4382e442021-07-14 12:53:01 -070051 std::optional<std::vector<aapt::configuration::OutputArtifact>> apk_artifacts;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070052
53 // Set of artifacts to keep when generating multi-APK splits. If the list is empty, all artifacts
54 // are kept and will be written as output.
55 std::unordered_set<std::string> kept_artifacts;
Mohamed Heikalc7694032018-11-07 16:49:02 -050056
57 // Whether or not to shorten resource paths in the APK.
Donald Chaid554f7c2019-07-10 18:46:34 -070058 bool shorten_resource_paths = false;
Mohamed Heikalc7694032018-11-07 16:49:02 -050059
60 // Path to the output map of original resource paths to shortened paths.
Ryan Mitchell4382e442021-07-14 12:53:01 -070061 std::optional<std::string> shortened_paths_map_path;
Iurii Makhnoda06e4d2022-08-24 14:17:32 +000062
63 // Whether sparse encoding should be used for O+ resources.
64 bool enable_sparse_encoding = false;
65
66 // Whether sparse encoding should be used for all resources.
67 bool force_sparse_encoding = false;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070068};
69
70class OptimizeCommand : public Command {
71 public:
72 explicit OptimizeCommand() : Command("optimize") {
73 SetDescription("Preforms resource optimizations on an apk.");
Ryan Mitchell2c8fc862018-12-13 16:56:07 -080074 AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path, Command::kPath);
75 AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir,
76 Command::kPath);
77 AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_, Command::kPath);
Ryan Mitchell833a1a62018-07-10 13:51:36 -070078 AddOptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only_);
79 AddOptionalFlag(
80 "--target-densities",
81 "Comma separated list of the screen densities that the APK will be optimized for.\n"
82 "All the resources that would be unused on devices of the given densities will be \n"
83 "removed from the APK.",
84 &target_densities_);
Ryan Mitchell833a1a62018-07-10 13:51:36 -070085 AddOptionalFlag("--resources-config-path",
86 "Path to the resources.cfg file containing the list of resources and \n"
87 "directives to each resource. \n"
88 "Format: type/resource_name#[directive][,directive]",
89 &resources_config_path_);
90 AddOptionalFlagList("-c",
91 "Comma separated list of configurations to include. The default\n"
92 "is all configurations.",
93 &configs_);
94 AddOptionalFlagList("--split",
95 "Split resources matching a set of configs out to a "
96 "Split APK.\nSyntax: path/to/output.apk;<config>[,<config>[...]].\n"
97 "On Windows, use a semicolon ';' separator instead.",
98 &split_args_);
99 AddOptionalFlagList("--keep-artifacts",
100 "Comma separated list of artifacts to keep. If none are specified,\n"
101 "all artifacts will be kept.",
102 &kept_artifacts_);
Iurii Makhnoda06e4d2022-08-24 14:17:32 +0000103 AddOptionalSwitch(
104 "--enable-sparse-encoding",
Ryan Mitchell833a1a62018-07-10 13:51:36 -0700105 "Enables encoding sparse entries using a binary search tree.\n"
Iurii Makhnoda06e4d2022-08-24 14:17:32 +0000106 "This decreases APK size at the cost of resource retrieval performance.\n"
107 "Only applies sparse encoding to Android O+ resources or all resources if minSdk of "
108 "the APK is O+",
109 &options_.enable_sparse_encoding);
110 AddOptionalSwitch("--force-sparse-encoding",
111 "Enables encoding sparse entries using a binary search tree.\n"
112 "This decreases APK size at the cost of resource retrieval performance.\n"
113 "Applies sparse encoding to all resources regardless of minSdk.",
114 &options_.force_sparse_encoding);
Brian Changd882ba42019-09-16 11:03:53 -0700115 AddOptionalSwitch("--collapse-resource-names",
116 "Collapses resource names to a single value in the key string pool. Resources can \n"
117 "be exempted using the \"no_collapse\" directive in a file specified by "
118 "--resources-config-path.",
Ryan Mitchell833a1a62018-07-10 13:51:36 -0700119 &options_.table_flattener_options.collapse_key_stringpool);
Brian Changd882ba42019-09-16 11:03:53 -0700120 AddOptionalSwitch("--shorten-resource-paths",
121 "Shortens the paths of resources inside the APK.",
Mohamed Heikalc7694032018-11-07 16:49:02 -0500122 &options_.shorten_resource_paths);
123 AddOptionalFlag("--resource-path-shortening-map",
124 "Path to output the map of old resource paths to shortened paths.",
125 &options_.shortened_paths_map_path);
Iurii Makhno054e4332022-10-12 16:03:03 +0000126 AddOptionalSwitch(
127 "--deduplicate-entry-values",
128 "Whether to deduplicate pairs of resource entry and value for simple resources.\n"
129 "This is recommended to be used together with '--collapse-resource-names' flag or for\n"
130 "APKs where resource names are manually collapsed. For such APKs this flag allows to\n"
131 "store the same resource value only once in resource table which decreases APK size.\n"
132 "Has no effect on APKs where resource names are kept.",
133 &options_.table_flattener_options.deduplicate_entry_values);
Ryan Mitchell833a1a62018-07-10 13:51:36 -0700134 AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
135 }
136
137 int Action(const std::vector<std::string>& args) override;
138
139 private:
140 OptimizeOptions options_;
141
Mohamed Heikalc7694032018-11-07 16:49:02 -0500142 bool WriteObfuscatedPathsMap(const std::map<std::string, std::string> &path_map,
143 const std::string &file_path);
144
Ryan Mitchell4382e442021-07-14 12:53:01 -0700145 std::optional<std::string> config_path_;
146 std::optional<std::string> resources_config_path_;
147 std::optional<std::string> target_densities_;
Ryan Mitchell833a1a62018-07-10 13:51:36 -0700148 std::vector<std::string> configs_;
149 std::vector<std::string> split_args_;
150 std::unordered_set<std::string> kept_artifacts_;
151 bool print_only_ = false;
152 bool verbose_ = false;
153};
154
155}// namespace aapt
156
Mohamed Heikalc7694032018-11-07 16:49:02 -0500157#endif //AAPT2_OPTIMIZE_H