1// Messages describing APK Set's table of contents (toc.pb entry).
2// Please be advised that the ultimate source is at
3// https://github.com/google/bundletool/tree/master/src/main/proto
4// so you have been warned.
5syntax = "proto3";
6
7package android.bundle;
8
9import "config.proto";
10import "targeting.proto";
11
12option go_package = "android_bundle_proto";
13option java_package = "com.android.bundle";
14
15// Describes the output of the "build-apks" command.
16message BuildApksResult {
17  // The package name of this app.
18  string package_name = 4;
19
20  // List of the created variants.
21  repeated Variant variant = 1;
22
23  // Metadata about BundleTool used to build the APKs.
24  Bundletool bundletool = 2;
25
26  // List of the created asset slices.
27  repeated AssetSliceSet asset_slice_set = 3;
28
29  // Information about local testing mode.
30  LocalTestingInfo local_testing_info = 5;
31}
32
33// Variant is a group of APKs that covers a part of the device configuration
34// space. APKs from multiple variants are never combined on one device.
35message Variant {
36  // Variant-level targeting.
37  // This targeting is fairly high-level and each APK has its own targeting as
38  // well.
39  VariantTargeting targeting = 1;
40
41  // Set of APKs, one set per module.
42  repeated ApkSet apk_set = 2;
43
44  // Number of the variant, starting at 0 (unless overridden).
45  // A device will receive APKs from the first variant that matches the device
46  // configuration, with higher variant numbers having priority over lower
47  // variant numbers.
48  uint32 variant_number = 3;
49}
50
51// Represents a module.
52// For pre-L devices multiple modules (possibly all) may be merged into one.
53message ApkSet {
54  ModuleMetadata module_metadata = 1;
55
56  // APKs.
57  repeated ApkDescription apk_description = 2;
58}
59
60message ModuleMetadata {
61  // Module name.
62  string name = 1;
63
64  // Indicates the delivery type (e.g. on-demand) of the module.
65  DeliveryType delivery_type = 6;
66
67  // Indicates whether this module is marked "instant".
68  bool is_instant = 3;
69
70  // Names of the modules that this module directly depends on.
71  // Each module implicitly depends on the base module.
72  repeated string dependencies = 4;
73
74  // The targeting that makes a conditional module installed.
75  // Relevant only for Split APKs.
76  ModuleTargeting targeting = 5;
77
78  // Deprecated. Please use delivery_type.
79  bool on_demand_deprecated = 2 [deprecated = true];
80}
81
82// Set of asset slices belonging to a single asset module.
83message AssetSliceSet {
84  // Module level metadata.
85  AssetModuleMetadata asset_module_metadata = 1;
86
87  // Asset slices.
88  repeated ApkDescription apk_description = 2;
89}
90
91message AssetModuleMetadata {
92  // Module name.
93  string name = 1;
94
95  // Indicates the delivery type for persistent install.
96  DeliveryType delivery_type = 4;
97
98  // Metadata for instant installs.
99  InstantMetadata instant_metadata = 3;
100
101  // Deprecated. Use delivery_type.
102  bool on_demand_deprecated = 2 [deprecated = true];
103}
104
105message InstantMetadata {
106  // Indicates whether this module is marked "instant".
107  bool is_instant = 1;
108
109  // Indicates the delivery type for instant install.
110  DeliveryType delivery_type = 3;
111
112  // Deprecated. Use delivery_type.
113  bool on_demand_deprecated = 2 [deprecated = true];
114}
115
116enum DeliveryType {
117  UNKNOWN_DELIVERY_TYPE = 0;
118  INSTALL_TIME = 1;
119  ON_DEMAND = 2;
120  FAST_FOLLOW = 3;
121}
122
123message ApkDescription {
124  ApkTargeting targeting = 1;
125
126  // Path to the APK file.
127  // BEGIN-INTERNAL
128  // The path may be a blobkey if the proto is not constructed by bundletool.
129  // END-INTERNAL
130  string path = 2;
131
132  oneof apk_metadata_oneof_value {
133    // Set only for Split APKs.
134    SplitApkMetadata split_apk_metadata = 3;
135    // Set only for standalone APKs.
136    StandaloneApkMetadata standalone_apk_metadata = 4;
137    // Set only for Instant split APKs.
138    SplitApkMetadata instant_apk_metadata = 5;
139    // Set only for system APKs.
140    SystemApkMetadata system_apk_metadata = 6;
141    // Set only for asset slices.
142    SplitApkMetadata asset_slice_metadata = 7;
143    // Set only for APEX APKs.
144    ApexApkMetadata apex_apk_metadata = 8;
145  }
146}
147
148// Holds data specific to Split APKs.
149message SplitApkMetadata {
150  string split_id = 1;
151
152  // Indicates whether this APK is the master split of the module.
153  bool is_master_split = 2;
154}
155
156// Holds data specific to Standalone APKs.
157message StandaloneApkMetadata {
158  // Names of the modules fused in this standalone APK.
159  repeated string fused_module_name = 1;
160
161  reserved 2;
162}
163
164// Holds data specific to system APKs.
165message SystemApkMetadata {
166  // Names of the modules fused in this system APK.
167  repeated string fused_module_name = 1;
168  enum SystemApkType {
169    UNSPECIFIED_VALUE = 0;
170    // Uncompressed APK for system image.
171    SYSTEM = 1;
172    // Stub APK for compressed APK in the system image
173    // (contains only android manifest).
174    SYSTEM_STUB = 2;
175    // Compressed APK for system image.
176    SYSTEM_COMPRESSED = 3;
177  }
178  // Indicates whether the APK is uncompressed system APK, stub APK or
179  // compressed system APK.
180  SystemApkType system_apk_type = 2;
181}
182
183// Holds data specific to APEX APKs.
184message ApexApkMetadata {
185  // Configuration for processing of APKs embedded in an APEX image.
186  repeated ApexEmbeddedApkConfig apex_embedded_apk_config = 1;
187}
188
189message LocalTestingInfo {
190  // Indicates if the bundle is built in local testing mode.
191  bool enabled = 1;
192  // The local testing path, as specified in the base manifest.
193  // This refers to the relative path on the external directory of the app where
194  // APKs will be pushed for local testing.
195  // Set only if local testing is enabled.
196  string local_testing_path = 2;
197}
198