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
25ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "Resource.h"
26ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "Source.h"
27ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "xml/XmlDom.h"
28ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
29a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskinamespace aapt {
30a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskinamespace proguard {
31a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
32a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinskiclass KeepSet {
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski public:
34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  inline void AddClass(const Source& source, const std::string& class_name) {
35ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    keep_set_[class_name].insert(source);
36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
37a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  inline void AddMethod(const Source& source, const std::string& method_name) {
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    keep_method_set_[method_name].insert(source);
40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
41a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski private:
43ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  friend bool WriteKeepSet(std::ostream* out, const KeepSet& keep_set);
44a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::map<std::string, std::set<Source>> keep_set_;
46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::map<std::string, std::set<Source>> keep_method_set_;
47a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski};
48a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
49ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskibool CollectProguardRulesForManifest(const Source& source,
50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                     xml::XmlResource* res, KeepSet* keep_set,
51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                     bool main_dex_only = false);
52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskibool CollectProguardRules(const Source& source, xml::XmlResource* res,
53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                          KeepSet* keep_set);
54a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinskibool WriteKeepSet(std::ostream* out, const KeepSet& keep_set);
56a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace proguard
58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
59a1ad4a812a87642ad259ff4478159e8cc8194680Adam Lesinski
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski#endif  // AAPT_PROGUARD_RULES_H
61