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)
Merged-In: I4a0b2002587bc24b7deeb5d59b6eeba5e1db5b1f
Change-Id: I4a0b2002587bc24b7deeb5d59b6eeba5e1db5b1f
(cherry picked from commit 03b5185b88)

Exempt-From-Owner-Approval: got ORV already.
This commit is contained in:
Jooyung Han
2020-02-26 22:45:42 +09:00
parent d10db8f8e3
commit 0c4e016428
7 changed files with 374 additions and 9 deletions

View File

@@ -15,7 +15,9 @@
package android
import (
"fmt"
"sort"
"strconv"
"sync"
)
@@ -25,6 +27,8 @@ type ApexInfo struct {
// 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 @@ type ApexModule interface {
// 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 {
@@ -177,6 +188,24 @@ func (m *ApexModuleBase) DepIsInSameApex(ctx BaseModuleContext, dep Module) bool
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 {