• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
26 namespace aapt {
27 
28 struct OptimizeOptions {
29   // Path to the output APK.
30   std::optional<std::string> output_path;
31   // Path to the output APK directory for splits.
32   std::optional<std::string> output_dir;
33 
34   // Details of the app extracted from the AndroidManifest.xml
35   AppInfo app_info;
36 
37   // Exclude list of unused resources that should be removed from the apk.
38   std::unordered_set<ResourceName> resources_exclude_list;
39 
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 
51   std::optional<std::vector<aapt::configuration::OutputArtifact>> apk_artifacts;
52 
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;
56 
57   // Whether or not to shorten resource paths in the APK.
58   bool shorten_resource_paths = false;
59 
60   // Path to the output map of original resource paths to shortened paths.
61   // TODO(b/246489170): keep the old option and format until transform to the new one
62   std::optional<std::string> shortened_paths_map_path;
63 
64   // Whether sparse encoding should be used for O+ resources.
65   bool enable_sparse_encoding = false;
66 
67   // Whether sparse encoding should be used for all resources.
68   bool force_sparse_encoding = false;
69 
70   // Path to the output map of original resource paths/names to obfuscated paths/names.
71   std::optional<std::string> obfuscation_map_path;
72 };
73 
74 class OptimizeCommand : public Command {
75  public:
OptimizeCommand()76   explicit OptimizeCommand() : Command("optimize") {
77     SetDescription("Preforms resource optimizations on an apk.");
78     AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path, Command::kPath);
79     AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir,
80         Command::kPath);
81     AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_, Command::kPath);
82     AddOptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only_);
83     AddOptionalFlag(
84         "--target-densities",
85         "Comma separated list of the screen densities that the APK will be optimized for.\n"
86             "All the resources that would be unused on devices of the given densities will be \n"
87             "removed from the APK.",
88         &target_densities_);
89     AddOptionalFlag("--resources-config-path",
90         "Path to the resources.cfg file containing the list of resources and \n"
91             "directives to each resource. \n"
92             "Format: type/resource_name#[directive][,directive]",
93         &resources_config_path_);
94     AddOptionalFlagList("-c",
95         "Comma separated list of configurations to include. The default\n"
96             "is all configurations.",
97         &configs_);
98     AddOptionalFlagList("--split",
99         "Split resources matching a set of configs out to a "
100             "Split APK.\nSyntax: path/to/output.apk;<config>[,<config>[...]].\n"
101             "On Windows, use a semicolon ';' separator instead.",
102         &split_args_);
103     AddOptionalFlagList("--keep-artifacts",
104         "Comma separated list of artifacts to keep. If none are specified,\n"
105             "all artifacts will be kept.",
106         &kept_artifacts_);
107     AddOptionalSwitch(
108         "--enable-sparse-encoding",
109         "Enables encoding sparse entries using a binary search tree.\n"
110         "This decreases APK size at the cost of resource retrieval performance.\n"
111         "Only applies sparse encoding to Android O+ resources or all resources if minSdk of "
112         "the APK is O+",
113         &options_.enable_sparse_encoding);
114     AddOptionalSwitch("--force-sparse-encoding",
115                       "Enables encoding sparse entries using a binary search tree.\n"
116                       "This decreases APK size at the cost of resource retrieval performance.\n"
117                       "Applies sparse encoding to all resources regardless of minSdk.",
118                       &options_.force_sparse_encoding);
119     AddOptionalSwitch("--collapse-resource-names",
120         "Collapses resource names to a single value in the key string pool. Resources can \n"
121             "be exempted using the \"no_collapse\" directive in a file specified by "
122             "--resources-config-path.",
123         &options_.table_flattener_options.collapse_key_stringpool);
124     AddOptionalSwitch("--shorten-resource-paths",
125         "Shortens the paths of resources inside the APK. Resources can be exempted using the \n"
126         "\"no_path_shorten\" directive in a file specified by --resources-config-path.",
127         &options_.shorten_resource_paths);
128     // TODO(b/246489170): keep the old option and format until transform to the new one
129     AddOptionalFlag("--resource-path-shortening-map",
130                     "[Deprecated]Path to output the map of old resource paths to shortened paths.",
131                     &options_.shortened_paths_map_path);
132     AddOptionalFlag("--save-obfuscation-map",
133                     "Path to output the map of original paths/names to obfuscated paths/names.",
134                     &options_.obfuscation_map_path);
135     AddOptionalSwitch(
136         "--deduplicate-entry-values",
137         "Whether to deduplicate pairs of resource entry and value for simple resources.\n"
138         "This is recommended to be used together with '--collapse-resource-names' flag or for\n"
139         "APKs where resource names are manually collapsed. For such APKs this flag allows to\n"
140         "store the same resource value only once in resource table which decreases APK size.\n"
141         "Has no effect on APKs where resource names are kept.",
142         &options_.table_flattener_options.deduplicate_entry_values);
143     AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
144   }
145 
146   int Action(const std::vector<std::string>& args) override;
147 
148  private:
149   OptimizeOptions options_;
150 
151   bool WriteObfuscatedPathsMap(const std::map<std::string, std::string> &path_map,
152                                const std::string &file_path);
153 
154   std::optional<std::string> config_path_;
155   std::optional<std::string> resources_config_path_;
156   std::optional<std::string> target_densities_;
157   std::vector<std::string> configs_;
158   std::vector<std::string> split_args_;
159   std::unordered_set<std::string> kept_artifacts_;
160   bool print_only_ = false;
161   bool verbose_ = false;
162 };
163 
164 }// namespace aapt
165 
166 #endif //AAPT2_OPTIMIZE_H
167