blob: 9452e588953ee6eb96d8bf534a813e0d46ab7814 [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_CONVERT_H
18#define AAPT2_CONVERT_H
19
Ryan Mitchell4382e442021-07-14 12:53:01 -070020#include <optional>
21
Ryan Mitchell833a1a62018-07-10 13:51:36 -070022#include "Command.h"
Ryan Mitchell4e9a9222018-11-13 10:40:07 -080023#include "LoadedApk.h"
Ryan Mitchell833a1a62018-07-10 13:51:36 -070024#include "format/binary/TableFlattener.h"
Ryan Mitchell479fa392019-01-02 17:15:39 -080025#include "format/binary/XmlFlattener.h"
Ryan Mitchell833a1a62018-07-10 13:51:36 -070026
27namespace aapt {
28
29class ConvertCommand : public Command {
30 public:
31 explicit ConvertCommand() : Command("convert") {
32 SetDescription("Converts an apk between binary and proto formats.");
Ryan Mitchell2c8fc862018-12-13 16:56:07 -080033 AddRequiredFlag("-o", "Output path", &output_path_, Command::kPath);
Ryan Mitchell833a1a62018-07-10 13:51:36 -070034 AddOptionalFlag("--output-format", android::base::StringPrintf("Format of the output. "
35 "Accepted values are '%s' and '%s'. When not set, defaults to '%s'.",
36 kOutputFormatProto, kOutputFormatBinary, kOutputFormatBinary), &output_format_);
Iurii Makhnoda06e4d2022-08-24 14:17:32 +000037 AddOptionalSwitch(
38 "--enable-sparse-encoding",
Ryan Mitchell833a1a62018-07-10 13:51:36 -070039 "Enables encoding sparse entries using a binary search tree.\n"
Iurii Makhnoda06e4d2022-08-24 14:17:32 +000040 "This decreases APK size at the cost of resource retrieval performance.\n"
41 "Only applies sparse encoding to Android O+ resources or all resources if minSdk of "
42 "the APK is O+",
43 &enable_sparse_encoding_);
44 AddOptionalSwitch("--force-sparse-encoding",
45 "Enables encoding sparse entries using a binary search tree.\n"
46 "This decreases APK size at the cost of resource retrieval performance.\n"
47 "Applies sparse encoding to all resources regardless of minSdk.",
48 &force_sparse_encoding_);
Rico Windec629dd2023-08-01 14:11:45 +020049 AddOptionalSwitch(
50 "--enable-compact-entries",
51 "This decreases APK size by using compact resource entries for simple data types.",
52 &enable_compact_entries_);
Ryan Mitchell479fa392019-01-02 17:15:39 -080053 AddOptionalSwitch("--keep-raw-values",
54 android::base::StringPrintf("Preserve raw attribute values in xml files when using the"
55 " '%s' output format", kOutputFormatBinary),
56 &xml_flattener_options_.keep_raw_values);
Iurii Makhno054e4332022-10-12 16:03:03 +000057 AddOptionalFlag("--resources-config-path",
58 "Path to the resources.cfg file containing the list of resources and \n"
59 "directives to each resource. \n"
60 "Format: type/resource_name#[directive][,directive]",
61 &resources_config_path_);
62 AddOptionalSwitch(
63 "--collapse-resource-names",
64 "Collapses resource names to a single value in the key string pool. Resources can \n"
65 "be exempted using the \"no_collapse\" directive in a file specified by "
66 "--resources-config-path.",
67 &table_flattener_options_.collapse_key_stringpool);
68 AddOptionalSwitch(
69 "--deduplicate-entry-values",
70 "Whether to deduplicate pairs of resource entry and value for simple resources.\n"
71 "This is recommended to be used together with '--collapse-resource-names' flag or for\n"
72 "APKs where resource names are manually collapsed. For such APKs this flag allows to\n"
73 "store the same resource value only once in resource table which decreases APK size.\n"
74 "Has no effect on APKs where resource names are kept.",
75 &table_flattener_options_.deduplicate_entry_values);
Ryan Mitchell833a1a62018-07-10 13:51:36 -070076 AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
77 }
78
79 int Action(const std::vector<std::string>& args) override;
80
81 private:
82 const static char* kOutputFormatProto;
83 const static char* kOutputFormatBinary;
84
Ryan Mitchell479fa392019-01-02 17:15:39 -080085 TableFlattenerOptions table_flattener_options_;
86 XmlFlattenerOptions xml_flattener_options_;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070087 std::string output_path_;
Ryan Mitchell4382e442021-07-14 12:53:01 -070088 std::optional<std::string> output_format_;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070089 bool verbose_ = false;
Iurii Makhnoda06e4d2022-08-24 14:17:32 +000090 bool enable_sparse_encoding_ = false;
91 bool force_sparse_encoding_ = false;
Rico Windec629dd2023-08-01 14:11:45 +020092 bool enable_compact_entries_ = false;
Iurii Makhno054e4332022-10-12 16:03:03 +000093 std::optional<std::string> resources_config_path_;
Ryan Mitchell833a1a62018-07-10 13:51:36 -070094};
95
Ryan Mitchell4e9a9222018-11-13 10:40:07 -080096int Convert(IAaptContext* context, LoadedApk* input, IArchiveWriter* output_writer,
Ryan Mitchell479fa392019-01-02 17:15:39 -080097 ApkFormat output_format,TableFlattenerOptions table_flattener_options,
98 XmlFlattenerOptions xml_flattener_options);
Ryan Mitchell4e9a9222018-11-13 10:40:07 -080099
100} // namespace aapt
Ryan Mitchell833a1a62018-07-10 13:51:36 -0700101
102#endif //AAPT2_CONVERT_H