diff --git a/android/bazel.go b/android/bazel.go index f72fd403e..75b13c956 100644 --- a/android/bazel.go +++ b/android/bazel.go @@ -219,6 +219,9 @@ var ( "libjemalloc5_integrationtest", "libjemalloc5_stresstestlib", "libjemalloc5_unittest", + + // APEX support + "com.android.runtime", // http://b/194746715, apex, depends on 'libc_malloc_debug' and 'libc_malloc_hooks' } // Per-module denylist of cc_library modules to only generate the static diff --git a/android/bazel_paths.go b/android/bazel_paths.go index 26cacdba8..b05077446 100644 --- a/android/bazel_paths.go +++ b/android/bazel_paths.go @@ -147,6 +147,10 @@ func BazelLabelForModuleSrcSingle(ctx BazelConversionPathContext, path string) b return BazelLabelForModuleSrcExcludes(ctx, []string{path}, []string(nil)).Includes[0] } +func BazelLabelForModuleDepSingle(ctx BazelConversionPathContext, path string) bazel.Label { + return BazelLabelForModuleDepsExcludes(ctx, []string{path}, []string(nil)).Includes[0] +} + // BazelLabelForModuleSrc expects a list of path (relative to local module directory) and module // references (":") and returns a bazel.LabelList{} containing the resolved references in // paths, relative to the local module, or Bazel-labels (absolute if in a different package or diff --git a/apex/apex.go b/apex/apex.go index d385ac1c3..0857946ea 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -3187,7 +3187,16 @@ func rModulesPackages() map[string][]string { // For Bazel / bp2build type bazelApexBundleAttributes struct { - Manifest bazel.LabelAttribute + Manifest bazel.LabelAttribute + Android_manifest bazel.LabelAttribute + File_contexts bazel.LabelAttribute + Key bazel.LabelAttribute + Certificate bazel.LabelAttribute + Min_sdk_version string + Updatable bazel.BoolAttribute + Installable bazel.BoolAttribute + Native_shared_libs bazel.LabelListAttribute + Binaries bazel.StringListAttribute } type bazelApexBundle struct { @@ -3220,14 +3229,63 @@ func ApexBundleBp2Build(ctx android.TopDownMutatorContext) { func apexBundleBp2BuildInternal(ctx android.TopDownMutatorContext, module *apexBundle) { var manifestLabelAttribute bazel.LabelAttribute - - manifestStringPtr := module.properties.Manifest if module.properties.Manifest != nil { - manifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *manifestStringPtr)) + manifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *module.properties.Manifest)) + } + + var androidManifestLabelAttribute bazel.LabelAttribute + if module.properties.AndroidManifest != nil { + androidManifestLabelAttribute.SetValue(android.BazelLabelForModuleSrcSingle(ctx, *module.properties.AndroidManifest)) + } + + var fileContextsLabelAttribute bazel.LabelAttribute + if module.properties.File_contexts != nil { + fileContextsLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.properties.File_contexts)) + } + + var minSdkVersion string + if module.properties.Min_sdk_version != nil { + minSdkVersion = *module.properties.Min_sdk_version + } + + var keyLabelAttribute bazel.LabelAttribute + if module.overridableProperties.Key != nil { + keyLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.overridableProperties.Key)) + } + + var certificateLabelAttribute bazel.LabelAttribute + if module.overridableProperties.Certificate != nil { + certificateLabelAttribute.SetValue(android.BazelLabelForModuleDepSingle(ctx, *module.overridableProperties.Certificate)) + } + + nativeSharedLibs := module.properties.ApexNativeDependencies.Native_shared_libs + nativeSharedLibsLabelList := android.BazelLabelForModuleDeps(ctx, nativeSharedLibs) + nativeSharedLibsLabelListAttribute := bazel.MakeLabelListAttribute(nativeSharedLibsLabelList) + + binaries := module.properties.ApexNativeDependencies.Binaries + binariesStringListAttribute := bazel.MakeStringListAttribute(binaries) + + var updatableAttribute bazel.BoolAttribute + if module.properties.Updatable != nil { + updatableAttribute.Value = module.properties.Updatable + } + + var installableAttribute bazel.BoolAttribute + if module.properties.Installable != nil { + installableAttribute.Value = module.properties.Installable } attrs := &bazelApexBundleAttributes{ - Manifest: manifestLabelAttribute, + Manifest: manifestLabelAttribute, + Android_manifest: androidManifestLabelAttribute, + File_contexts: fileContextsLabelAttribute, + Min_sdk_version: minSdkVersion, + Key: keyLabelAttribute, + Certificate: certificateLabelAttribute, + Updatable: updatableAttribute, + Installable: installableAttribute, + Native_shared_libs: nativeSharedLibsLabelListAttribute, + Binaries: binariesStringListAttribute, } props := bazel.BazelTargetModuleProperties{ diff --git a/apex/key.go b/apex/key.go index 8b33b593f..4bd0dc4f9 100644 --- a/apex/key.go +++ b/apex/key.go @@ -37,6 +37,7 @@ func registerApexKeyBuildComponents(ctx android.RegistrationContext) { type apexKey struct { android.ModuleBase + android.BazelModuleBase properties apexKeyProperties @@ -61,6 +62,7 @@ func ApexKeyFactory() android.Module { module := &apexKey{} module.AddProperties(&module.properties) android.InitAndroidArchModule(module, android.HostAndDeviceDefault, android.MultilibCommon) + android.InitBazelModule(module) return module } diff --git a/bp2build/apex_conversion_test.go b/bp2build/apex_conversion_test.go index f4a1016bc..e2e08bddd 100644 --- a/bp2build/apex_conversion_test.go +++ b/bp2build/apex_conversion_test.go @@ -17,6 +17,9 @@ package bp2build import ( "android/soong/android" "android/soong/apex" + "android/soong/cc" + "android/soong/java" + "testing" ) @@ -26,6 +29,13 @@ func runApexTestCase(t *testing.T, tc bp2buildTestCase) { } func registerApexModuleTypes(ctx android.RegistrationContext) { + // CC module types needed as they can be APEX dependencies + cc.RegisterCCBuildComponents(ctx) + + ctx.RegisterModuleType("cc_library", cc.LibraryFactory) + ctx.RegisterModuleType("apex_key", apex.ApexKeyFactory) + ctx.RegisterModuleType("android_app_certificate", java.AndroidAppCertificateFactory) + ctx.RegisterModuleType("filegroup", android.FileGroupFactory) } func TestApexBundleSimple(t *testing.T) { @@ -36,14 +46,94 @@ func TestApexBundleSimple(t *testing.T) { moduleTypeUnderTestBp2BuildMutator: apex.ApexBundleBp2Build, filesystem: map[string]string{}, blueprint: ` +apex_key { + name: "com.android.apogee.key", + public_key: "com.android.apogee.avbpubkey", + private_key: "com.android.apogee.pem", + bazel_module: { bp2build_available: false }, +} + +android_app_certificate { + name: "com.android.apogee.certificate", + certificate: "com.android.apogee", + bazel_module: { bp2build_available: false }, +} + +cc_library { + name: "native_shared_lib_1", + bazel_module: { bp2build_available: false }, +} + +cc_library { + name: "native_shared_lib_2", + bazel_module: { bp2build_available: false }, +} + +filegroup { + name: "com.android.apogee-file_contexts", + srcs: [ + "com.android.apogee-file_contexts", + ], + bazel_module: { bp2build_available: false }, +} + apex { - name: "apogee", - manifest: "manifest.json", + name: "com.android.apogee", + manifest: "apogee_manifest.json", + androidManifest: "ApogeeAndroidManifest.xml", + file_contexts: "com.android.apogee-file_contexts", + min_sdk_version: "29", + key: "com.android.apogee.key", + certificate: "com.android.apogee.certificate", + updatable: false, + installable: false, + native_shared_libs: [ + "native_shared_lib_1", + "native_shared_lib_2", + ], + binaries: [ + "binary_1", + "binary_2", + ], } `, expectedBazelTargets: []string{`apex( - name = "apogee", - manifest = "manifest.json", + name = "com.android.apogee", + android_manifest = "ApogeeAndroidManifest.xml", + binaries = [ + "binary_1", + "binary_2", + ], + certificate = ":com.android.apogee.certificate", + file_contexts = ":com.android.apogee-file_contexts", + installable = False, + key = ":com.android.apogee.key", + manifest = "apogee_manifest.json", + min_sdk_version = "29", + native_shared_libs = [ + ":native_shared_lib_1", + ":native_shared_lib_2", + ], + updatable = False, +)`}}) +} + +func TestApexBundleDefaultPropertyValues(t *testing.T) { + runApexTestCase(t, bp2buildTestCase{ + description: "apex - default property values", + moduleTypeUnderTest: "apex", + moduleTypeUnderTestFactory: apex.BundleFactory, + moduleTypeUnderTestBp2BuildMutator: apex.ApexBundleBp2Build, + filesystem: map[string]string{}, + blueprint: ` +apex { + name: "com.android.apogee", + manifest: "apogee_manifest.json", +} +`, + expectedBazelTargets: []string{`apex( + name = "com.android.apogee", + manifest = "apogee_manifest.json", )`}}) } diff --git a/java/app.go b/java/app.go index 4e967ad45..c69210f39 100755 --- a/java/app.go +++ b/java/app.go @@ -1104,6 +1104,8 @@ func AndroidTestHelperAppFactory() android.Module { type AndroidAppCertificate struct { android.ModuleBase + android.BazelModuleBase + properties AndroidAppCertificateProperties Certificate Certificate } @@ -1119,6 +1121,7 @@ func AndroidAppCertificateFactory() android.Module { module := &AndroidAppCertificate{} module.AddProperties(&module.properties) android.InitAndroidModule(module) + android.InitBazelModule(module) return module }