1/*
2 * Copyright (C) 2016 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
17syntax = "proto3";
18
19import "frameworks/base/tools/aapt2/Configuration.proto";
20
21package aapt.pb;
22
23option java_package = "com.android.aapt";
24option optimize_for = LITE_RUNTIME;
25
26// A string pool that wraps the binary form of the C++ class android::ResStringPool.
27message StringPool {
28  bytes data = 1;
29}
30
31// The position of a declared entity within a file.
32message SourcePosition {
33  uint32 line_number = 1;
34  uint32 column_number = 2;
35}
36
37// Developer friendly source file information for an entity in the resource table.
38message Source {
39  // The index of the string path within the source string pool of a ResourceTable.
40  uint32 path_idx = 1;
41  SourcePosition position = 2;
42}
43
44// The name and version fingerprint of a build tool.
45message ToolFingerprint {
46  string tool = 1;
47  string version = 2;
48}
49
50// Top level message representing a resource table.
51message ResourceTable {
52  // The string pool containing source paths referenced throughout the resource table. This does
53  // not end up in the final binary ARSC file.
54  StringPool source_pool = 1;
55
56  // Resource definitions corresponding to an Android package.
57  repeated Package package = 2;
58
59  // The <overlayable> declarations within the resource table.
60  repeated Overlayable overlayable = 3;
61
62  // The version fingerprints of the tools that built the resource table.
63  repeated ToolFingerprint tool_fingerprint = 4;
64}
65
66// A package ID in the range [0x00, 0xff].
67message PackageId {
68  uint32 id = 1;
69}
70
71// Defines resources for an Android package.
72message Package {
73  // The package ID of this package, in the range [0x00, 0xff].
74  // - ID 0x00 is reserved for shared libraries, or when the ID is assigned at run-time.
75  // - ID 0x01 is reserved for the 'android' package (framework).
76  // - ID range [0x02, 0x7f) is reserved for auto-assignment to shared libraries at run-time.
77  // - ID 0x7f is reserved for the application package.
78  // - IDs > 0x7f are reserved for the application as well and are treated as feature splits.
79  // This may not be set if no ID was assigned.
80  PackageId package_id = 1;
81
82  // The Java compatible Android package name of the app.
83  string package_name = 2;
84
85  // The series of types defined by the package.
86  repeated Type type = 3;
87}
88
89// A type ID in the range [0x01, 0xff].
90message TypeId {
91  uint32 id = 1;
92}
93
94// A set of resources grouped under a common type. Such types include string, layout, xml, dimen,
95// attr, etc. This maps to the second part of a resource identifier in Java (R.type.entry).
96message Type {
97  // The ID of the type. This may not be set if no ID was assigned.
98  TypeId type_id = 1;
99
100  // The name of the type. This corresponds to the 'type' part of a full resource name of the form
101  // package:type/entry. The set of legal type names is listed in Resource.cpp.
102  string name = 2;
103
104  // The entries defined for this type.
105  repeated Entry entry = 3;
106}
107
108// The Visibility of a symbol/entry (public, private, undefined).
109message Visibility {
110  // The visibility of the resource outside of its package.
111  enum Level {
112    // No visibility was explicitly specified. This is typically treated as private.
113    // The distinction is important when two separate R.java files are generated: a public and
114    // private one. An unknown visibility, in this case, would cause the resource to be omitted
115    // from either R.java.
116    UNKNOWN = 0;
117
118    // A resource was explicitly marked as private. This means the resource can not be accessed
119    // outside of its package unless the @*package:type/entry notation is used (the asterisk being
120    // the private accessor). If two R.java files are generated (private + public), the resource
121    // will only be emitted to the private R.java file.
122    PRIVATE = 1;
123
124    // A resource was explicitly marked as public. This means the resource can be accessed
125    // from any package, and is emitted into all R.java files, public and private.
126    PUBLIC = 2;
127  }
128
129  Level level = 1;
130
131  // The path at which this entry's visibility was defined (eg. public.xml).
132  Source source = 2;
133
134  // The comment associated with the <public> tag.
135  string comment = 3;
136}
137
138// Whether a resource comes from a compile-time overlay and is explicitly allowed to not overlay an
139// existing resource.
140message AllowNew {
141  // Where this was defined in source.
142  Source source = 1;
143
144  // Any comment associated with the declaration.
145  string comment = 2;
146}
147
148// Represents a set of overlayable resources.
149message Overlayable {
150  // The name of the <overlayable>.
151  string name = 1;
152
153  // The location of the <overlayable> declaration in the source.
154  Source source = 2;
155
156  // The component responsible for enabling and disabling overlays targeting this <overlayable>.
157  string actor = 3;
158}
159
160// Represents an overlayable <item> declaration within an <overlayable> tag.
161message OverlayableItem {
162  enum Policy {
163    NONE = 0;
164    PUBLIC = 1;
165    SYSTEM = 2;
166    VENDOR = 3;
167    PRODUCT = 4;
168    SIGNATURE = 5;
169    ODM = 6;
170    OEM = 7;
171  }
172
173  // The location of the <item> declaration in source.
174  Source source = 1;
175
176  // Any comment associated with the declaration.
177  string comment = 2;
178
179  // The policy defined by the enclosing <policy> tag of this <item>.
180  repeated Policy policy = 3;
181
182  // The index into overlayable list that points to the <overlayable> tag that contains
183  // this <item>.
184  uint32 overlayable_idx = 4;
185}
186
187// An entry ID in the range [0x0000, 0xffff].
188message EntryId {
189  uint32 id = 1;
190}
191
192// An entry declaration. An entry has a full resource ID that is the combination of package ID,
193// type ID, and its own entry ID. An entry on its own has no value, but values are defined for
194// various configurations/variants.
195message Entry {
196  // The ID of this entry. Together with the package ID and type ID, this forms a full resource ID
197  // of the form 0xPPTTEEEE, where PP is the package ID, TT is the type ID, and EEEE is the entry
198  // ID.
199  // This may not be set if no ID was assigned.
200  EntryId entry_id = 1;
201
202  // The name of this entry. This corresponds to the 'entry' part of a full resource name of the
203  // form package:type/entry.
204  string name = 2;
205
206  // The visibility of this entry (public, private, undefined).
207  Visibility visibility = 3;
208
209  // Whether this resource, when originating from a compile-time overlay, is allowed to NOT overlay
210  // any existing resources.
211  AllowNew allow_new = 4;
212
213  // Whether this resource can be overlaid by a runtime resource overlay (RRO).
214  OverlayableItem overlayable_item = 5;
215
216  // The set of values defined for this entry, each corresponding to a different
217  // configuration/variant.
218  repeated ConfigValue config_value = 6;
219}
220
221// A Configuration/Value pair.
222message ConfigValue {
223  Configuration config = 1;
224  Value value = 2;
225}
226
227// The generic meta-data for every value in a resource table.
228message Value {
229  // Where the value was defined.
230  Source source = 1;
231
232  // Any comment associated with the value.
233  string comment = 2;
234
235  // Whether the value can be overridden.
236  bool weak = 3;
237
238  // The value is either an Item or a CompoundValue.
239  oneof value {
240    Item item = 4;
241    CompoundValue compound_value = 5;
242  }
243}
244
245// An Item is an abstract type. It represents a value that can appear inline in many places, such
246// as XML attribute values or on the right hand side of style attribute definitions. The concrete
247// type is one of the types below. Only one can be set.
248message Item {
249  oneof value {
250    Reference ref = 1;
251    String str = 2;
252    RawString raw_str = 3;
253    StyledString styled_str = 4;
254    FileReference file = 5;
255    Id id = 6;
256    Primitive prim = 7;
257  }
258}
259
260// A CompoundValue is an abstract type. It represents a value that is a made of other values.
261// These can only usually appear as top-level resources. The concrete type is one of the types
262// below. Only one can be set.
263message CompoundValue {
264  oneof value {
265    Attribute attr = 1;
266    Style style = 2;
267    Styleable styleable = 3;
268    Array array = 4;
269    Plural plural = 5;
270  }
271}
272
273// A value that is a reference to another resource. This reference can be by name or resource ID.
274message Reference {
275  enum Type {
276    // A plain reference (@package:type/entry).
277    REFERENCE = 0;
278
279    // A reference to a theme attribute (?package:type/entry).
280    ATTRIBUTE = 1;
281  }
282
283  Type type = 1;
284
285  // The resource ID (0xPPTTEEEE) of the resource being referred. This is optional.
286  uint32 id = 2;
287
288  // The name of the resource being referred. This is optional if the resource ID is set.
289  string name = 3;
290
291  // Whether this reference is referencing a private resource (@*package:type/entry).
292  bool private = 4;
293}
294
295// A value that represents an ID. This is just a placeholder, as ID values are used to occupy a
296// resource ID (0xPPTTEEEE) as a unique identifier. Their value is unimportant.
297message Id {
298}
299
300// A value that is a string.
301message String {
302  string value = 1;
303}
304
305// A value that is a raw string, which is unescaped/uninterpreted. This is typically used to
306// represent the value of a style attribute before the attribute is compiled and the set of
307// allowed values is known.
308message RawString {
309  string value = 1;
310}
311
312// A string with styling information, like html tags that specify boldness, italics, etc.
313message StyledString {
314  // The raw text of the string.
315  string value = 1;
316
317  // A Span marks a region of the string text that is styled.
318  message Span {
319    // The name of the tag, and its attributes, encoded as follows:
320    // tag_name;attr1=value1;attr2=value2;[...]
321    string tag = 1;
322
323    // The first character position this span applies to, in UTF-16 offset.
324    uint32 first_char = 2;
325
326    // The last character position this span applies to, in UTF-16 offset.
327    uint32 last_char = 3;
328  }
329
330  repeated Span span = 2;
331}
332
333// A value that is a reference to an external entity, like an XML file or a PNG.
334message FileReference {
335  enum Type {
336    UNKNOWN = 0;
337    PNG = 1;
338    BINARY_XML = 2;
339    PROTO_XML = 3;
340  }
341
342  // Path to a file within the APK (typically res/type-config/entry.ext).
343  string path = 1;
344
345  // The type of file this path points to. For UAM bundle, this cannot be
346  // BINARY_XML.
347  Type type = 2;
348}
349
350// A value that represents a primitive data type (float, int, boolean, etc.).
351// Refer to Res_value in ResourceTypes.h for info on types and formatting
352message Primitive {
353  message NullType {
354  }
355  message EmptyType {
356  }
357  oneof oneof_value {
358    NullType null_value = 1;
359    EmptyType empty_value = 2;
360    float float_value = 3;
361    uint32 dimension_value = 13;
362    uint32 fraction_value = 14;
363    int32 int_decimal_value = 6;
364    uint32 int_hexadecimal_value = 7;
365    bool boolean_value = 8;
366    uint32 color_argb8_value = 9;
367    uint32 color_rgb8_value = 10;
368    uint32 color_argb4_value = 11;
369    uint32 color_rgb4_value = 12;
370    float dimension_value_deprecated = 4 [deprecated=true];
371    float fraction_value_deprecated = 5 [deprecated=true];
372  }
373}
374
375// A value that represents an XML attribute and what values it accepts.
376message Attribute {
377  // A Symbol used to represent an enum or a flag.
378  message Symbol {
379    // Where the enum/flag item was defined.
380    Source source = 1;
381
382    // Any comments associated with the enum or flag.
383    string comment = 2;
384
385    // The name of the enum/flag as a reference. Enums/flag items are generated as ID resource
386    // values.
387    Reference name = 3;
388
389    // The value of the enum/flag.
390    uint32 value = 4;
391  }
392
393  // Bitmask of formats allowed for an attribute.
394  enum FormatFlags {
395    NONE = 0x0;          // Proto3 requires a default of 0.
396    ANY = 0x0000ffff;    // Allows any type except ENUM and FLAGS.
397    REFERENCE = 0x01;    // Allows Reference values.
398    STRING = 0x02;       // Allows String/StyledString values.
399    INTEGER = 0x04;      // Allows any integer BinaryPrimitive values.
400    BOOLEAN = 0x08;      // Allows any boolean BinaryPrimitive values.
401    COLOR = 0x010;       // Allows any color BinaryPrimitive values.
402    FLOAT = 0x020;       // Allows any float BinaryPrimitive values.
403    DIMENSION = 0x040;   // Allows any dimension BinaryPrimitive values.
404    FRACTION = 0x080;    // Allows any fraction BinaryPrimitive values.
405    ENUM = 0x00010000;   // Allows enums that are defined in the Attribute's symbols.
406                         // ENUM and FLAGS cannot BOTH be set.
407    FLAGS = 0x00020000;  // Allows flags that are defined in the Attribute's symbols.
408                         // ENUM and FLAGS cannot BOTH be set.
409  }
410
411  // A bitmask of types that this XML attribute accepts. Corresponds to the flags in the
412  // enum FormatFlags.
413  uint32 format_flags = 1;
414
415  // The smallest integer allowed for this XML attribute. Only makes sense if the format includes
416  // FormatFlags::INTEGER.
417  int32 min_int = 2;
418
419  // The largest integer allowed for this XML attribute. Only makes sense if the format includes
420  // FormatFlags::INTEGER.
421  int32 max_int = 3;
422
423  // The set of enums/flags defined in this attribute. Only makes sense if the format includes
424  // either FormatFlags::ENUM or FormatFlags::FLAGS. Having both is an error.
425  repeated Symbol symbol = 4;
426}
427
428// A value that represents a style.
429message Style {
430  // An XML attribute/value pair defined in the style.
431  message Entry {
432    // Where the entry was defined.
433    Source source = 1;
434
435    // Any comments associated with the entry.
436    string comment = 2;
437
438    // A reference to the XML attribute.
439    Reference key = 3;
440
441    // The Item defined for this XML attribute.
442    Item item = 4;
443  }
444
445  // The optinal style from which this style inherits attributes.
446  Reference parent = 1;
447
448  // The source file information of the parent inheritance declaration.
449  Source parent_source = 2;
450
451  // The set of XML attribute/value pairs for this style.
452  repeated Entry entry = 3;
453}
454
455// A value that represents a <declare-styleable> XML resource. These are not real resources and
456// only end up as Java fields in the generated R.java. They do not end up in the binary ARSC file.
457message Styleable {
458  // An attribute defined for this styleable.
459  message Entry {
460    // Where the attribute was defined within the <declare-styleable> block.
461    Source source = 1;
462
463    // Any comments associated with the declaration.
464    string comment = 2;
465
466    // The reference to the attribute.
467    Reference attr = 3;
468  }
469
470  // The set of attribute declarations.
471  repeated Entry entry = 1;
472}
473
474// A value that represents an array of resource values.
475message Array {
476  // A single element of the array.
477  message Element {
478    // Where the element was defined.
479    Source source = 1;
480
481    // Any comments associated with the element.
482    string comment = 2;
483
484    // The value assigned to this element.
485    Item item = 3;
486  }
487
488  // The list of array elements.
489  repeated Element element = 1;
490}
491
492// A value that represents a string and its many variations based on plurality.
493message Plural {
494  // The arity of the plural.
495  enum Arity {
496    ZERO = 0;
497    ONE = 1;
498    TWO = 2;
499    FEW = 3;
500    MANY = 4;
501    OTHER = 5;
502  }
503
504  // The plural value for a given arity.
505  message Entry {
506    // Where the plural was defined.
507    Source source = 1;
508
509    // Any comments associated with the plural.
510    string comment = 2;
511
512    // The arity of the plural.
513    Arity arity = 3;
514
515    // The value assigned to this plural.
516    Item item = 4;
517  }
518
519  // The set of arity/plural mappings.
520  repeated Entry entry = 1;
521}
522
523// Defines an abstract XmlNode that must be either an XmlElement, or
524// a text node represented by a string.
525message XmlNode {
526  oneof node {
527    XmlElement element = 1;
528    string text = 2;
529  }
530
531  // Source line and column info.
532  SourcePosition source = 3;
533}
534
535// An <element> in an XML document.
536message XmlElement {
537  // Namespaces defined on this element.
538  repeated XmlNamespace namespace_declaration = 1;
539
540  // The namespace URI of this element.
541  string namespace_uri = 2;
542
543  // The name of this element.
544  string name = 3;
545
546  // The attributes of this element.
547  repeated XmlAttribute attribute = 4;
548
549  // The children of this element.
550  repeated XmlNode child = 5;
551}
552
553// A namespace declaration on an XmlElement (xmlns:android="http://...").
554message XmlNamespace {
555  string prefix = 1;
556  string uri = 2;
557
558  // Source line and column info.
559  SourcePosition source = 3;
560}
561
562// An attribute defined on an XmlElement (android:text="...").
563message XmlAttribute {
564  string namespace_uri = 1;
565  string name = 2;
566  string value = 3;
567
568  // Source line and column info.
569  SourcePosition source = 4;
570
571  // The optional resource ID (0xPPTTEEEE) of the attribute.
572  uint32 resource_id = 5;
573
574  // The optional interpreted/compiled version of the `value` string.
575  Item compiled_item = 6;
576}
577