Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 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. |
| 5 | syntax = "proto3"; |
| 6 | |
| 7 | package android.bundle; |
| 8 | |
Dan Willemsen | 4591b64 | 2021-05-24 14:24:12 -0700 | [diff] [blame] | 9 | option go_package = "android/soong/cmd/extract_apks/bundle_proto"; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 10 | option java_package = "com.android.bundle"; |
| 11 | |
| 12 | message 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; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 29 | |
| 30 | // Configuration for locales. |
| 31 | Locales locales = 9; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 32 | } |
| 33 | |
| 34 | message Bundletool { |
| 35 | reserved 1; |
| 36 | // Version of BundleTool used to build the Bundle. |
| 37 | string version = 2; |
| 38 | } |
| 39 | |
| 40 | message Compression { |
| 41 | // Glob matching the list of files to leave uncompressed in the APKs. |
| 42 | // The matching is done against the path of files in the APK, thus excluding |
| 43 | // the name of the modules, and using forward slash ("/") as a name separator. |
| 44 | // Examples: "res/raw/**", "assets/**/*.uncompressed", etc. |
| 45 | repeated string uncompressed_glob = 1; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 46 | |
| 47 | enum AssetModuleCompression { |
| 48 | UNSPECIFIED = 0; |
| 49 | // Assets are left uncompressed in the generated asset module. |
| 50 | UNCOMPRESSED = 1; |
| 51 | // Assets are compressed in the generated asset module. |
| 52 | // This option can be overridden at a finer granularity by specifying |
| 53 | // files or folders to keep uncompressed in `uncompressed_glob`. |
| 54 | // This option should only be used if the app is able to handle compressed |
| 55 | // asset module content at runtime (some runtime APIs may misbehave). |
| 56 | COMPRESSED = 2; |
| 57 | } |
| 58 | |
| 59 | // Default compression strategy for install-time asset modules. |
| 60 | // If the compression strategy indicates to compress a file and the same file |
| 61 | // matches one of the `uncompressed_glob` values, the `uncompressed_glob` |
| 62 | // takes precedence (the file is left uncompressed in the generated APK). |
| 63 | // |
| 64 | // If unspecified, asset module content is left uncompressed in the |
| 65 | // generated asset modules. |
| 66 | // |
| 67 | // Note: this flag only configures the compression strategy for install-time |
| 68 | // asset modules; the content of on-demand and fast-follow asset modules is |
| 69 | // always kept uncompressed. |
| 70 | AssetModuleCompression install_time_asset_module_default_compression = 2; |
| 71 | |
| 72 | enum ApkCompressionAlgorithm { |
| 73 | // Default in the current version of bundletool is zlib deflate algorithm |
| 74 | // with compression level 9 for the application's resources and compression |
| 75 | // level 6 for other entries. |
| 76 | // |
| 77 | // This is a good trade-off between size of final APK and size of patches |
| 78 | // which are used to update the application from previous to next version. |
| 79 | DEFAULT_APK_COMPRESSION_ALGORITHM = 0; |
| 80 | |
| 81 | // 7zip implementation of deflate algorithm which gives smaller APK size |
| 82 | // but size of patches required to update the application are larger. |
| 83 | P7ZIP = 1; |
| 84 | } |
| 85 | |
| 86 | // Compression algorithm which is used to compress entries in final APKs. |
| 87 | ApkCompressionAlgorithm apk_compression_algorithm = 3; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 88 | } |
| 89 | |
| 90 | // Resources to keep in the master split. |
| 91 | message MasterResources { |
| 92 | // Resource IDs to be kept in master split. |
| 93 | repeated int32 resource_ids = 1; |
| 94 | // Resource names to be kept in master split. |
| 95 | repeated string resource_names = 2; |
| 96 | } |
| 97 | |
| 98 | message Optimizations { |
| 99 | SplitsConfig splits_config = 1; |
| 100 | // This is for uncompressing native libraries on M+ devices (L+ devices on |
| 101 | // instant apps). |
| 102 | UncompressNativeLibraries uncompress_native_libraries = 2; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 103 | // This is for uncompressing dex files. |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 104 | UncompressDexFiles uncompress_dex_files = 3; |
| 105 | // Configuration for the generation of standalone APKs. |
| 106 | // If no StandaloneConfig is set, the configuration is inherited from |
| 107 | // splits_config. |
| 108 | StandaloneConfig standalone_config = 4; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 109 | |
| 110 | // Optimizations that are applied to resources. |
| 111 | ResourceOptimizations resource_optimizations = 5; |
| 112 | |
| 113 | // Configuration for archiving the app. |
| 114 | StoreArchive store_archive = 6; |
| 115 | } |
| 116 | |
| 117 | message ResourceOptimizations { |
| 118 | // Whether to use sparse encoding for resource tables. |
| 119 | // Resources in sparse resource table are accessed using a binary search tree. |
| 120 | // This decreases APK size at the cost of resource retrieval performance. |
| 121 | SparseEncoding sparse_encoding = 1; |
| 122 | |
| 123 | enum SparseEncoding { |
| 124 | // Previously 'ENFORCED'. This option is deprecated because of issues found |
| 125 | // in Android O up to Android Sv2 and causes segfaults in |
| 126 | // Resources#getIdentifier. |
| 127 | reserved 1; |
| 128 | reserved "ENFORCED"; |
| 129 | |
| 130 | // Disables sparse encoding. |
| 131 | UNSPECIFIED = 0; |
| 132 | // Generates special APKs for Android SDK +32 with sparse resource tables. |
| 133 | // Devices with Android SDK below 32 will still receive APKs with regular |
| 134 | // resource tables. |
| 135 | VARIANT_FOR_SDK_32 = 2; |
| 136 | } |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 137 | } |
| 138 | |
| 139 | message UncompressNativeLibraries { |
| 140 | bool enabled = 1; |
| 141 | } |
| 142 | |
| 143 | message UncompressDexFiles { |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 144 | // A new variant with uncompressed dex will be generated. The sdk targeting |
| 145 | // of the variant is determined by 'uncompressed_dex_target_sdk'. |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 146 | bool enabled = 1; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 147 | |
| 148 | // If 'enabled' field is set, this will determine the sdk targeting of the |
| 149 | // generated variant. |
| 150 | UncompressedDexTargetSdk uncompressed_dex_target_sdk = 2; |
| 151 | |
| 152 | enum UncompressedDexTargetSdk { |
| 153 | // Q+ variant will be generated. |
| 154 | UNSPECIFIED = 0; |
| 155 | // S+ variant will be generated. |
| 156 | SDK_31 = 1; |
| 157 | } |
| 158 | } |
| 159 | |
| 160 | message StoreArchive { |
| 161 | // Archive is an app state that allows an official app store to reclaim device |
| 162 | // storage and disable app functionality temporarily until the user interacts |
| 163 | // with the app again. Upon interaction the latest available version of the |
| 164 | // app will be restored while leaving user data unaffected. |
| 165 | // Enabled by default. |
| 166 | bool enabled = 1; |
| 167 | } |
| 168 | |
| 169 | message Locales { |
| 170 | // Instructs bundletool to generate locale config and inject it into |
| 171 | // AndroidManifest.xml. A locale is marked as supported by the application if |
| 172 | // there is at least one resource value in this locale. Be very careful with |
| 173 | // this setting because if some of your libraries expose resources in some |
| 174 | // locales which are not actually supported by your application it will mark |
| 175 | // this locale as supported. Disabled by default. |
| 176 | bool inject_locale_config = 1; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 177 | } |
| 178 | |
| 179 | // Optimization configuration used to generate Split APKs. |
| 180 | message SplitsConfig { |
| 181 | repeated SplitDimension split_dimension = 1; |
| 182 | } |
| 183 | |
| 184 | // Optimization configuration used to generate Standalone APKs. |
| 185 | message StandaloneConfig { |
| 186 | // Device targeting dimensions to shard. |
| 187 | repeated SplitDimension split_dimension = 1; |
| 188 | // Whether 64 bit libraries should be stripped from Standalone APKs. |
| 189 | bool strip_64_bit_libraries = 2; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 190 | // Dex merging strategy that should be applied to produce Standalone APKs. |
| 191 | DexMergingStrategy dex_merging_strategy = 3; |
| 192 | |
| 193 | enum DexMergingStrategy { |
| 194 | // Strategy that does dex merging for applications that have minimum SDK |
| 195 | // below 21 to ensure dex files from all modules are merged into one or |
| 196 | // mainDexList is applied when merging into one dex is not possible. For |
| 197 | // applications with minSdk >= 21 dex files from all modules are copied into |
| 198 | // standalone APK as is because Android supports multiple dex files natively |
| 199 | // starting from Android 5.0. |
| 200 | MERGE_IF_NEEDED = 0; |
| 201 | // Requires to copy dex files from all modules into standalone APK as is. |
| 202 | // If an application supports SDKs below 21 this strategy puts |
| 203 | // responsibility of providing dex files compatible with legacy multidex on |
| 204 | // application developers. |
| 205 | NEVER_MERGE = 1; |
| 206 | } |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 207 | } |
| 208 | |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 209 | // BEGIN-INTERNAL |
| 210 | // LINT.IfChange |
| 211 | // END-INTERNAL |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 212 | message SplitDimension { |
| 213 | enum Value { |
| 214 | UNSPECIFIED_VALUE = 0; |
| 215 | ABI = 1; |
| 216 | SCREEN_DENSITY = 2; |
| 217 | LANGUAGE = 3; |
| 218 | TEXTURE_COMPRESSION_FORMAT = 4; |
| 219 | // BEGIN-INTERNAL |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 220 | GRAPHICS_API = 5 [deprecated = true]; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 221 | // END-INTERNAL |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 222 | DEVICE_TIER = 6; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 223 | } |
| 224 | Value value = 1; |
| 225 | |
| 226 | // If set to 'true', indicates that APKs should *not* be split by this |
| 227 | // dimension. |
| 228 | bool negate = 2; |
| 229 | |
| 230 | // Optional transformation to be applied to asset directories where |
| 231 | // the targeting is encoded in the directory name (e.g: assets/foo#tcf_etc1) |
| 232 | SuffixStripping suffix_stripping = 3; |
| 233 | } |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 234 | // BEGIN-INTERNAL |
| 235 | // LINT.ThenChange(//depot/google3/wireless/android/vending/developer/proto/storage/app/apk_bundle.proto) |
| 236 | // END-INTERNAL |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 237 | |
| 238 | message SuffixStripping { |
| 239 | // If set to 'true', indicates that the targeting suffix should be removed |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 240 | // from assets paths for this dimension when splits (e.g: "asset packs") or |
| 241 | // standalone/universal APKs are generated. |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 242 | // This only applies to assets. |
| 243 | // For example a folder with path "assets/level1_textures#tcf_etc1" |
| 244 | // would be outputted to "assets/level1_textures". File contents are |
| 245 | // unchanged. |
| 246 | bool enabled = 1; |
| 247 | |
| 248 | // The default suffix to be used for the cases where separate slices can't |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 249 | // be generated for this dimension - typically for standalone or universal |
| 250 | // APKs. |
| 251 | // This default suffix defines the directories to retain. The others are |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 252 | // discarded: standalone/universal APKs will contain only directories |
| 253 | // targeted at this value for the dimension. |
| 254 | // |
| 255 | // If not set or empty, the fallback directory in each directory group will be |
| 256 | // used (for example, if both "assets/level1_textures#tcf_etc1" and |
| 257 | // "assets/level1_textures" are present and the default suffix is empty, |
| 258 | // then only "assets/level1_textures" will be used). |
| 259 | string default_suffix = 2; |
| 260 | } |
| 261 | |
| 262 | // Configuration for processing APEX bundles. |
| 263 | // https://source.android.com/devices/tech/ota/apex |
| 264 | message ApexConfig { |
| 265 | // Configuration for processing of APKs embedded in an APEX image. |
| 266 | repeated ApexEmbeddedApkConfig apex_embedded_apk_config = 1; |
Dennis Shen | ff34e29 | 2022-10-17 19:21:55 +0000 | [diff] [blame] | 267 | |
| 268 | // Explicit list of supported ABIs. |
| 269 | // Default: See ApexBundleValidator.REQUIRED_ONE_OF_ABI_SETS |
| 270 | repeated SupportedAbiSet supported_abi_set = 2; |
| 271 | } |
| 272 | |
| 273 | // Represents a set of ABIs which must be supported by a single APEX image. |
| 274 | message SupportedAbiSet { |
| 275 | repeated string abi = 1; |
Sasha Smundak | 7a894a6 | 2020-05-06 21:23:08 -0700 | [diff] [blame] | 276 | } |
| 277 | |
| 278 | message ApexEmbeddedApkConfig { |
| 279 | // Android package name of the APK. |
| 280 | string package_name = 1; |
| 281 | |
| 282 | // Path to the APK within the APEX system image. |
| 283 | string path = 2; |
| 284 | } |
| 285 | |
| 286 | message UnsignedEmbeddedApkConfig { |
| 287 | // Path to the APK inside the module (e.g. if the path inside the bundle |
| 288 | // is split/assets/example.apk, this will be assets/example.apk). |
| 289 | string path = 1; |
| 290 | } |
| 291 | |
| 292 | message AssetModulesConfig { |
| 293 | // App versionCodes that will be updated with these asset modules. |
| 294 | // Only relevant for asset-only bundles. |
| 295 | repeated int64 app_version = 1; |
| 296 | |
| 297 | // Version tag for the asset upload. |
| 298 | // Only relevant for asset-only bundles. |
| 299 | string asset_version_tag = 2; |
| 300 | } |