Merge "Revert^2 "Revert "update MultiAbiTargeting matching logic""" into tm-qpr-dev
diff --git a/cmd/extract_apks/main.go b/cmd/extract_apks/main.go
index e39f8d7..1cf64de 100644
--- a/cmd/extract_apks/main.go
+++ b/cmd/extract_apks/main.go
@@ -29,7 +29,6 @@
"google.golang.org/protobuf/proto"
- "android/soong/cmd/extract_apks/bundle_proto"
android_bundle_proto "android/soong/cmd/extract_apks/bundle_proto"
"android/soong/third_party/zip"
)
@@ -198,49 +197,6 @@
*android_bundle_proto.MultiAbiTargeting
}
-type multiAbiValue []*bundle_proto.Abi
-
-func (m multiAbiValue) compare(other multiAbiValue) int {
- min := func(a, b int) int {
- if a < b {
- return a
- }
- return b
- }
-
- sortAbis := func(abiSlice multiAbiValue) func(i, j int) bool {
- return func(i, j int) bool {
- // sort priorities greatest to least
- return multiAbiPriorities[abiSlice[i].Alias] > multiAbiPriorities[abiSlice[j].Alias]
- }
- }
-
- m = append(multiAbiValue{}, m...)
- sort.Slice(m, sortAbis(m))
- other = append(multiAbiValue{}, other...)
- sort.Slice(other, sortAbis(other))
-
- for i := 0; i < min(len(m), len(other)); i++ {
- if multiAbiPriorities[m[i].Alias] > multiAbiPriorities[other[i].Alias] {
- return 1
- }
- if multiAbiPriorities[m[i].Alias] < multiAbiPriorities[other[i].Alias] {
- return -1
- }
- }
-
- if len(m) == len(other) {
- return 0
- }
- if len(m) > len(other) {
- return 1
- }
- return -1
-}
-
-// this logic should match the logic in bundletool at
-// https://github.com/google/bundletool/blob/ae0fc0162fd80d92ef8f4ef4527c066f0106942f/src/main/java/com/android/tools/build/bundletool/device/MultiAbiMatcher.java#L43
-// (note link is the commit at time of writing; but logic should always match the latest)
func (t multiAbiTargetingMatcher) matches(config TargetConfig) bool {
if t.MultiAbiTargeting == nil {
return true
@@ -248,45 +204,31 @@
if _, ok := config.abis[android_bundle_proto.Abi_UNSPECIFIED_CPU_ARCHITECTURE]; ok {
return true
}
-
- multiAbiIsValid := func(m multiAbiValue) bool {
- for _, abi := range m {
- if _, ok := config.abis[abi.Alias]; !ok {
- return false
+ // Find the one with the highest priority.
+ highestPriority := 0
+ for _, v := range t.GetValue() {
+ for _, a := range v.GetAbi() {
+ if _, ok := config.abis[a.Alias]; ok {
+ if highestPriority < multiAbiPriorities[a.Alias] {
+ highestPriority = multiAbiPriorities[a.Alias]
+ }
}
}
- return true
}
-
- // ensure that the current value is valid for our config
- valueSetContainsViableAbi := false
- multiAbiSet := t.GetValue()
- for _, multiAbi := range multiAbiSet {
- if multiAbiIsValid(multiAbi.GetAbi()) {
- valueSetContainsViableAbi = true
- }
- }
-
- if !valueSetContainsViableAbi {
+ if highestPriority == 0 {
return false
}
-
// See if there are any matching alternatives with a higher priority.
- for _, altMultiAbi := range t.GetAlternatives() {
- if !multiAbiIsValid(altMultiAbi.GetAbi()) {
- continue
- }
-
- for _, multiAbi := range multiAbiSet {
- valueAbis := multiAbiValue(multiAbi.GetAbi())
- altAbis := multiAbiValue(altMultiAbi.GetAbi())
- if valueAbis.compare(altAbis) < 0 {
- // An alternative has a higher priority, don't use this one
- return false
+ for _, v := range t.GetAlternatives() {
+ for _, a := range v.GetAbi() {
+ if _, ok := config.abis[a.Alias]; ok {
+ if highestPriority < multiAbiPriorities[a.Alias] {
+ // There's a better one. Skip this one.
+ return false
+ }
}
}
}
-
return true
}
diff --git a/cmd/extract_apks/main_test.go b/cmd/extract_apks/main_test.go
index c1d712d..f5e4046 100644
--- a/cmd/extract_apks/main_test.go
+++ b/cmd/extract_apks/main_test.go
@@ -420,370 +420,6 @@
}
}
-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
}