platform_build_soong/cmd/extract_apks/bundle_proto/config.proto
Dennis Shen ff34e291d8 cherrypick of ag/20211286
update and create bundle config pb python library

update config.pb file to the source of truth:
google3/third_party/java_src/android_appbundle/bundletool/schemas/proto/config.proto

current config.pb is stale and needs update.

Also, add a python library host soong module config_proto, so that it
can be used by other python code.

BUG: b/240288941
TETS: tested along with primary_train_build_worker that reuse
BundleConfig.pb

Change-Id: I426a5cb7ec42573ed2110494c50813abc0a96296
2022-10-20 17:02:42 +00:00

300 lines
11 KiB
Protocol Buffer

// 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;
}