Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22abf219 authored by Justin Yun's avatar Justin Yun
Browse files

LLNDK version maps to NDK version

Instead of annotation duplicate LLNDK versions, use a corresponding
NDK version to find LLNDK symbols.
To generate LLNDK stubs, ndkstubgen sets `--llndk` argument with the
corresponding SDK version to its `--api` argument.

Bug: 361077712
Test: atest test_ndkstubgen
      atest test_symbolfile
Change-Id: I64cd6eaeae4451326bf2e74b4d2639933f004393
parent 098743d0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ bootstrap_go_package {
        "testing.go",
        "util.go",
        "variable.go",
        "vendor_api_levels.go",
        "vintf_fragment.go",
        "vintf_data.go",
        "visibility.go",
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string
			Platform_version_active_codenames:   []string{"S", "Tiramisu"},
			DeviceSystemSdkVersions:             []string{"29", "30", "S"},
			Platform_systemsdk_versions:         []string{"29", "30", "S", "Tiramisu"},
			VendorApiLevel:                      stringPtr("202404"),
			AAPTConfig:                          []string{"normal", "large", "xlarge", "hdpi", "xhdpi", "xxhdpi"},
			AAPTPreferredConfig:                 stringPtr("xhdpi"),
			AAPTCharacteristics:                 stringPtr("nosdcard"),
+49 −0
Original line number Diff line number Diff line
// Copyright 2024 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package android

import (
	"fmt"
	"strconv"
)

func getSdkVersionOfVendorApiLevel(apiLevel int) (int, bool) {
	ok := true
	sdkVersion := -1
	switch apiLevel {
	case 202404:
		sdkVersion = 35
	case 202504:
		sdkVersion = 36
	default:
		ok = false
	}
	return sdkVersion, ok
}

func GetSdkVersionForVendorApiLevel(vendorApiLevel string) (ApiLevel, error) {
	vendorApiLevelInt, err := strconv.Atoi(vendorApiLevel)
	if err != nil {
		return NoneApiLevel, fmt.Errorf("The vendor API level %q must be able to be parsed as an integer", vendorApiLevel)
	}
	if vendorApiLevelInt < 35 {
		return uncheckedFinalApiLevel(vendorApiLevelInt), nil
	}

	if sdkInt, ok := getSdkVersionOfVendorApiLevel(vendorApiLevelInt); ok {
		return uncheckedFinalApiLevel(sdkInt), nil
	}
	return NoneApiLevel, fmt.Errorf("Unknown vendor API level %q. Requires updating the map in vendor_api_level.go?", vendorApiLevel)
}
+17 −7
Original line number Diff line number Diff line
@@ -41,12 +41,25 @@ func MinApiForArch(ctx android.EarlyModuleContext,
	}
}

// Native API levels cannot be less than the MinApiLevelForArch. This function
// sets the lower bound of the API level with the MinApiLevelForArch.
func nativeClampedApiLevel(ctx android.BaseModuleContext,
	apiLevel android.ApiLevel) android.ApiLevel {

	min := MinApiForArch(ctx, ctx.Arch().ArchType)

	if apiLevel.LessThan(min) {
		return min
	}

	return apiLevel
}

func nativeApiLevelFromUser(ctx android.BaseModuleContext,
	raw string) (android.ApiLevel, error) {

	min := MinApiForArch(ctx, ctx.Arch().ArchType)
	if raw == "minimum" {
		return min, nil
		return MinApiForArch(ctx, ctx.Arch().ArchType), nil
	}

	value, err := android.ApiLevelFromUser(ctx, raw)
@@ -54,15 +67,12 @@ func nativeApiLevelFromUser(ctx android.BaseModuleContext,
		return android.NoneApiLevel, err
	}

	if value.LessThan(min) {
		return min, nil
	}

	return value, nil
	return nativeClampedApiLevel(ctx, value), nil
}

func nativeApiLevelOrPanic(ctx android.BaseModuleContext,
	raw string) android.ApiLevel {

	value, err := nativeApiLevelFromUser(ctx, raw)
	if err != nil {
		panic(err.Error())
+1 −4
Original line number Diff line number Diff line
@@ -40,9 +40,6 @@ func TestMain(m *testing.M) {

var prepareForCcTest = android.GroupFixturePreparers(
	PrepareForIntegrationTestWithCc,
	android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
		variables.VendorApiLevel = StringPtr("202404")
	}),
)

var apexVariationName = "apex28"
@@ -1008,7 +1005,7 @@ func TestLlndkLibrary(t *testing.T) {
	android.AssertArrayString(t, "variants for llndk stubs", expected, actual)

	params := result.ModuleForTests("libllndk", "android_vendor_arm_armv7-a-neon_shared").Description("generate stub")
	android.AssertSame(t, "use Vendor API level for default stubs", "999999", params.Args["apiLevel"])
	android.AssertSame(t, "use Vendor API level for default stubs", "35", params.Args["apiLevel"])

	checkExportedIncludeDirs := func(module, variant string, expectedSystemDirs []string, expectedDirs ...string) {
		t.Helper()
Loading