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
9option go_package = "android_bundle_proto";
10option java_package = "com.android.bundle";
11
12message BundleConfig {
13  Bundletool bundletool = 1;
14  Optimizations optimizations = 2;
15  Compression compression = 3;
16  // Resources to be always kept in the master split.
17  MasterResources master_resources = 4;
18  ApexConfig apex_config = 5;
19  // APKs to be signed with the same key as generated APKs.
20  repeated UnsignedEmbeddedApkConfig unsigned_embedded_apk_config = 6;
21  AssetModulesConfig asset_modules_config = 7;
22
23  enum BundleType {
24    REGULAR = 0;
25    APEX = 1;
26    ASSET_ONLY = 2;
27  }
28  BundleType type = 8;
29}
30
31message Bundletool {
32  reserved 1;
33  // Version of BundleTool used to build the Bundle.
34  string version = 2;
35}
36
37message Compression {
38  // Glob matching the list of files to leave uncompressed in the APKs.
39  // The matching is done against the path of files in the APK, thus excluding
40  // the name of the modules, and using forward slash ("/") as a name separator.
41  // Examples: "res/raw/**", "assets/**/*.uncompressed", etc.
42  repeated string uncompressed_glob = 1;
43}
44
45// Resources to keep in the master split.
46message MasterResources {
47  // Resource IDs to be kept in master split.
48  repeated int32 resource_ids = 1;
49  // Resource names to be kept in master split.
50  repeated string resource_names = 2;
51}
52
53message Optimizations {
54  SplitsConfig splits_config = 1;
55  // This is for uncompressing native libraries on M+ devices (L+ devices on
56  // instant apps).
57  UncompressNativeLibraries uncompress_native_libraries = 2;
58  // This is for uncompressing dex files on P+ devices.
59  UncompressDexFiles uncompress_dex_files = 3;
60  // Configuration for the generation of standalone APKs.
61  // If no StandaloneConfig is set, the configuration is inherited from
62  // splits_config.
63  StandaloneConfig standalone_config = 4;
64}
65
66message UncompressNativeLibraries {
67  bool enabled = 1;
68}
69
70message UncompressDexFiles {
71  bool enabled = 1;
72}
73
74// Optimization configuration used to generate Split APKs.
75message SplitsConfig {
76  repeated SplitDimension split_dimension = 1;
77}
78
79// Optimization configuration used to generate Standalone APKs.
80message StandaloneConfig {
81  // Device targeting dimensions to shard.
82  repeated SplitDimension split_dimension = 1;
83  // Whether 64 bit libraries should be stripped from Standalone APKs.
84  bool strip_64_bit_libraries = 2;
85}
86
87message SplitDimension {
88  enum Value {
89    UNSPECIFIED_VALUE = 0;
90    ABI = 1;
91    SCREEN_DENSITY = 2;
92    LANGUAGE = 3;
93    TEXTURE_COMPRESSION_FORMAT = 4;
94    // BEGIN-INTERNAL
95    GRAPHICS_API = 5;
96    // END-INTERNAL
97  }
98  Value value = 1;
99
100  // If set to 'true', indicates that APKs should *not* be split by this
101  // dimension.
102  bool negate = 2;
103
104  // Optional transformation to be applied to asset directories where
105  // the targeting is encoded in the directory name (e.g: assets/foo#tcf_etc1)
106  SuffixStripping suffix_stripping = 3;
107}
108
109message SuffixStripping {
110  // If set to 'true', indicates that the targeting suffix should be removed
111  // from assets paths for this dimension when splits (or asset slices) are
112  // generated.
113  // This only applies to assets.
114  // For example a folder with path "assets/level1_textures#tcf_etc1"
115  // would be outputted to "assets/level1_textures". File contents are
116  // unchanged.
117  bool enabled = 1;
118
119  // The default suffix to be used for the cases where separate slices can't
120  // be generated for this dimension. In the case of standalone/universal APKs
121  // generation, stripping the suffix can lead to file name collisions. This
122  // default suffix defines the directories to retain. The others are
123  // discarded: standalone/universal APKs will contain only directories
124  // targeted at this value for the dimension.
125  //
126  // If not set or empty, the fallback directory in each directory group will be
127  // used (for example, if both "assets/level1_textures#tcf_etc1" and
128  // "assets/level1_textures" are present and the default suffix is empty,
129  // then only "assets/level1_textures" will be used).
130  string default_suffix = 2;
131}
132
133// Configuration for processing APEX bundles.
134// https://source.android.com/devices/tech/ota/apex
135message ApexConfig {
136  // Configuration for processing of APKs embedded in an APEX image.
137  repeated ApexEmbeddedApkConfig apex_embedded_apk_config = 1;
138}
139
140message ApexEmbeddedApkConfig {
141  // Android package name of the APK.
142  string package_name = 1;
143
144  // Path to the APK within the APEX system image.
145  string path = 2;
146}
147
148message UnsignedEmbeddedApkConfig {
149  // Path to the APK inside the module (e.g. if the path inside the bundle
150  // is split/assets/example.apk, this will be assets/example.apk).
151  string path = 1;
152}
153
154message AssetModulesConfig {
155  // App versionCodes that will be updated with these asset modules.
156  // Only relevant for asset-only bundles.
157  repeated int64 app_version = 1;
158
159  // Version tag for the asset upload.
160  // Only relevant for asset-only bundles.
161  string asset_version_tag = 2;
162}
163