syntax = "proto3"; package android.bundle; import "google/protobuf/wrappers.proto"; option java_package = "com.android.bundle"; // Targeting on the level of variants. message VariantTargeting { SdkVersionTargeting sdk_version_targeting = 1; AbiTargeting abi_targeting = 2; ScreenDensityTargeting screen_density_targeting = 3; MultiAbiTargeting multi_abi_targeting = 4; TextureCompressionFormatTargeting texture_compression_format_targeting = 5; SdkRuntimeTargeting sdk_runtime_targeting = 6; } // Targeting on the level of individual APKs. message ApkTargeting { AbiTargeting abi_targeting = 1; reserved 2; // was GraphicsApiTargeting LanguageTargeting language_targeting = 3; ScreenDensityTargeting screen_density_targeting = 4; SdkVersionTargeting sdk_version_targeting = 5; TextureCompressionFormatTargeting texture_compression_format_targeting = 6; MultiAbiTargeting multi_abi_targeting = 7; SanitizerTargeting sanitizer_targeting = 8; DeviceTierTargeting device_tier_targeting = 9 [deprecated = true]; CountrySetTargeting country_set_targeting = 10 [deprecated = true]; DeviceGroupTargeting device_group_targeting = 11; } // Targeting on the module level. // Used for conditional feature modules. // The semantic of the targeting is the "AND" rule on all immediate values. message ModuleTargeting { SdkVersionTargeting sdk_version_targeting = 1; repeated DeviceFeatureTargeting device_feature_targeting = 2; UserCountriesTargeting user_countries_targeting = 3; DeviceGroupModuleTargeting device_group_targeting = 5; reserved 4; } // Targeting for conditionally delivered AssetModules. // It's not used for variant-based targeting of AssetModules, see // AssetsDirectoryTargeting instead. // The semantic of the targeting is the "AND" rule on all immediate values. message AssetModuleTargeting { UserCountriesTargeting user_countries_targeting = 1; DeviceGroupModuleTargeting device_group_targeting = 2; } // User Countries targeting describing an inclusive/exclusive list of country // codes that module targets. message UserCountriesTargeting { // List of country codes in the two-letter CLDR territory format. repeated string country_codes = 1; // Indicates if the list above is exclusive. bool exclude = 2; } message ScreenDensity { enum DensityAlias { DENSITY_UNSPECIFIED = 0; NODPI = 1; LDPI = 2; MDPI = 3; TVDPI = 4; HDPI = 5; XHDPI = 6; XXHDPI = 7; XXXHDPI = 8; } oneof density_oneof { DensityAlias density_alias = 1; int32 density_dpi = 2; } } message SdkVersion { // Inclusive. google.protobuf.Int32Value min = 1; } message TextureCompressionFormat { enum TextureCompressionFormatAlias { UNSPECIFIED_TEXTURE_COMPRESSION_FORMAT = 0; ETC1_RGB8 = 1; PALETTED = 2; THREE_DC = 3; ATC = 4; LATC = 5; DXT1 = 6; S3TC = 7; PVRTC = 8; ASTC = 9; ETC2 = 10; } TextureCompressionFormatAlias alias = 1; } message Abi { enum AbiAlias { UNSPECIFIED_CPU_ARCHITECTURE = 0; ARMEABI = 1; ARMEABI_V7A = 2; ARM64_V8A = 3; X86 = 4; X86_64 = 5; MIPS = 6; MIPS64 = 7; RISCV64 = 8; } AbiAlias alias = 1; } message MultiAbi { repeated Abi abi = 1; } message Sanitizer { enum SanitizerAlias { NONE = 0; HWADDRESS = 1; } SanitizerAlias alias = 1; } message DeviceFeature { string feature_name = 1; // Equivalent of android:glEsVersion or android:version in . int32 feature_version = 2; } // Targeting specific for directories under assets/. message AssetsDirectoryTargeting { AbiTargeting abi = 1; reserved 2; // was GraphicsApiTargeting TextureCompressionFormatTargeting texture_compression_format = 3; LanguageTargeting language = 4; DeviceTierTargeting device_tier = 5 [deprecated = true]; CountrySetTargeting country_set = 6 [deprecated = true]; DeviceGroupTargeting device_group = 7; } // Targeting specific for directories under lib/. message NativeDirectoryTargeting { Abi abi = 1; reserved 2; // was GraphicsApi TextureCompressionFormat texture_compression_format = 3; Sanitizer sanitizer = 4; } // Targeting specific for image files under apex/. message ApexImageTargeting { MultiAbiTargeting multi_abi = 1; } message AbiTargeting { repeated Abi value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated Abi alternatives = 2; } message MultiAbiTargeting { repeated MultiAbi value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated MultiAbi alternatives = 2; } message ScreenDensityTargeting { repeated ScreenDensity value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated ScreenDensity alternatives = 2; } message LanguageTargeting { // ISO-639: 2 or 3 letter language code. repeated string value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated string alternatives = 2; } message SdkVersionTargeting { repeated SdkVersion value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated SdkVersion alternatives = 2; } message TextureCompressionFormatTargeting { repeated TextureCompressionFormat value = 1; // Targeting of other sibling directories that were in the Bundle. // For master splits this is targeting of other master splits. repeated TextureCompressionFormat alternatives = 2; } message SanitizerTargeting { repeated Sanitizer value = 1; } // Since other atom targeting messages have the "OR" semantic on values // the DeviceFeatureTargeting represents only one device feature to retain // that convention. message DeviceFeatureTargeting { DeviceFeature required_feature = 1; } // Targets assets and APKs to a concrete device tier. message DeviceTierTargeting { repeated google.protobuf.Int32Value value = 3; repeated google.protobuf.Int32Value alternatives = 4; reserved 1, 2; } // Targets assets and APKs to a specific country set. // For Example:- // The values and alternatives for the following files in assets directory // targeting would be as follows: // assetpack1/assets/foo#countries_latam/bar.txt -> // { value: [latam], alternatives: [sea] } // assetpack1/assets/foo#countries_sea/bar.txt -> // { value: [sea], alternatives: [latam] } // assetpack1/assets/foo/bar.txt -> // { value: [], alternatives: [sea, latam] } // The values and alternatives for the following targeted split apks would be as // follows: // splits/base-countries_latam.apk -> // { value: [latam], alternatives: [sea] } // splits/base-countries_sea.apk -> // { value: [sea], alternatives: [latam] } // splits/base-other_countries.apk -> // { value: [], alternatives: [sea, latam] } message CountrySetTargeting { // Country set name defined in device tier config. repeated string value = 1; // Targeting of other sibling directories that were in the Bundle. repeated string alternatives = 2; } // Targets assets and APKs to a concrete device group. message DeviceGroupTargeting { // Device group name defined in device tier config. repeated string value = 1; // Targeting of other sibling directories that are in the Bundle. repeated string alternatives = 2; } // Targets conditional modules to a set of device groups. message DeviceGroupModuleTargeting { repeated string value = 1; } // Variant targeting based on SDK Runtime availability on device. message SdkRuntimeTargeting { // Whether the variant requires SDK Runtime to be available on the device. bool requires_sdk_runtime = 1; }