Apply hiddenapi encoding to java_sdk_library .impl

Adds a ConfigurationName property, and ConfigurationName() method that
allows a library to separate its name (e.g. framework-tethering.impl)
from the name used in the build configuration,
    e.g. ctx.Config().BootJars().

Updates hiddenapi processing to use ConfigurationName() instead of
ctx.ModuleName().

Changes java_sdk_library to set the ConfigurationName property
of the implementation library to the name of the module instead of
<module>.impl so that it will match the name in the boot jars list.

Bug: 159683330
Test: m framework-tethering
      dexdump ${PRODUCT_OUT}/apex/com.android.tethering/javalib/framework-tethering.jar | grep hiddenapi | wc -l
      Verify that there are >0 hiddenapi entries.
      Add java_sdk_library_import prefer=true for framework-tethering
      and repeat the above to verify that there are 0 hiddenapi entries.
      Apply this change, repeat above and verify that there are the same # of entries as before.
      Remove the prebuilt for framework-tethering
      Repeat the above and verify that there is no change to the # of entries
Change-Id: I6c3016c35d0fcb1b95d4f9b37a307a69878f8e0a
This commit is contained in:
Paul Duffin 2020-06-24 16:22:38 +01:00
parent 82f62fdac4
commit c4422106a7
3 changed files with 33 additions and 7 deletions

View File

@ -59,10 +59,9 @@ type hiddenAPIIntf interface {
var _ hiddenAPIIntf = (*hiddenAPI)(nil) var _ hiddenAPIIntf = (*hiddenAPI)(nil)
func (h *hiddenAPI) hiddenAPI(ctx android.ModuleContext, dexJar android.ModuleOutPath, func (h *hiddenAPI) hiddenAPI(ctx android.ModuleContext, name string, primary bool, dexJar android.ModuleOutPath,
implementationJar android.Path, uncompressDex bool) android.ModuleOutPath { implementationJar android.Path, uncompressDex bool) android.ModuleOutPath {
if !ctx.Config().IsEnvTrue("UNSAFE_DISABLE_HIDDENAPI_FLAGS") { if !ctx.Config().IsEnvTrue("UNSAFE_DISABLE_HIDDENAPI_FLAGS") {
name := ctx.ModuleName()
// Modules whose names are of the format <x>-hiddenapi provide hiddenapi information // Modules whose names are of the format <x>-hiddenapi provide hiddenapi information
// for the boot jar module <x>. Otherwise, the module provides information for itself. // for the boot jar module <x>. Otherwise, the module provides information for itself.
@ -90,7 +89,14 @@ func (h *hiddenAPI) hiddenAPI(ctx android.ModuleContext, dexJar android.ModuleOu
// the gathered information in the generated dex file. // the gathered information in the generated dex file.
if name == bootJarName { if name == bootJarName {
hiddenAPIJar := android.PathForModuleOut(ctx, "hiddenapi", name+".jar") hiddenAPIJar := android.PathForModuleOut(ctx, "hiddenapi", name+".jar")
// More than one library with the same classes can be encoded but only one can
// be added to the global set of flags, otherwise it will result in duplicate
// classes which is an error. Therefore, only add the dex jar of one of them
// to the global set of flags.
if primary {
h.bootDexJarPath = dexJar h.bootDexJarPath = dexJar
}
hiddenAPIEncodeDex(ctx, hiddenAPIJar, dexJar, uncompressDex) hiddenAPIEncodeDex(ctx, hiddenAPIJar, dexJar, uncompressDex)
dexJar = hiddenAPIJar dexJar = hiddenAPIJar
} }

View File

@ -342,6 +342,12 @@ type CompilerDeviceProperties struct {
// otherwise provides defaults libraries to add to the bootclasspath. // otherwise provides defaults libraries to add to the bootclasspath.
System_modules *string System_modules *string
// The name of the module as used in build configuration.
//
// Allows a library to separate its actual name from the name used in
// build configuration, e.g.ctx.Config().BootJars().
ConfigurationName *string `blueprint:"mutated"`
// set the name of the output // set the name of the output
Stem *string Stem *string
@ -1617,8 +1623,11 @@ func (j *Module) compile(ctx android.ModuleContext, aaptSrcJar android.Path) {
return return
} }
configurationName := j.ConfigurationName()
primary := configurationName == ctx.ModuleName()
// Hidden API CSV generation and dex encoding // Hidden API CSV generation and dex encoding
dexOutputFile = j.hiddenAPI.hiddenAPI(ctx, dexOutputFile, j.implementationJarFile, dexOutputFile = j.hiddenAPI.hiddenAPI(ctx, configurationName, primary, dexOutputFile, j.implementationJarFile,
proptools.Bool(j.deviceProperties.Uncompress_dex)) proptools.Bool(j.deviceProperties.Uncompress_dex))
// merge dex jar with resources if necessary // merge dex jar with resources if necessary
@ -1872,6 +1881,10 @@ func (j *Module) Stem() string {
return proptools.StringDefault(j.deviceProperties.Stem, j.Name()) return proptools.StringDefault(j.deviceProperties.Stem, j.Name())
} }
func (j *Module) ConfigurationName() string {
return proptools.StringDefault(j.deviceProperties.ConfigurationName, j.BaseModuleName())
}
func (j *Module) JacocoReportClassesFile() android.Path { func (j *Module) JacocoReportClassesFile() android.Path {
return j.jacocoReportClassesFile return j.jacocoReportClassesFile
} }

View File

@ -1088,15 +1088,22 @@ func (module *SdkLibrary) latestRemovedApiFilegroupName(apiScope *apiScope) stri
// Creates the implementation java library // Creates the implementation java library
func (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext) { func (module *SdkLibrary) createImplLibrary(mctx android.DefaultableHookContext) {
moduleNamePtr := proptools.StringPtr(module.BaseModuleName())
props := struct { props := struct {
Name *string Name *string
Visibility []string Visibility []string
Instrument bool Instrument bool
ConfigurationName *string
}{ }{
Name: proptools.StringPtr(module.implLibraryModuleName()), Name: proptools.StringPtr(module.implLibraryModuleName()),
Visibility: module.sdkLibraryProperties.Impl_library_visibility, Visibility: module.sdkLibraryProperties.Impl_library_visibility,
// Set the instrument property to ensure it is instrumented when instrumentation is required. // Set the instrument property to ensure it is instrumented when instrumentation is required.
Instrument: true, Instrument: true,
// Make the created library behave as if it had the same name as this module.
ConfigurationName: moduleNamePtr,
} }
properties := []interface{}{ properties := []interface{}{