Loading apex/apex_test.go +78 −0 Original line number Diff line number Diff line Loading @@ -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 `) }) 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) { Loading java/hiddenapi.go +12 −3 Original line number Diff line number Diff line Loading @@ -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 file so using the encoded dex jar here would result in a cycle in the ninja rules. bootDexJarPath OptionalDexJarPath bootDexJarPathErr error // 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 Loading @@ -56,7 +57,10 @@ type hiddenAPI struct { 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 } Loading @@ -77,7 +81,7 @@ type hiddenAPIModule interface { } type hiddenAPIIntf interface { bootDexJar() OptionalDexJarPath bootDexJar(ctx android.ModuleErrorfContext) OptionalDexJarPath classesJars() android.Paths uncompressDex() *bool } Loading Loading @@ -126,6 +130,11 @@ func (h *hiddenAPI) initHiddenAPI(ctx android.ModuleContext, dexJar OptionalDexJ 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 { // Get the configured platform and apex boot jars. nonApexBootJars := ctx.Config().NonApexBootJars() Loading java/hiddenapi_modular.go +1 −1 Original line number Diff line number Diff line Loading @@ -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 // error until the path is actually used. func retrieveBootDexJarFromHiddenAPIModule(ctx android.ModuleContext, module hiddenAPIModule) android.Path { bootDexJar := module.bootDexJar() bootDexJar := module.bootDexJar(ctx) if !bootDexJar.Valid() { fake := android.PathForModuleOut(ctx, fmt.Sprintf("fake/boot-dex/%s.jar", module.Name())) handleMissingDexBootFile(ctx, module, fake, bootDexJar.InvalidReason()) Loading java/java.go +1 −0 Original line number Diff line number Diff line Loading @@ -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 // Defer the error till a client tries to call DexJarBuildPath j.dexJarFileErr = err j.initHiddenAPIError(err) return } dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(j.BaseModuleName()) Loading java/sdk_library.go +1 −0 Original line number Diff line number Diff line Loading @@ -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 // Defer the error till a client tries to call DexJarBuildPath module.dexJarFileErr = err module.initHiddenAPIError(err) return } dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(module.BaseModuleName()) Loading Loading
apex/apex_test.go +78 −0 Original line number Diff line number Diff line Loading @@ -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 `) }) 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) { Loading
java/hiddenapi.go +12 −3 Original line number Diff line number Diff line Loading @@ -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 file so using the encoded dex jar here would result in a cycle in the ninja rules. bootDexJarPath OptionalDexJarPath bootDexJarPathErr error // 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 Loading @@ -56,7 +57,10 @@ type hiddenAPI struct { 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 } Loading @@ -77,7 +81,7 @@ type hiddenAPIModule interface { } type hiddenAPIIntf interface { bootDexJar() OptionalDexJarPath bootDexJar(ctx android.ModuleErrorfContext) OptionalDexJarPath classesJars() android.Paths uncompressDex() *bool } Loading Loading @@ -126,6 +130,11 @@ func (h *hiddenAPI) initHiddenAPI(ctx android.ModuleContext, dexJar OptionalDexJ 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 { // Get the configured platform and apex boot jars. nonApexBootJars := ctx.Config().NonApexBootJars() Loading
java/hiddenapi_modular.go +1 −1 Original line number Diff line number Diff line Loading @@ -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 // error until the path is actually used. func retrieveBootDexJarFromHiddenAPIModule(ctx android.ModuleContext, module hiddenAPIModule) android.Path { bootDexJar := module.bootDexJar() bootDexJar := module.bootDexJar(ctx) if !bootDexJar.Valid() { fake := android.PathForModuleOut(ctx, fmt.Sprintf("fake/boot-dex/%s.jar", module.Name())) handleMissingDexBootFile(ctx, module, fake, bootDexJar.InvalidReason()) Loading
java/java.go +1 −0 Original line number Diff line number Diff line Loading @@ -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 // Defer the error till a client tries to call DexJarBuildPath j.dexJarFileErr = err j.initHiddenAPIError(err) return } dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(j.BaseModuleName()) Loading
java/sdk_library.go +1 −0 Original line number Diff line number Diff line Loading @@ -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 // Defer the error till a client tries to call DexJarBuildPath module.dexJarFileErr = err module.initHiddenAPIError(err) return } dexJarFileApexRootRelative := ApexRootRelativePathToJavaLib(module.BaseModuleName()) Loading