diff options
Diffstat (limited to 'java/app.go')
-rwxr-xr-x | java/app.go | 169 |
1 files changed, 147 insertions, 22 deletions
diff --git a/java/app.go b/java/app.go index 7cf86c02f..3ab814ab2 100755 --- a/java/app.go +++ b/java/app.go @@ -29,7 +29,9 @@ import ( "android/soong/bazel" "android/soong/cc" "android/soong/dexpreopt" + "android/soong/genrule" "android/soong/tradefed" + "android/soong/ui/metrics/bp2build_metrics_proto" ) func init() { @@ -315,6 +317,17 @@ func (a *AndroidApp) GenerateAndroidBuildActions(ctx android.ModuleContext) { a.generateJavaUsedByApex(ctx) } +func (a *AndroidApp) MinSdkVersion(ctx android.EarlyModuleContext) android.ApiLevel { + defaultMinSdkVersion := a.Module.MinSdkVersion(ctx) + if proptools.Bool(a.appProperties.Updatable) { + overrideApiLevel := android.MinSdkVersionFromValue(ctx, ctx.DeviceConfig().ApexGlobalMinSdkVersionOverride()) + if !overrideApiLevel.IsNone() && overrideApiLevel.CompareTo(defaultMinSdkVersion) > 0 { + return overrideApiLevel + } + } + return defaultMinSdkVersion +} + func (a *AndroidApp) checkAppSdkVersions(ctx android.ModuleContext) { if a.Updatable() { if !a.SdkVersion(ctx).Stable() { @@ -1059,6 +1072,7 @@ func AndroidAppFactory() android.Module { module.Module.dexProperties.Optimize.EnabledByDefault = true module.Module.dexProperties.Optimize.Shrink = proptools.BoolPtr(true) + module.Module.dexProperties.Optimize.Proguard_compatibility = proptools.BoolPtr(false) module.Module.properties.Instrument = true module.Module.properties.Supports_static_instrumentation = true @@ -1102,6 +1116,8 @@ type AndroidTest struct { testConfig android.Path extraTestConfigs android.Paths data android.Paths + + android.BazelModuleBase } func (a *AndroidTest) InstallInTestcases() bool { @@ -1219,6 +1235,8 @@ func AndroidTestFactory() android.Module { android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitOverridableModule(module, &module.overridableAppProperties.Overrides) + + android.InitBazelModule(module) return module } @@ -1240,6 +1258,8 @@ type AndroidTestHelperApp struct { AndroidApp appTestHelperAppProperties appTestHelperAppProperties + + android.BazelModuleBase } func (a *AndroidTestHelperApp) InstallInTestcases() bool { @@ -1271,6 +1291,7 @@ func AndroidTestHelperAppFactory() android.Module { android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitApexModule(module) + android.InitBazelModule(module) return module } @@ -1577,11 +1598,11 @@ type bazelAndroidAppCertificateAttributes struct { Certificate string } -func (m *AndroidAppCertificate) ConvertWithBp2build(ctx android.TopDownMutatorContext) { +func (m *AndroidAppCertificate) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { androidAppCertificateBp2Build(ctx, m) } -func androidAppCertificateBp2Build(ctx android.TopDownMutatorContext, module *AndroidAppCertificate) { +func androidAppCertificateBp2Build(ctx android.Bp2buildMutatorContext, module *AndroidAppCertificate) { var certificate string if module.properties.Certificate != nil { certificate = *module.properties.Certificate @@ -1613,23 +1634,30 @@ type bazelAndroidAppAttributes struct { Certificate bazel.LabelAttribute Certificate_name bazel.StringAttribute Manifest_values *manifestValueAttribute + Optimize *bool + Proguard_specs bazel.LabelListAttribute } -// ConvertWithBp2build is used to convert android_app to Bazel. -func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { - commonAttrs, bp2BuildInfo, supported := a.convertLibraryAttrsBp2Build(ctx) - if !supported { - return - } - depLabels := bp2BuildInfo.DepLabels - - deps := depLabels.Deps - deps.Append(depLabels.StaticDeps) - +func convertWithBp2build(ctx android.Bp2buildMutatorContext, a *AndroidApp) (bool, android.CommonAttributes, *bazelAndroidAppAttributes) { aapt, supported := a.convertAaptAttrsWithBp2Build(ctx) if !supported { - return + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} + } + if a.appProperties.Jni_uses_platform_apis != nil { + ctx.MarkBp2buildUnconvertible( + bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED, + "TODO - b/299360988: Add bp2build support for jni_uses_platform_apis", + ) + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} + } + if a.appProperties.Jni_uses_sdk_apis != nil { + ctx.MarkBp2buildUnconvertible( + bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED, + "TODO - b/299360988: Add bp2build support for jni_uses_sdk_apis", + ) + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} } + certificate, certificateName := android.BazelStringOrLabelFromProp(ctx, a.overridableAppProperties.Certificate) manifestValues := &manifestValueAttribute{} @@ -1664,11 +1692,63 @@ func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { Manifest_values: manifestValues, } - props := bazel.BazelTargetModuleProperties{ - Rule_class: "android_binary", - Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", + if !BoolDefault(a.dexProperties.Optimize.Enabled, true) { + appAttrs.Optimize = proptools.BoolPtr(false) + } else { + handCraftedFlags := "" + if Bool(a.dexProperties.Optimize.Ignore_warnings) { + handCraftedFlags += "-ignorewarning " + } + if !Bool(a.dexProperties.Optimize.Shrink) { + handCraftedFlags += "-dontshrink " + } + if !Bool(a.dexProperties.Optimize.Optimize) { + handCraftedFlags += "-dontoptimize " + } + if !Bool(a.dexProperties.Optimize.Obfuscate) { + handCraftedFlags += "-dontobfuscate " + } + appAttrs.Proguard_specs = bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, a.dexProperties.Optimize.Proguard_flags_files)) + if handCraftedFlags != "" { + generatedFlagFileRuleName := a.Name() + "_proguard_flags" + ctx.CreateBazelTargetModule(bazel.BazelTargetModuleProperties{ + Rule_class: "genrule", + }, android.CommonAttributes{ + Name: generatedFlagFileRuleName, + SkipData: proptools.BoolPtr(true), + }, &genrule.BazelGenruleAttributes{ + Outs: []string{a.Name() + "_proguard.flags"}, + Cmd: bazel.StringAttribute{ + Value: proptools.StringPtr("echo " + handCraftedFlags + "> $(OUTS)"), + }, + }) + appAttrs.Proguard_specs.Add(bazel.MakeLabelAttribute(":" + generatedFlagFileRuleName)) + } } + commonAttrs, bp2BuildInfo, supported := a.convertLibraryAttrsBp2Build(ctx) + if !supported { + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} + } + depLabels := bp2BuildInfo.DepLabels + + deps := depLabels.Deps + deps.Append(depLabels.StaticDeps) + + var jniDeps bazel.LabelListAttribute + archVariantProps := a.GetArchVariantProperties(ctx, &appProperties{}) + for axis, configToProps := range archVariantProps { + for config, _props := range configToProps { + if archProps, ok := _props.(*appProperties); ok { + archJniLibs := android.BazelLabelForModuleDeps( + ctx, + android.LastUniqueStrings(android.CopyOf(archProps.Jni_libs))) + jniDeps.SetSelectValue(axis, config, archJniLibs) + } + } + } + deps.Append(jniDeps) + if !bp2BuildInfo.hasKotlin { appAttrs.javaCommonAttributes = commonAttrs appAttrs.bazelAapt = aapt @@ -1694,10 +1774,55 @@ func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { } } - ctx.CreateBazelTargetModule( - props, - android.CommonAttributes{Name: a.Name(), SkipData: proptools.BoolPtr(true)}, - appAttrs, - ) + return true, android.CommonAttributes{Name: a.Name(), SkipData: proptools.BoolPtr(true)}, appAttrs +} + +// ConvertWithBp2build is used to convert android_app to Bazel. +func (a *AndroidApp) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, a); ok { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_binary", + Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", + } + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } + +} + +// ConvertWithBp2build is used to convert android_test to Bazel. +func (at *AndroidTest) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, &at.AndroidApp); ok { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_test", + Bzl_load_location: "//build/bazel/rules/android:android_test.bzl", + } + + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } + +} + +func (atha *AndroidTestHelperApp) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, &atha.AndroidApp); ok { + // an android_test_helper_app is an android_binary with testonly = True + commonAttrs.Testonly = proptools.BoolPtr(true) + + // additionally, it sets default values differently to android_app, + // https://cs.android.com/android/platform/superproject/main/+/main:build/soong/java/app.go;l=1273-1279;drc=e12c083198403ec694af6c625aed11327eb2bf7f + // + // installable: true (settable prop) + // use_embedded_native_libs: true (settable prop) + // lint.test: true (settable prop) + // optimize EnabledByDefault: true (blueprint mutated prop) + // AlwaysPackageNativeLibs: true (blueprint mutated prop) + // dexpreopt isTest: true (not prop) + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_binary", + Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", + } + + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } } |