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