| // Messages describing APK Set's table of contents (toc.pb entry). | 
 | // Please be advised that the ultimate source is at | 
 | // https://github.com/google/bundletool/tree/master/src/main/proto | 
 | // so you have been warned. | 
 | syntax = "proto3"; | 
 |  | 
 | package android.bundle; | 
 |  | 
 | option go_package = "android/soong/cmd/extract_apks/bundle_proto"; | 
 | option java_package = "com.android.bundle"; | 
 |  | 
 | message BundleConfig { | 
 |   Bundletool bundletool = 1; | 
 |   Optimizations optimizations = 2; | 
 |   Compression compression = 3; | 
 |   // Resources to be always kept in the master split. | 
 |   MasterResources master_resources = 4; | 
 |   ApexConfig apex_config = 5; | 
 |   // APKs to be signed with the same key as generated APKs. | 
 |   repeated UnsignedEmbeddedApkConfig unsigned_embedded_apk_config = 6; | 
 |   AssetModulesConfig asset_modules_config = 7; | 
 |  | 
 |   enum BundleType { | 
 |     REGULAR = 0; | 
 |     APEX = 1; | 
 |     ASSET_ONLY = 2; | 
 |   } | 
 |   BundleType type = 8; | 
 |  | 
 |   // Configuration for locales. | 
 |   Locales locales = 9; | 
 | } | 
 |  | 
 | message Bundletool { | 
 |   reserved 1; | 
 |   // Version of BundleTool used to build the Bundle. | 
 |   string version = 2; | 
 | } | 
 |  | 
 | message Compression { | 
 |   // Glob matching the list of files to leave uncompressed in the APKs. | 
 |   // The matching is done against the path of files in the APK, thus excluding | 
 |   // the name of the modules, and using forward slash ("/") as a name separator. | 
 |   // Examples: "res/raw/**", "assets/**/*.uncompressed", etc. | 
 |   repeated string uncompressed_glob = 1; | 
 |  | 
 |   enum AssetModuleCompression { | 
 |     UNSPECIFIED = 0; | 
 |     // Assets are left uncompressed in the generated asset module. | 
 |     UNCOMPRESSED = 1; | 
 |     // Assets are compressed in the generated asset module. | 
 |     // This option can be overridden at a finer granularity by specifying | 
 |     // files or folders to keep uncompressed in `uncompressed_glob`. | 
 |     // This option should only be used if the app is able to handle compressed | 
 |     // asset module content at runtime (some runtime APIs may misbehave). | 
 |     COMPRESSED = 2; | 
 |   } | 
 |  | 
 |   // Default compression strategy for install-time asset modules. | 
 |   // If the compression strategy indicates to compress a file and the same file | 
 |   // matches one of the `uncompressed_glob` values, the `uncompressed_glob` | 
 |   // takes precedence (the file is left uncompressed in the generated APK). | 
 |   // | 
 |   // If unspecified, asset module content is left uncompressed in the | 
 |   // generated asset modules. | 
 |   // | 
 |   // Note: this flag only configures the compression strategy for install-time | 
 |   // asset modules; the content of on-demand and fast-follow asset modules is | 
 |   // always kept uncompressed. | 
 |   AssetModuleCompression install_time_asset_module_default_compression = 2; | 
 |  | 
 |   enum ApkCompressionAlgorithm { | 
 |     // Default in the current version of bundletool is zlib deflate algorithm | 
 |     // with compression level 9 for the application's resources and compression | 
 |     // level 6 for other entries. | 
 |     // | 
 |     // This is a good trade-off between size of final APK and size of patches | 
 |     // which are used to update the application from previous to next version. | 
 |     DEFAULT_APK_COMPRESSION_ALGORITHM = 0; | 
 |  | 
 |     // 7zip implementation of deflate algorithm which gives smaller APK size | 
 |     // but size of patches required to update the application are larger. | 
 |     P7ZIP = 1; | 
 |   } | 
 |  | 
 |   // Compression algorithm which is used to compress entries in final APKs. | 
 |   ApkCompressionAlgorithm apk_compression_algorithm = 3; | 
 | } | 
 |  | 
 | // Resources to keep in the master split. | 
 | message MasterResources { | 
 |   // Resource IDs to be kept in master split. | 
 |   repeated int32 resource_ids = 1; | 
 |   // Resource names to be kept in master split. | 
 |   repeated string resource_names = 2; | 
 | } | 
 |  | 
 | message Optimizations { | 
 |   SplitsConfig splits_config = 1; | 
 |   // This is for uncompressing native libraries on M+ devices (L+ devices on | 
 |   // instant apps). | 
 |   UncompressNativeLibraries uncompress_native_libraries = 2; | 
 |   // This is for uncompressing dex files. | 
 |   UncompressDexFiles uncompress_dex_files = 3; | 
 |   // Configuration for the generation of standalone APKs. | 
 |   // If no StandaloneConfig is set, the configuration is inherited from | 
 |   // splits_config. | 
 |   StandaloneConfig standalone_config = 4; | 
 |  | 
 |   // Optimizations that are applied to resources. | 
 |   ResourceOptimizations resource_optimizations = 5; | 
 |  | 
 |   // Configuration for archiving the app. | 
 |   StoreArchive store_archive = 6; | 
 | } | 
 |  | 
 | message ResourceOptimizations { | 
 |   // Whether to use sparse encoding for resource tables. | 
 |   // Resources in sparse resource table are accessed using a binary search tree. | 
 |   // This decreases APK size at the cost of resource retrieval performance. | 
 |   SparseEncoding sparse_encoding = 1; | 
 |  | 
 |   enum SparseEncoding { | 
 |     // Previously 'ENFORCED'. This option is deprecated because of issues found | 
 |     // in Android O up to Android Sv2 and causes segfaults in | 
 |     // Resources#getIdentifier. | 
 |     reserved 1; | 
 |     reserved "ENFORCED"; | 
 |  | 
 |     // Disables sparse encoding. | 
 |     UNSPECIFIED = 0; | 
 |     // Generates special APKs for Android SDK +32 with sparse resource tables. | 
 |     // Devices with Android SDK below 32 will still receive APKs with regular | 
 |     // resource tables. | 
 |     VARIANT_FOR_SDK_32 = 2; | 
 |   } | 
 | } | 
 |  | 
 | message UncompressNativeLibraries { | 
 |   bool enabled = 1; | 
 | } | 
 |  | 
 | message UncompressDexFiles { | 
 |   //  A new variant with uncompressed dex will be generated. The sdk targeting | 
 |   //  of the variant is determined by 'uncompressed_dex_target_sdk'. | 
 |   bool enabled = 1; | 
 |  | 
 |   //  If 'enabled' field is set, this will determine the sdk targeting of the | 
 |   //  generated variant. | 
 |   UncompressedDexTargetSdk uncompressed_dex_target_sdk = 2; | 
 |  | 
 |   enum UncompressedDexTargetSdk { | 
 |     // Q+ variant will be generated. | 
 |     UNSPECIFIED = 0; | 
 |     // S+ variant will be generated. | 
 |     SDK_31 = 1; | 
 |   } | 
 | } | 
 |  | 
 | message StoreArchive { | 
 |   // Archive is an app state that allows an official app store to reclaim device | 
 |   // storage and disable app functionality temporarily until the user interacts | 
 |   // with the app again. Upon interaction the latest available version of the | 
 |   // app will be restored while leaving user data unaffected. | 
 |   // Enabled by default. | 
 |   bool enabled = 1; | 
 | } | 
 |  | 
 | message Locales { | 
 |   // Instructs bundletool to generate locale config and inject it into | 
 |   // AndroidManifest.xml. A locale is marked as supported by the application if | 
 |   // there is at least one resource value in this locale. Be very careful with | 
 |   // this setting because if some of your libraries expose resources in some | 
 |   // locales which are not actually supported by your application it will mark | 
 |   // this locale as supported. Disabled by default. | 
 |   bool inject_locale_config = 1; | 
 | } | 
 |  | 
 | // Optimization configuration used to generate Split APKs. | 
 | message SplitsConfig { | 
 |   repeated SplitDimension split_dimension = 1; | 
 | } | 
 |  | 
 | // Optimization configuration used to generate Standalone APKs. | 
 | message StandaloneConfig { | 
 |   // Device targeting dimensions to shard. | 
 |   repeated SplitDimension split_dimension = 1; | 
 |   // Whether 64 bit libraries should be stripped from Standalone APKs. | 
 |   bool strip_64_bit_libraries = 2; | 
 |   // Dex merging strategy that should be applied to produce Standalone APKs. | 
 |   DexMergingStrategy dex_merging_strategy = 3; | 
 |  | 
 |   enum DexMergingStrategy { | 
 |     // Strategy that does dex merging for applications that have minimum SDK | 
 |     // below 21 to ensure dex files from all modules are merged into one or | 
 |     // mainDexList is applied when merging into one dex is not possible. For | 
 |     // applications with minSdk >= 21 dex files from all modules are copied into | 
 |     // standalone APK as is because Android supports multiple dex files natively | 
 |     // starting from Android 5.0. | 
 |     MERGE_IF_NEEDED = 0; | 
 |     // Requires to copy dex files from all modules into standalone APK as is. | 
 |     // If an application supports SDKs below 21 this strategy puts | 
 |     // responsibility of providing dex files compatible with legacy multidex on | 
 |     // application developers. | 
 |     NEVER_MERGE = 1; | 
 |   } | 
 | } | 
 |  | 
 | // BEGIN-INTERNAL | 
 | // LINT.IfChange | 
 | // END-INTERNAL | 
 | message SplitDimension { | 
 |   enum Value { | 
 |     UNSPECIFIED_VALUE = 0; | 
 |     ABI = 1; | 
 |     SCREEN_DENSITY = 2; | 
 |     LANGUAGE = 3; | 
 |     TEXTURE_COMPRESSION_FORMAT = 4; | 
 |     // BEGIN-INTERNAL | 
 |     GRAPHICS_API = 5 [deprecated = true]; | 
 |     // END-INTERNAL | 
 |     DEVICE_TIER = 6; | 
 |   } | 
 |   Value value = 1; | 
 |  | 
 |   // If set to 'true', indicates that APKs should *not* be split by this | 
 |   // dimension. | 
 |   bool negate = 2; | 
 |  | 
 |   // Optional transformation to be applied to asset directories where | 
 |   // the targeting is encoded in the directory name (e.g: assets/foo#tcf_etc1) | 
 |   SuffixStripping suffix_stripping = 3; | 
 | } | 
 | // BEGIN-INTERNAL | 
 | // LINT.ThenChange(//depot/google3/wireless/android/vending/developer/proto/storage/app/apk_bundle.proto) | 
 | // END-INTERNAL | 
 |  | 
 | message SuffixStripping { | 
 |   // If set to 'true', indicates that the targeting suffix should be removed | 
 |   // from assets paths for this dimension when splits (e.g: "asset packs") or | 
 |   // standalone/universal APKs are generated. | 
 |   // This only applies to assets. | 
 |   // For example a folder with path "assets/level1_textures#tcf_etc1" | 
 |   // would be outputted to "assets/level1_textures". File contents are | 
 |   // unchanged. | 
 |   bool enabled = 1; | 
 |  | 
 |   // The default suffix to be used for the cases where separate slices can't | 
 |   // be generated for this dimension - typically for standalone or universal | 
 |   // APKs. | 
 |   // This default suffix defines the directories to retain. The others are | 
 |   // discarded: standalone/universal APKs will contain only directories | 
 |   // targeted at this value for the dimension. | 
 |   // | 
 |   // If not set or empty, the fallback directory in each directory group will be | 
 |   // used (for example, if both "assets/level1_textures#tcf_etc1" and | 
 |   // "assets/level1_textures" are present and the default suffix is empty, | 
 |   // then only "assets/level1_textures" will be used). | 
 |   string default_suffix = 2; | 
 | } | 
 |  | 
 | // Configuration for processing APEX bundles. | 
 | // https://source.android.com/devices/tech/ota/apex | 
 | message ApexConfig { | 
 |   // Configuration for processing of APKs embedded in an APEX image. | 
 |   repeated ApexEmbeddedApkConfig apex_embedded_apk_config = 1; | 
 |  | 
 |   // Explicit list of supported ABIs. | 
 |   // Default: See ApexBundleValidator.REQUIRED_ONE_OF_ABI_SETS | 
 |   repeated SupportedAbiSet supported_abi_set = 2; | 
 | } | 
 |  | 
 | // Represents a set of ABIs which must be supported by a single APEX image. | 
 | message SupportedAbiSet { | 
 |   repeated string abi = 1; | 
 | } | 
 |  | 
 | message ApexEmbeddedApkConfig { | 
 |   // Android package name of the APK. | 
 |   string package_name = 1; | 
 |  | 
 |   // Path to the APK within the APEX system image. | 
 |   string path = 2; | 
 | } | 
 |  | 
 | message UnsignedEmbeddedApkConfig { | 
 |   // Path to the APK inside the module (e.g. if the path inside the bundle | 
 |   // is split/assets/example.apk, this will be assets/example.apk). | 
 |   string path = 1; | 
 | } | 
 |  | 
 | message AssetModulesConfig { | 
 |   // App versionCodes that will be updated with these asset modules. | 
 |   // Only relevant for asset-only bundles. | 
 |   repeated int64 app_version = 1; | 
 |  | 
 |   // Version tag for the asset upload. | 
 |   // Only relevant for asset-only bundles. | 
 |   string asset_version_tag = 2; | 
 | } |