Add hidden_api for java_import

Test: go java tests
Test: m
Bug: 160455085
Change-Id: Ib6e826e32ca73ceea0799b26145ad06b1e62a1bf
This commit is contained in:
Liz Kammer 2020-08-05 15:40:41 -07:00
parent 3e0b9c031c
commit 5ca3a6293e
7 changed files with 164 additions and 1 deletions

View file

@ -258,6 +258,8 @@ type Module interface {
SkipInstall()
IsSkipInstall() bool
MakeUninstallable()
ReplacedByPrebuilt()
IsReplacedByPrebuilt() bool
ExportedToMake() bool
InitRc() Paths
VintfFragments() Paths
@ -542,6 +544,9 @@ type commonProperties struct {
SkipInstall bool `blueprint:"mutated"`
// Whether the module has been replaced by a prebuilt
ReplacedByPrebuilt bool `blueprint:"mutated"`
// Disabled by mutators. If set to true, it overrides Enabled property.
ForcedDisabled bool `blueprint:"mutated"`
@ -1067,6 +1072,15 @@ func (m *ModuleBase) MakeUninstallable() {
m.SkipInstall()
}
func (m *ModuleBase) ReplacedByPrebuilt() {
m.commonProperties.ReplacedByPrebuilt = true
m.SkipInstall()
}
func (m *ModuleBase) IsReplacedByPrebuilt() bool {
return m.commonProperties.ReplacedByPrebuilt
}
func (m *ModuleBase) ExportedToMake() bool {
return m.commonProperties.NamespaceExportedToMake
}

View file

@ -253,7 +253,7 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) {
p := m.(PrebuiltInterface).Prebuilt()
if p.usePrebuilt(ctx, s) {
p.properties.UsePrebuilt = true
s.SkipInstall()
s.ReplacedByPrebuilt()
}
})
}

View file

@ -59,6 +59,7 @@ bootstrap_go_package {
"device_host_converter_test.go",
"dexpreopt_test.go",
"dexpreopt_bootjars_test.go",
"hiddenapi_singleton_test.go",
"java_test.go",
"jdeps_test.go",
"kotlin_test.go",

View file

@ -163,6 +163,7 @@ func stubFlagsRule(ctx android.SingletonContext) {
return
}
}
bootDexJars = append(bootDexJars, jar)
}
}

View file

@ -0,0 +1,136 @@
// Copyright 2020 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 java
import (
"android/soong/android"
"strings"
"testing"
)
func testConfigWithBootJars(bp string, bootJars []string) android.Config {
config := testConfig(nil, bp, nil)
config.TestProductVariables.BootJars = bootJars
return config
}
func testContextWithHiddenAPI() *android.TestContext {
ctx := testContext()
ctx.RegisterSingletonType("hiddenapi", hiddenAPISingletonFactory)
return ctx
}
func testHiddenAPI(t *testing.T, bp string, bootJars []string) (*android.TestContext, android.Config) {
t.Helper()
config := testConfigWithBootJars(bp, bootJars)
ctx := testContextWithHiddenAPI()
run(t, ctx, config)
return ctx, config
}
func TestHiddenAPISingleton(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
java_library {
name: "foo",
srcs: ["a.java"],
compile_dex: true,
}
`, []string{":foo"})
hiddenAPI := ctx.SingletonForTests("hiddenapi")
hiddenapiRule := hiddenAPI.Rule("hiddenapi")
want := "--boot-dex=" + buildDir + "/.intermediates/foo/android_common/aligned/foo.jar"
if !strings.Contains(hiddenapiRule.RuleParams.Command, want) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", want, hiddenapiRule.RuleParams.Command)
}
}
func TestHiddenAPISingletonWithPrebuilt(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
java_import {
name: "foo",
jars: ["a.jar"],
compile_dex: true,
}
`, []string{":foo"})
hiddenAPI := ctx.SingletonForTests("hiddenapi")
hiddenapiRule := hiddenAPI.Rule("hiddenapi")
want := "--boot-dex=" + buildDir + "/.intermediates/foo/android_common/dex/foo.jar"
if !strings.Contains(hiddenapiRule.RuleParams.Command, want) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", want, hiddenapiRule.RuleParams.Command)
}
}
func TestHiddenAPISingletonWithPrebuiltUseSource(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
java_library {
name: "foo",
srcs: ["a.java"],
compile_dex: true,
}
java_import {
name: "foo",
jars: ["a.jar"],
compile_dex: true,
prefer: false,
}
`, []string{":foo"})
hiddenAPI := ctx.SingletonForTests("hiddenapi")
hiddenapiRule := hiddenAPI.Rule("hiddenapi")
fromSourceJarArg := "--boot-dex=" + buildDir + "/.intermediates/foo/android_common/aligned/foo.jar"
if !strings.Contains(hiddenapiRule.RuleParams.Command, fromSourceJarArg) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", fromSourceJarArg, hiddenapiRule.RuleParams.Command)
}
prebuiltJarArg := "--boot-dex=" + buildDir + "/.intermediates/foo/android_common/dex/foo.jar"
if strings.Contains(hiddenapiRule.RuleParams.Command, prebuiltJarArg) {
t.Errorf("Did not expect %s in hiddenapi command, but it was present: %s", prebuiltJarArg, hiddenapiRule.RuleParams.Command)
}
}
func TestHiddenAPISingletonWithPrebuiltOverrideSource(t *testing.T) {
ctx, _ := testHiddenAPI(t, `
java_library {
name: "foo",
srcs: ["a.java"],
compile_dex: true,
}
java_import {
name: "foo",
jars: ["a.jar"],
compile_dex: true,
prefer: true,
}
`, []string{":foo"})
hiddenAPI := ctx.SingletonForTests("hiddenapi")
hiddenapiRule := hiddenAPI.Rule("hiddenapi")
prebuiltJarArg := "--boot-dex=" + buildDir + "/.intermediates/prebuilt_foo/android_common/dex/foo.jar"
if !strings.Contains(hiddenapiRule.RuleParams.Command, prebuiltJarArg) {
t.Errorf("Expected %s in hiddenapi command, but it was not present: %s", prebuiltJarArg, hiddenapiRule.RuleParams.Command)
}
fromSourceJarArg := "--boot-dex=" + buildDir + "/.intermediates/foo/android_common/aligned/foo.jar"
if strings.Contains(hiddenapiRule.RuleParams.Command, fromSourceJarArg) {
t.Errorf("Did not expect %s in hiddenapi command, but it was present: %s", fromSourceJarArg, hiddenapiRule.RuleParams.Command)
}
}

View file

@ -1611,6 +1611,9 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
configurationName := j.ConfigurationName()
primary := configurationName == ctx.ModuleName()
// If the prebuilt is being used rather than the from source, skip this
// module to prevent duplicated classes
primary = primary && !j.IsReplacedByPrebuilt()
// Hidden API CSV generation and dex encoding
dexOutputFile = j.hiddenAPI.hiddenAPI(ctx, configurationName, primary, dexOutputFile, j.implementationJarFile,
@ -2681,6 +2684,13 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
return
}
configurationName := j.BaseModuleName()
primary := j.Prebuilt().UsePrebuilt()
// Hidden API CSV generation and dex encoding
dexOutputFile = j.hiddenAPI.hiddenAPI(ctx, configurationName, primary, dexOutputFile, outputFile,
proptools.Bool(j.dexProperties.Uncompress_dex))
j.dexJarFile = dexOutputFile
}
}

View file

@ -146,6 +146,7 @@ func GatherRequiredDepsForTest() string {
srcs: ["a.java"],
sdk_version: "none",
system_modules: "stable-core-platform-api-stubs-system-modules",
compile_dex: true,
}
`, extra)
}