blob: 3c9c4767b3d17c7a353479663ea998d88abd457d [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
2 * Copyright (C) 2015 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 AAPT_LINKER_LINKERS_H
18#define AAPT_LINKER_LINKERS_H
19
Adam Lesinskice5e56e2016-10-21 17:56:45 -070020#include <set>
21#include <unordered_set>
22
23#include "android-base/macros.h"
Adam Lesinski1ef0fa92017-08-15 21:32:49 -070024#include "androidfw/StringPiece.h"
Adam Lesinskice5e56e2016-10-21 17:56:45 -070025
Adam Lesinski467f1712015-11-16 17:35:44 -080026#include "Resource.h"
Adam Lesinskic744ae82017-05-17 19:28:38 -070027#include "SdkConstants.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070028#include "process/IResourceTableConsumer.h"
Adam Lesinski467f1712015-11-16 17:35:44 -080029#include "xml/XmlDom.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070030
Adam Lesinski1ab598f2015-08-14 14:26:04 -070031namespace aapt {
32
33class ResourceTable;
Adam Lesinskie4bb9eb2016-02-12 22:18:51 -080034class ResourceEntry;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070035struct ConfigDescription;
36
Adam Lesinski1ef0fa92017-08-15 21:32:49 -070037// Defines the context in which a resource value is defined. Most resources are defined with the
38// implicit package name of their compilation context. Understanding the package name of a resource
39// allows to determine visibility of other symbols which may or may not have their packages defined.
Adam Lesinski467f1712015-11-16 17:35:44 -080040struct CallSite {
Adam Lesinski1ef0fa92017-08-15 21:32:49 -070041 std::string package;
Adam Lesinski467f1712015-11-16 17:35:44 -080042};
43
Adam Lesinski1ef0fa92017-08-15 21:32:49 -070044// Determines whether a versioned resource should be created. If a versioned resource already
45// exists, it takes precedence.
Adam Lesinskic744ae82017-05-17 19:28:38 -070046bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
47 const ApiVersion sdk_version_to_generate);
48
Adam Lesinskibb94f322017-07-12 07:41:55 -070049// Finds the next largest ApiVersion of the config which is identical to the given config except
50// for sdkVersion.
Adam Lesinskic744ae82017-05-17 19:28:38 -070051ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry, const ConfigDescription& config);
Adam Lesinski1ab598f2015-08-14 14:26:04 -070052
Adam Lesinskifb6312f2016-06-28 14:40:32 -070053class AutoVersioner : public IResourceTableConsumer {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070054 public:
Adam Lesinskice5e56e2016-10-21 17:56:45 -070055 AutoVersioner() = default;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070056
Adam Lesinskice5e56e2016-10-21 17:56:45 -070057 bool Consume(IAaptContext* context, ResourceTable* table) override;
58
59 private:
60 DISALLOW_COPY_AND_ASSIGN(AutoVersioner);
Adam Lesinski1ab598f2015-08-14 14:26:04 -070061};
62
Adam Lesinski1ef0fa92017-08-15 21:32:49 -070063// If any attribute resource values are defined as public, this consumer will move all private
64// attribute resource values to a private ^private-attr type, avoiding backwards compatibility
65// issues with new apps running on old platforms.
66//
67// The Android platform ignores resource attributes it doesn't recognize, so an app developer can
68// use new attributes in their layout XML files without worrying about versioning. This assumption
69// actually breaks on older platforms. OEMs may add private attributes that are used internally.
70// AAPT originally assigned all private attributes IDs immediately proceeding the public attributes'
71// IDs.
72//
73// This means that on a newer Android platform, an ID previously assigned to a private attribute
74// may end up assigned to a public attribute.
75//
76// App developers assume using the newer attribute is safe on older platforms because it will
77// be ignored. Instead, the platform thinks the new attribute is an older, private attribute and
78// will interpret it as such. This leads to unintended styling and exceptions thrown due to
79// unexpected types.
80//
81// By moving the private attributes to a completely different type, this ID conflict will never
82// occur.
Adam Lesinskice5e56e2016-10-21 17:56:45 -070083class PrivateAttributeMover : public IResourceTableConsumer {
84 public:
85 PrivateAttributeMover() = default;
86
87 bool Consume(IAaptContext* context, ResourceTable* table) override;
88
89 private:
90 DISALLOW_COPY_AND_ASSIGN(PrivateAttributeMover);
91};
92
93class ResourceConfigValue;
94
95class ProductFilter : public IResourceTableConsumer {
96 public:
Adam Lesinskic744ae82017-05-17 19:28:38 -070097 using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
Adam Lesinskice5e56e2016-10-21 17:56:45 -070098
Adam Lesinskic744ae82017-05-17 19:28:38 -070099 explicit ProductFilter(std::unordered_set<std::string> products) : products_(products) {
100 }
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700101
102 ResourceConfigValueIter SelectProductToKeep(
103 const ResourceNameRef& name, const ResourceConfigValueIter begin,
104 const ResourceConfigValueIter end, IDiagnostics* diag);
105
106 bool Consume(IAaptContext* context, ResourceTable* table) override;
107
108 private:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700109 DISALLOW_COPY_AND_ASSIGN(ProductFilter);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700110
Adam Lesinskic744ae82017-05-17 19:28:38 -0700111 std::unordered_set<std::string> products_;
Adam Lesinski9f222042015-11-04 13:51:45 -0800112};
113
Adam Lesinski1ef0fa92017-08-15 21:32:49 -0700114// Removes namespace nodes and URI information from the XmlResource.
115//
116// Once an XmlResource is processed by this consumer, it is no longer able to have its attributes
117// parsed. As such, this XmlResource must have already been processed by XmlReferenceLinker.
Alexandria Cornwalla7cc3f12016-08-16 13:33:32 -0700118class XmlNamespaceRemover : public IXmlResourceConsumer {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700119 public:
Adam Lesinskic744ae82017-05-17 19:28:38 -0700120 explicit XmlNamespaceRemover(bool keep_uris = false) : keep_uris_(keep_uris){};
Alexandria Cornwalla7cc3f12016-08-16 13:33:32 -0700121
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700122 bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
123
124 private:
125 DISALLOW_COPY_AND_ASSIGN(XmlNamespaceRemover);
126
127 bool keep_uris_;
Alexandria Cornwalla7cc3f12016-08-16 13:33:32 -0700128};
129
Adam Lesinski1ef0fa92017-08-15 21:32:49 -0700130// Resolves attributes in the XmlResource and compiles string values to resource values.
131// Once an XmlResource is processed by this linker, it is ready to be flattened.
Adam Lesinski9f222042015-11-04 13:51:45 -0800132class XmlReferenceLinker : public IXmlResourceConsumer {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700133 public:
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700134 XmlReferenceLinker() = default;
135
136 bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700137
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700138 private:
139 DISALLOW_COPY_AND_ASSIGN(XmlReferenceLinker);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700140};
141
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700142} // namespace aapt
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700143
144#endif /* AAPT_LINKER_LINKERS_H */