Merge "Make hiddenapi use prebuilt stubs when it should"

This commit is contained in:
Liz Kammer 2020-09-21 14:29:50 +00:00 committed by Gerrit Code Review
commit 9d1f85da7a
3 changed files with 114 additions and 28 deletions

View File

@ -92,31 +92,34 @@ func (h *hiddenAPISingleton) MakeVars(ctx android.MakeVarsContext) {
// stubFlagsRule creates the rule to build hiddenapi-stub-flags.txt out of dex jars from stub modules and boot image
// modules.
func stubFlagsRule(ctx android.SingletonContext) {
// Public API stubs
publicStubModules := []string{
"android_stubs_current",
var publicStubModules []string
var systemStubModules []string
var testStubModules []string
var corePlatformStubModules []string
if ctx.Config().AlwaysUsePrebuiltSdks() {
// Build configuration mandates using prebuilt stub modules
publicStubModules = append(publicStubModules, "sdk_public_current_android")
systemStubModules = append(systemStubModules, "sdk_system_current_android")
testStubModules = append(testStubModules, "sdk_test_current_android")
} else {
// Use stub modules built from source
publicStubModules = append(publicStubModules, "android_stubs_current")
systemStubModules = append(systemStubModules, "android_system_stubs_current")
testStubModules = append(testStubModules, "android_test_stubs_current")
}
// We do not have prebuilts of the core platform api yet
corePlatformStubModules = append(corePlatformStubModules, "legacy.core.platform.api.stubs")
// Add the android.test.base to the set of stubs only if the android.test.base module is on
// the boot jars list as the runtime will only enforce hiddenapi access against modules on
// that list.
if inList("android.test.base", ctx.Config().BootJars()) && !ctx.Config().AlwaysUsePrebuiltSdks() {
publicStubModules = append(publicStubModules, "android.test.base.stubs")
}
// System API stubs
systemStubModules := []string{
"android_system_stubs_current",
}
// Test API stubs
testStubModules := []string{
"android_test_stubs_current",
}
// Core Platform API stubs
corePlatformStubModules := []string{
"legacy.core.platform.api.stubs",
if inList("android.test.base", ctx.Config().BootJars()) {
if ctx.Config().AlwaysUsePrebuiltSdks() {
publicStubModules = append(publicStubModules, "sdk_public_current_android.test.base")
} else {
publicStubModules = append(publicStubModules, "android.test.base.stubs")
}
}
// Allow products to define their own stubs for custom product jars that apps can use.

View File

@ -16,8 +16,11 @@ package java
import (
"android/soong/android"
"fmt"
"strings"
"testing"
"github.com/google/blueprint/proptools"
)
func testConfigWithBootJars(bp string, bootJars []string) android.Config {
@ -32,19 +35,30 @@ func testContextWithHiddenAPI() *android.TestContext {
return ctx
}
func testHiddenAPI(t *testing.T, bp string, bootJars []string) (*android.TestContext, android.Config) {
func testHiddenAPIWithConfig(t *testing.T, config android.Config) *android.TestContext {
t.Helper()
config := testConfigWithBootJars(bp, bootJars)
ctx := testContextWithHiddenAPI()
run(t, ctx, config)
return ctx
}
return ctx, config
func testHiddenAPIBootJars(t *testing.T, bp string, bootJars []string) (*android.TestContext, android.Config) {
config := testConfigWithBootJars(bp, bootJars)
return testHiddenAPIWithConfig(t, config), config
}
func testHiddenAPIUnbundled(t *testing.T, unbundled bool) (*android.TestContext, android.Config) {
config := testConfig(nil, ``, nil)
config.TestProductVariables.Always_use_prebuilt_sdks = proptools.BoolPtr(unbundled)
return testHiddenAPIWithConfig(t, config), config
}
func TestHiddenAPISingleton(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
ctx, _ := testHiddenAPIBootJars(t, `
java_library {
name: "foo",
srcs: ["a.java"],
@ -61,7 +75,7 @@ func TestHiddenAPISingleton(t *testing.T) {
}
func TestHiddenAPISingletonWithPrebuilt(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
ctx, _ := testHiddenAPIBootJars(t, `
java_import {
name: "foo",
jars: ["a.jar"],
@ -78,7 +92,7 @@ func TestHiddenAPISingletonWithPrebuilt(t *testing.T) {
}
func TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
ctx, _ := testHiddenAPIBootJars(t, `
java_library {
name: "foo",
srcs: ["a.java"],
@ -107,7 +121,7 @@ func TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) {
}
func TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
ctx, _ := testHiddenAPIBootJars(t, `
java_library {
name: "foo",
srcs: ["a.java"],
@ -134,3 +148,72 @@ func TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) {
t.Errorf("Did not expect %s in hiddenapi command, but it was present: %s", fromSourceJarArg, hiddenapiRule.RuleParams.Command)
}
}
func TestHiddenAPISingletonSdks(t *testing.T) {
testCases := []struct {
name string
unbundledBuild bool
publicStub string
systemStub string
testStub string
corePlatformStub string
}{
{
name: "testBundled",
unbundledBuild: false,
publicStub: "android_stubs_current",
systemStub: "android_system_stubs_current",
testStub: "android_test_stubs_current",
corePlatformStub: "legacy.core.platform.api.stubs",
}, {
name: "testUnbundled",
unbundledBuild: true,
publicStub: "sdk_public_current_android",
systemStub: "sdk_system_current_android",
testStub: "sdk_test_current_android",
corePlatformStub: "legacy.core.platform.api.stubs",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
ctx, _ := testHiddenAPIUnbundled(t, tc.unbundledBuild)
hiddenAPI := ctx.SingletonForTests("hiddenapi")
hiddenapiRule := hiddenAPI.Rule("hiddenapi")
wantPublicStubs := "--public-stub-classpath=" + generateSdkDexPath(tc.publicStub, tc.unbundledBuild)
if !strings.Contains(hiddenapiRule.RuleParams.Command, wantPublicStubs) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", wantPublicStubs, hiddenapiRule.RuleParams.Command)
}
wantSystemStubs := "--system-stub-classpath=" + generateSdkDexPath(tc.systemStub, tc.unbundledBuild)
if !strings.Contains(hiddenapiRule.RuleParams.Command, wantSystemStubs) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", wantSystemStubs, hiddenapiRule.RuleParams.Command)
}
wantTestStubs := "--test-stub-classpath=" + generateSdkDexPath(tc.testStub, tc.unbundledBuild)
if !strings.Contains(hiddenapiRule.RuleParams.Command, wantTestStubs) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", wantTestStubs, hiddenapiRule.RuleParams.Command)
}
wantCorePlatformStubs := "--core-platform-stub-classpath=" + generateDexPath(tc.corePlatformStub)
if !strings.Contains(hiddenapiRule.RuleParams.Command, wantCorePlatformStubs) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", wantCorePlatformStubs, hiddenapiRule.RuleParams.Command)
}
})
}
}
func generateDexedPath(subDir, dex, module string) string {
return fmt.Sprintf("%s/.intermediates/%s/android_common/%s/%s.jar", buildDir, subDir, dex, module)
}
func generateDexPath(module string) string {
return generateDexedPath(module, "dex", module)
}
func generateSdkDexPath(module string, unbundled bool) string {
if unbundled {
return generateDexedPath("prebuilts/sdk/"+module, "dex", module)
}
return generateDexPath(module)
}

View File

@ -88,7 +88,7 @@ func TestConfig(buildDir string, env map[string]string, bp string, fs map[string
"prebuilts/sdk/30/system/api/bar-removed.txt": nil,
"prebuilts/sdk/30/test/api/bar-removed.txt": nil,
"prebuilts/sdk/tools/core-lambda-stubs.jar": nil,
"prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "30", "current"],}`),
"prebuilts/sdk/Android.bp": []byte(`prebuilt_apis { name: "sdk", api_dirs: ["14", "28", "30", "current"], imports_sdk_version: "none", imports_compile_dex:true,}`),
"bin.py": nil,
python.StubTemplateHost: []byte(`PYTHON_BINARY = '%interpreter%'