1a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski/*
2a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * Copyright (C) 2015 The Android Open Source Project
3a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski *
4a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * you may not use this file except in compliance with the License.
6a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * You may obtain a copy of the License at
7a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski *
8a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski *
10a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * See the License for the specific language governing permissions and
14a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski * limitations under the License.
15a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski */
16a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
17a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#ifndef AAPT_PROGUARD_RULES_H
18a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#define AAPT_PROGUARD_RULES_H
19a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
20a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <map>
21a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <ostream>
22a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <set>
23a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski#include <string>
24a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
25a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski#include "androidfw/StringPiece.h"
26a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "Resource.h"
28dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski#include "ResourceTable.h"
29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "Source.h"
30dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski#include "ValueVisitor.h"
31a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski#include "io/Io.h"
32dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski#include "process/IResourceTableConsumer.h"
33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "xml/XmlDom.h"
34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
35a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskinamespace aapt {
36a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskinamespace proguard {
37a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
38dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskistruct UsageLocation {
39dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  ResourceName name;
40dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  Source source;
41dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski};
42dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
43a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskiclass KeepSet {
44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public:
45dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  KeepSet() = default;
46dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
47dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  KeepSet(bool conditional_keep_rules) : conditional_keep_rules_(conditional_keep_rules) {
48dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  }
49dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
50dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  inline void AddManifestClass(const UsageLocation& file, const std::string& class_name) {
51dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski    manifest_class_set_[class_name].insert(file);
52dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  }
53dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
54dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  inline void AddConditionalClass(const UsageLocation& file, const std::string& class_name) {
55dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski    conditional_class_set_[class_name].insert(file);
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
57a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
58dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  inline void AddMethod(const UsageLocation& file, const std::string& method_name) {
59dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski    method_set_[method_name].insert(file);
60dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  }
61dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
62dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  inline void AddReference(const UsageLocation& file, const ResourceName& resource_name) {
63dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski    reference_set_[resource_name].insert(file);
64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
65a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private:
67a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski  friend void WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out);
68a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
69dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  friend bool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
70dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski                               std::set<UsageLocation>* locations);
71dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
72dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  bool conditional_keep_rules_ = false;
73dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  std::map<std::string, std::set<UsageLocation>> manifest_class_set_;
74dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  std::map<std::string, std::set<UsageLocation>> method_set_;
75dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  std::map<std::string, std::set<UsageLocation>> conditional_class_set_;
76dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  std::map<ResourceName, std::set<UsageLocation>> reference_set_;
77a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski};
78a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
79dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskibool CollectProguardRulesForManifest(xml::XmlResource* res, KeepSet* keep_set,
80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                     bool main_dex_only = false);
81a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
82dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskibool CollectProguardRules(xml::XmlResource* res, KeepSet* keep_set);
83a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
84a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinskibool CollectResourceReferences(IAaptContext* context, ResourceTable* table, KeepSet* keep_set);
85a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinski
86a693c4a32ebed4e96dcc1cf6a706e8ebbb004db2Adam Lesinskivoid WriteKeepSet(const KeepSet& keep_set, io::OutputStream* out);
87a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
88dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskibool CollectLocations(const UsageLocation& location, const KeepSet& keep_set,
89dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski                      std::set<UsageLocation>* locations);
90dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
91dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski//
92dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski// UsageLocation implementation.
93dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski//
94dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
95dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskiinline bool operator==(const UsageLocation& lhs, const UsageLocation& rhs) {
96dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  return lhs.name == rhs.name;
97dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski}
98dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
99dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koskiinline int operator<(const UsageLocation& lhs, const UsageLocation& rhs) {
100dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski  return lhs.name.compare(rhs.name);
101dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski}
102dc21dea9b8b1157a4a9347b68301da4307c51168Adam Koski
103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace proguard
104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
105a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
106cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif  // AAPT_PROGUARD_RULES_H
107