Home | History | Annotate | Download | only in cmd
      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   friend class OptimizeCommand;
     30 
     31   // Path to the output APK.
     32   Maybe<std::string> output_path;
     33   // Path to the output APK directory for splits.
     34   Maybe<std::string> output_dir;
     35 
     36   // Details of the app extracted from the AndroidManifest.xml
     37   AppInfo app_info;
     38 
     39   // Blacklist of unused resources that should be removed from the apk.
     40   std::unordered_set<ResourceName> resources_blacklist;
     41 
     42   // Split APK options.
     43   TableSplitterOptions table_splitter_options;
     44 
     45   // List of output split paths. These are in the same order as `split_constraints`.
     46   std::vector<std::string> split_paths;
     47 
     48   // List of SplitConstraints governing what resources go into each split. Ordered by `split_paths`.
     49   std::vector<SplitConstraints> split_constraints;
     50 
     51   TableFlattenerOptions table_flattener_options;
     52 
     53   Maybe<std::vector<aapt::configuration::OutputArtifact>> apk_artifacts;
     54 
     55   // Set of artifacts to keep when generating multi-APK splits. If the list is empty, all artifacts
     56   // are kept and will be written as output.
     57   std::unordered_set<std::string> kept_artifacts;
     58 
     59   // Whether or not to shorten resource paths in the APK.
     60   bool shorten_resource_paths;
     61 
     62   // Path to the output map of original resource paths to shortened paths.
     63   Maybe<std::string> shortened_paths_map_path;
     64 };
     65 
     66 class OptimizeCommand : public Command {
     67  public:
     68   explicit OptimizeCommand() : Command("optimize") {
     69     SetDescription("Preforms resource optimizations on an apk.");
     70     AddOptionalFlag("-o", "Path to the output APK.", &options_.output_path, Command::kPath);
     71     AddOptionalFlag("-d", "Path to the output directory (for splits).", &options_.output_dir,
     72         Command::kPath);
     73     AddOptionalFlag("-x", "Path to XML configuration file.", &config_path_, Command::kPath);
     74     AddOptionalSwitch("-p", "Print the multi APK artifacts and exit.", &print_only_);
     75     AddOptionalFlag(
     76         "--target-densities",
     77         "Comma separated list of the screen densities that the APK will be optimized for.\n"
     78             "All the resources that would be unused on devices of the given densities will be \n"
     79             "removed from the APK.",
     80         &target_densities_);
     81     AddOptionalFlag("--whitelist-path",
     82         "Path to the whitelist.cfg file containing whitelisted resources \n"
     83             "whose names should not be altered in final resource tables.",
     84         &whitelist_path_);
     85     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_);
    103     AddOptionalSwitch("--enable-sparse-encoding",
    104         "Enables encoding sparse entries using a binary search tree.\n"
    105             "This decreases APK size at the cost of resource retrieval performance.",
    106         &options_.table_flattener_options.use_sparse_entries);
    107     AddOptionalSwitch("--enable-resource-obfuscation",
    108         "Enables obfuscation of key string pool to single value",
    109         &options_.table_flattener_options.collapse_key_stringpool);
    110     AddOptionalSwitch("--enable-resource-path-shortening",
    111         "Enables shortening of the path of the resources inside the APK.",
    112         &options_.shorten_resource_paths);
    113     AddOptionalFlag("--resource-path-shortening-map",
    114         "Path to output the map of old resource paths to shortened paths.",
    115         &options_.shortened_paths_map_path);
    116     AddOptionalSwitch("-v", "Enables verbose logging", &verbose_);
    117   }
    118 
    119   int Action(const std::vector<std::string>& args) override;
    120 
    121  private:
    122   OptimizeOptions options_;
    123 
    124   bool WriteObfuscatedPathsMap(const std::map<std::string, std::string> &path_map,
    125                                const std::string &file_path);
    126 
    127   Maybe<std::string> config_path_;
    128   Maybe<std::string> whitelist_path_;
    129   Maybe<std::string> resources_config_path_;
    130   Maybe<std::string> target_densities_;
    131   std::vector<std::string> configs_;
    132   std::vector<std::string> split_args_;
    133   std::unordered_set<std::string> kept_artifacts_;
    134   bool print_only_ = false;
    135   bool verbose_ = false;
    136 };
    137 
    138 }// namespace aapt
    139 
    140 #endif //AAPT2_OPTIMIZE_H
    141