Merge "Add better error handling to bootDexJar function" into main
This commit is contained in:
@@ -6127,6 +6127,84 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) {
|
|||||||
out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
|
out/soong/.intermediates/packages/modules/com.android.art/art-bootclasspath-fragment/android_common_apex10000/modular-hiddenapi/index.csv
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("Co-existing unflagged apexes should create a duplicate deapexer error in hiddenapi processing", func(t *testing.T) {
|
||||||
|
bp := `
|
||||||
|
// Source
|
||||||
|
apex {
|
||||||
|
name: "myapex",
|
||||||
|
enabled: false,
|
||||||
|
key: "myapex.key",
|
||||||
|
bootclasspath_fragments: ["my-bootclasspath-fragment"],
|
||||||
|
}
|
||||||
|
|
||||||
|
apex_key {
|
||||||
|
name: "myapex.key",
|
||||||
|
public_key: "testkey.avbpubkey",
|
||||||
|
private_key: "testkey.pem",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prebuilt
|
||||||
|
prebuilt_apex {
|
||||||
|
name: "myapex.v1",
|
||||||
|
source_apex_name: "myapex",
|
||||||
|
arch: {
|
||||||
|
arm64: {
|
||||||
|
src: "myapex-arm64.apex",
|
||||||
|
},
|
||||||
|
arm: {
|
||||||
|
src: "myapex-arm.apex",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
|
||||||
|
prefer: true,
|
||||||
|
}
|
||||||
|
prebuilt_apex {
|
||||||
|
name: "myapex.v2",
|
||||||
|
source_apex_name: "myapex",
|
||||||
|
arch: {
|
||||||
|
arm64: {
|
||||||
|
src: "myapex-arm64.apex",
|
||||||
|
},
|
||||||
|
arm: {
|
||||||
|
src: "myapex-arm.apex",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exported_bootclasspath_fragments: ["my-bootclasspath-fragment"],
|
||||||
|
prefer: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
prebuilt_bootclasspath_fragment {
|
||||||
|
name: "my-bootclasspath-fragment",
|
||||||
|
contents: ["libfoo", "libbar"],
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
hidden_api: {
|
||||||
|
annotation_flags: "my-bootclasspath-fragment/annotation-flags.csv",
|
||||||
|
metadata: "my-bootclasspath-fragment/metadata.csv",
|
||||||
|
index: "my-bootclasspath-fragment/index.csv",
|
||||||
|
stub_flags: "my-bootclasspath-fragment/stub-flags.csv",
|
||||||
|
all_flags: "my-bootclasspath-fragment/all-flags.csv",
|
||||||
|
},
|
||||||
|
prefer: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
java_import {
|
||||||
|
name: "libfoo",
|
||||||
|
jars: ["libfoo.jar"],
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
prefer: true,
|
||||||
|
}
|
||||||
|
java_import {
|
||||||
|
name: "libbar",
|
||||||
|
jars: ["libbar.jar"],
|
||||||
|
apex_available: ["myapex"],
|
||||||
|
prefer: true,
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
testDexpreoptWithApexes(t, bp, "Multiple installable prebuilt APEXes provide ambiguous deapexers: prebuilt_myapex.v1 and prebuilt_myapex.v2", preparer, fragment)
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestApexWithTests(t *testing.T) {
|
func TestApexWithTests(t *testing.T) {
|
||||||
|
@@ -45,6 +45,7 @@ type hiddenAPI struct {
|
|||||||
// This must be the path to the unencoded dex jar as the encoded dex jar indirectly depends on
|
// This must be the path to the unencoded dex jar as the encoded dex jar indirectly depends on
|
||||||
// this file so using the encoded dex jar here would result in a cycle in the ninja rules.
|
// this file so using the encoded dex jar here would result in a cycle in the ninja rules.
|
||||||
bootDexJarPath OptionalDexJarPath
|
bootDexJarPath OptionalDexJarPath
|
||||||
|
bootDexJarPathErr error
|
||||||
|
|
||||||
// The paths to the classes jars that contain classes and class members annotated with
|
// The paths to the classes jars that contain classes and class members annotated with
|
||||||
// the UnsupportedAppUsage annotation that need to be extracted as part of the hidden API
|
// the UnsupportedAppUsage annotation that need to be extracted as part of the hidden API
|
||||||
@@ -56,7 +57,10 @@ type hiddenAPI struct {
|
|||||||
uncompressDexState *bool
|
uncompressDexState *bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hiddenAPI) bootDexJar() OptionalDexJarPath {
|
func (h *hiddenAPI) bootDexJar(ctx android.ModuleErrorfContext) OptionalDexJarPath {
|
||||||
|
if h.bootDexJarPathErr != nil {
|
||||||
|
ctx.ModuleErrorf(h.bootDexJarPathErr.Error())
|
||||||
|
}
|
||||||
return h.bootDexJarPath
|
return h.bootDexJarPath
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +81,7 @@ type hiddenAPIModule interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type hiddenAPIIntf interface {
|
type hiddenAPIIntf interface {
|
||||||
bootDexJar() OptionalDexJarPath
|
bootDexJar(ctx android.ModuleErrorfContext) OptionalDexJarPath
|
||||||
classesJars() android.Paths
|
classesJars() android.Paths
|
||||||
uncompressDex() *bool
|
uncompressDex() *bool
|
||||||
}
|
}
|
||||||
@@ -126,6 +130,11 @@ func (h *hiddenAPI) initHiddenAPI(ctx android.ModuleContext, dexJar OptionalDexJ
|
|||||||
h.active = isModuleInBootClassPath(ctx, module)
|
h.active = isModuleInBootClassPath(ctx, module)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Store any error encountered during the initialization of hiddenapi structure (e.g. unflagged co-existing prebuilt apexes)
|
||||||
|
func (h *hiddenAPI) initHiddenAPIError(err error) {
|
||||||
|
h.bootDexJarPathErr = err
|
||||||
|
}
|
||||||
|
|
||||||
func isModuleInBootClassPath(ctx android.BaseModuleContext, module android.Module) bool {
|
func isModuleInBootClassPath(ctx android.BaseModuleContext, module android.Module) bool {
|
||||||
// Get the configured platform and apex boot jars.
|
// Get the configured platform and apex boot jars.
|
||||||
nonApexBootJars := ctx.Config().NonApexBootJars()
|
nonApexBootJars := ctx.Config().NonApexBootJars()
|
||||||
|
@@ -1357,7 +1357,7 @@ func extractBootDexInfoFromModules(ctx android.ModuleContext, contents []android
|
|||||||
// invalid, then create a fake path and either report an error immediately or defer reporting of the
|
// invalid, then create a fake path and either report an error immediately or defer reporting of the
|
||||||
// error until the path is actually used.
|
// error until the path is actually used.
|
||||||
func retrieveBootDexJarFromHiddenAPIModule(ctx android.ModuleContext, module hiddenAPIModule) android.Path {
|
func retrieveBootDexJarFromHiddenAPIModule(ctx android.ModuleContext, module hiddenAPIModule) android.Path {
|
||||||
bootDexJar := module.bootDexJar()
|
bootDexJar := module.bootDexJar(ctx)
|
||||||
if !bootDexJar.Valid() {
|
if !bootDexJar.Valid() {
|
||||||
fake := android.PathForModuleOut(ctx, fmt.Sprintf("fake/boot-dex/%s.jar", module.Name()))
|
fake := android.PathForModuleOut(ctx, fmt.Sprintf("fake/boot-dex/%s.jar", module.Name()))
|
||||||
handleMissingDexBootFile(ctx, module, fake, bootDexJar.InvalidReason())
|
handleMissingDexBootFile(ctx, module, fake, bootDexJar.InvalidReason())
|
||||||
|
@@ -2264,6 +2264,7 @@ func (j *Import) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|||||||
// An error was found, possibly due to multiple apexes in the tree that export this library
|
// An error was found, possibly due to multiple apexes in the tree that export this library
|
||||||
// Defer the error till a client tries to call DexJarBuildPath
|
// Defer the error till a client tries to call DexJarBuildPath
|
||||||
j.dexJarFileErr = err
|
j.dexJarFileErr = err
|
||||||
|
j.initHiddenAPIError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(j.BaseModuleName())
|
dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(j.BaseModuleName())
|
||||||
|
@@ -2864,6 +2864,7 @@ func (module *SdkLibraryImport) GenerateAndroidBuildActions(ctx android.ModuleCo
|
|||||||
// An error was found, possibly due to multiple apexes in the tree that export this library
|
// An error was found, possibly due to multiple apexes in the tree that export this library
|
||||||
// Defer the error till a client tries to call DexJarBuildPath
|
// Defer the error till a client tries to call DexJarBuildPath
|
||||||
module.dexJarFileErr = err
|
module.dexJarFileErr = err
|
||||||
|
module.initHiddenAPIError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(module.BaseModuleName())
|
dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(module.BaseModuleName())
|
||||||
|
Reference in New Issue
Block a user