update MultiAbiTargeting matching logic

The logic here has diverged from the logic in bundletool and resulted in
the wrong APEX variant being chosen for a 64bit-only product.

Bug: 246476965
Test: go test .
Change-Id: Ic3b067e98a65146cfa399e7c9b231f397e51c23e
This commit is contained in:
Sam Delmerico
2022-09-16 11:59:56 -04:00
parent a2595a93fe
commit b74f0a0084
2 changed files with 438 additions and 16 deletions

View File

@@ -420,6 +420,370 @@ bundletool {
}
}
func TestSelectApks_ApexSet_Variants(t *testing.T) {
testCases := []testDesc{
{
protoText: `
variant {
targeting {
sdk_version_targeting {value {min {value: 29}}}
multi_abi_targeting {
value {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
apk_set {
module_metadata {
name: "base"
delivery_type: INSTALL_TIME
}
apk_description {
targeting {
multi_abi_targeting {
value {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
path: "standalones/standalone-armeabi_v7a.apex"
}
}
variant_number: 0
}
variant {
targeting {
sdk_version_targeting {value {min {value: 29}}}
multi_abi_targeting {
value {abi {alias: ARM64_V8A}}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
apk_set {
module_metadata {
name: "base"
delivery_type: INSTALL_TIME
}
apk_description {
targeting {
multi_abi_targeting {
value {abi {alias: ARM64_V8A}}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
path: "standalones/standalone-arm64_v8a.apex"
}
}
variant_number: 1
}
variant {
targeting {
sdk_version_targeting {value {min {value: 29}}}
multi_abi_targeting {
value {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
apk_set {
module_metadata {
name: "base"
delivery_type: INSTALL_TIME
}
apk_description {
targeting {
multi_abi_targeting {
value {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
path: "standalones/standalone-armeabi_v7a.arm64_v8a.apex"
}
}
variant_number: 2
}
variant {
targeting {
sdk_version_targeting {value {min {value: 29}}}
multi_abi_targeting {
value {abi {alias: X86}}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
apk_set {
module_metadata {
name: "base"
delivery_type: INSTALL_TIME
}
apk_description {
targeting {
multi_abi_targeting {
value {abi {alias: X86}}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {
abi {alias: X86}
abi {alias: X86_64}
}
}
}
path: "standalones/standalone-x86.apex"
}
}
variant_number: 3
}
variant {
targeting {
sdk_version_targeting {value {min {value: 29}}}
multi_abi_targeting {
value {
abi {alias: X86}
abi {alias: X86_64}
}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
}
}
apk_set {
module_metadata {
name: "base"
delivery_type: INSTALL_TIME
}
apk_description {
targeting {
multi_abi_targeting {
value {
abi {alias: X86}
abi {alias: X86_64}
}
alternatives {abi {alias: ARMEABI_V7A}}
alternatives {
abi {alias: ARMEABI_V7A}
abi {alias: ARM64_V8A}
}
alternatives {abi {alias: ARM64_V8A}}
alternatives {abi {alias: X86}}
}
}
path: "standalones/standalone-x86.x86_64.apex"
}
}
variant_number: 4
}
`,
configs: []testConfigDesc{
{
name: "multi-variant multi-target ARM",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_ARM64_V8A: 0,
bp.Abi_ARMEABI_V7A: 1,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-armeabi_v7a.arm64_v8a.apex",
},
},
},
{
name: "multi-variant single-target arm",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_ARMEABI_V7A: 0,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-armeabi_v7a.apex",
},
},
},
{
name: "multi-variant single-target arm64",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_ARM64_V8A: 0,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-arm64_v8a.apex",
},
},
},
{
name: "multi-variant multi-target x86",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_X86: 0,
bp.Abi_X86_64: 1,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-x86.x86_64.apex",
},
},
},
{
name: "multi-variant single-target x86",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_X86: 0,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-x86.apex",
},
},
},
{
name: "multi-variant single-target x86_64",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_X86_64: 0,
},
},
expected: SelectionResult{},
},
{
name: "multi-variant multi-target cross-target",
targetConfig: TargetConfig{
sdkVersion: 33,
screenDpi: map[bp.ScreenDensity_DensityAlias]bool{
bp.ScreenDensity_DENSITY_UNSPECIFIED: true,
},
abis: map[bp.Abi_AbiAlias]int{
bp.Abi_ARM64_V8A: 0,
bp.Abi_X86_64: 1,
},
},
expected: SelectionResult{
"base",
[]string{
"standalones/standalone-arm64_v8a.apex",
},
},
},
},
},
}
for _, testCase := range testCases {
var toc bp.BuildApksResult
if err := prototext.Unmarshal([]byte(testCase.protoText), &toc); err != nil {
t.Fatal(err)
}
for _, config := range testCase.configs {
t.Run(config.name, func(t *testing.T) {
actual := selectApks(&toc, config.targetConfig)
if !reflect.DeepEqual(config.expected, actual) {
t.Errorf("expected %v, got %v", config.expected, actual)
}
})
}
}
}
type testZip2ZipWriter struct {
entries map[string]string
}