apex: choose stub according to min_sdk_version
Native modules within APEX should be linked with proper stub version
according to its min_sdk_version.
For example, when min_sdk_version is set to "29", libfoo in the apex
would be linked to libbar of version 29 from platform, even if it has
a newer version like 30.
Bug: 145796956
Test: m nothing (soong tests)
Change-Id: I4a0b2002587bc24b7deeb5d59b6eeba5e1db5b1f
diff --git a/android/apex.go b/android/apex.go
index 026d685..a4de6dd 100644
--- a/android/apex.go
+++ b/android/apex.go
@@ -15,7 +15,9 @@
package android
import (
+ "fmt"
"sort"
+ "strconv"
"sync"
)
@@ -25,6 +27,8 @@
// Whether this apex variant needs to target Android 10
LegacyAndroid10Support bool
+
+ MinSdkVersion int
}
// ApexModule is the interface that a module type is expected to implement if
@@ -86,6 +90,13 @@
// DepIsInSameApex tests if the other module 'dep' is installed to the same
// APEX as this module
DepIsInSameApex(ctx BaseModuleContext, dep Module) bool
+
+ // Returns the highest version which is <= min_sdk_version.
+ // For example, with min_sdk_version is 10 and versionList is [9,11]
+ // it returns 9.
+ ChooseSdkVersion(versionList []string, useLatest bool) (string, error)
+
+ ShouldSupportAndroid10() bool
}
type ApexProperties struct {
@@ -181,6 +192,24 @@
return true
}
+func (m *ApexModuleBase) ChooseSdkVersion(versionList []string, useLatest bool) (string, error) {
+ if useLatest {
+ return versionList[len(versionList)-1], nil
+ }
+ minSdkVersion := m.ApexProperties.Info.MinSdkVersion
+ for i := range versionList {
+ ver, _ := strconv.Atoi(versionList[len(versionList)-i-1])
+ if ver <= minSdkVersion {
+ return versionList[len(versionList)-i-1], nil
+ }
+ }
+ return "", fmt.Errorf("min_sdk_version is set %v, but not found in %v", minSdkVersion, versionList)
+}
+
+func (m *ApexModuleBase) ShouldSupportAndroid10() bool {
+ return !m.IsForPlatform() && (m.ApexProperties.Info.MinSdkVersion <= 29 || m.ApexProperties.Info.LegacyAndroid10Support)
+}
+
func (m *ApexModuleBase) checkApexAvailableProperty(mctx BaseModuleContext) {
for _, n := range m.ApexProperties.Apex_available {
if n == AvailableToPlatform || n == availableToAnyApex {