Merge "Add tests for code that will be affected by resource processor feature" into main
diff --git a/bp2build/android_app_conversion_test.go b/bp2build/android_app_conversion_test.go
index 7f7aa6a..d1b4d40 100644
--- a/bp2build/android_app_conversion_test.go
+++ b/bp2build/android_app_conversion_test.go
@@ -349,7 +349,7 @@
}})
}
-func TestAndroidAppMinSdkProvided(t *testing.T) {
+func TestAndroidAppManifestSdkVersionsProvided(t *testing.T) {
runAndroidAppTestCase(t, Bp2buildTestCase{
Description: "Android app with value for min_sdk_version",
ModuleTypeUnderTest: "android_app",
@@ -359,7 +359,9 @@
android_app {
name: "foo",
sdk_version: "current",
- min_sdk_version: "24",
+ min_sdk_version: "24",
+ max_sdk_version: "30",
+ target_sdk_version: "29",
}
`,
ExpectedBazelTargets: []string{
@@ -367,14 +369,16 @@
"manifest": `"AndroidManifest.xml"`,
"resource_files": `[]`,
"manifest_values": `{
+ "maxSdkVersion": "30",
"minSdkVersion": "24",
+ "targetSdkVersion": "29",
}`,
"sdk_version": `"current"`,
}),
}})
}
-func TestAndroidAppMinSdkDefaultToSdkVersion(t *testing.T) {
+func TestAndroidAppMinAndTargetSdkDefaultToSdkVersion(t *testing.T) {
runAndroidAppTestCase(t, Bp2buildTestCase{
Description: "Android app with value for sdk_version",
ModuleTypeUnderTest: "android_app",
@@ -392,6 +396,7 @@
"resource_files": `[]`,
"manifest_values": `{
"minSdkVersion": "30",
+ "targetSdkVersion": "30",
}`,
"sdk_version": `"30"`,
}),
diff --git a/build_kzip.bash b/build_kzip.bash
index dddcd3f..4c42048 100755
--- a/build_kzip.bash
+++ b/build_kzip.bash
@@ -44,7 +44,7 @@
# xref_rust
)
-build/soong/soong_ui.bash --build-mode --all-modules --dir=$PWD -k "${kzip_targets[@]}"
+build/soong/soong_ui.bash --build-mode --all-modules --dir=$PWD -k --skip-soong-tests --ninja_weight_source=not_used "${kzip_targets[@]}"
# Build extraction file for Go the files in build/{blueprint,soong} directories.
declare -r abspath_out=$(realpath "${out}")
@@ -71,7 +71,7 @@
set +e
declare -r kzip_count=$(find "$out" -name '*.kzip' | wc -l)
-(($kzip_count>100000)) || { printf "Too few kzip files were generated: %d\n" $kzip_count; exit 1; }
+(($kzip_count>100000)) || { >&2 printf "ERROR: Too few kzip files were generated: %d\n" $kzip_count; exit 1; }
# Pack
declare -r allkzip="$KZIP_NAME.kzip"
diff --git a/cc/cc_test.go b/cc/cc_test.go
index 7534db2..fe54463 100644
--- a/cc/cc_test.go
+++ b/cc/cc_test.go
@@ -4979,6 +4979,7 @@
conly := []string{"-fPIC", "${config.CommonGlobalConlyflags}"}
cppOnly := []string{"-fPIC", "${config.CommonGlobalCppflags}", "${config.DeviceGlobalCppflags}", "${config.ArmCppflags}"}
+ ltoFlags := []string{"-flto=thin", "-fsplit-lto-unit"}
cflags := []string{"-Werror", "-std=candcpp"}
cstd := []string{"-std=gnu17", "-std=conly"}
@@ -5005,17 +5006,17 @@
{
name: "c",
src: "foo.c",
- expected: combineSlices(baseExpectedFlags, conly, expectedIncludes, cflags, cstd, lastIncludes, []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}),
+ expected: combineSlices(baseExpectedFlags, conly, expectedIncludes, cflags, ltoFlags, cstd, lastIncludes, []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}),
},
{
name: "cc",
src: "foo.cc",
- expected: combineSlices(baseExpectedFlags, cppOnly, expectedIncludes, cflags, cppstd, lastIncludes, []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}),
+ expected: combineSlices(baseExpectedFlags, cppOnly, expectedIncludes, cflags, ltoFlags, cppstd, lastIncludes, []string{"${config.NoOverrideGlobalCflags}", "${config.NoOverrideExternalGlobalCflags}"}),
},
{
name: "assemble",
src: "foo.s",
- expected: combineSlices(baseExpectedFlags, []string{"${config.CommonGlobalAsflags}"}, expectedIncludes, lastIncludes),
+ expected: combineSlices(baseExpectedFlags, []string{"${config.CommonGlobalAsflags}"}, expectedIncludes, ltoFlags, lastIncludes),
},
}
diff --git a/cc/config/arm_device.go b/cc/config/arm_device.go
index dec2b45..3397e3d 100644
--- a/cc/config/arm_device.go
+++ b/cc/config/arm_device.go
@@ -43,9 +43,7 @@
armNoFixCortexA8LdFlags = []string{"-Wl,--no-fix-cortex-a8"}
- armArmCflags = []string{
- "-fstrict-aliasing",
- }
+ armArmCflags = []string{}
armThumbCflags = []string{
"-mthumb",
diff --git a/cc/config/global.go b/cc/config/global.go
index 013b659..7f9a6e0 100644
--- a/cc/config/global.go
+++ b/cc/config/global.go
@@ -111,6 +111,9 @@
// Turn off FMA which got enabled by default in clang-r445002 (http://b/218805949)
"-ffp-contract=off",
+
+ // Using simple template names reduces the size of debug builds.
+ "-gsimple-template-names",
}
commonGlobalConlyflags = []string{}
diff --git a/cc/lto.go b/cc/lto.go
index 510dd79..ff2bf5a 100644
--- a/cc/lto.go
+++ b/cc/lto.go
@@ -47,6 +47,7 @@
} `android:"arch_variant"`
LtoEnabled bool `blueprint:"mutated"`
+ LtoDefault bool `blueprint:"mutated"`
// Dep properties indicate that this module needs to be built with LTO
// since it is an object dependency of an LTO module.
@@ -66,7 +67,34 @@
}
func (lto *lto) begin(ctx BaseModuleContext) {
- lto.Properties.LtoEnabled = lto.LTO(ctx)
+ // First, determine the module indepedent default LTO mode.
+ ltoDefault := GlobalThinLTO(ctx)
+ if ctx.Config().IsEnvTrue("DISABLE_LTO") {
+ ltoDefault = false
+ } else if ctx.Host() {
+ // Performance and binary size are less important for host binaries.
+ ltoDefault = false
+ }
+
+ // Then, determine the actual LTO mode to use. If different from `ltoDefault`, a variant needs
+ // to be created.
+ ltoEnabled := ltoDefault
+ if lto.Never() {
+ ltoEnabled = false
+ } else if lto.ThinLTO() {
+ // Module explicitly requests for LTO.
+ ltoEnabled = true
+ } else if ctx.testBinary() || ctx.testLibrary() {
+ // Do not enable LTO for tests for better debugging.
+ ltoEnabled = false
+ } else if ctx.isVndk() {
+ // FIXME: ThinLTO for VNDK produces different output.
+ // b/169217596
+ ltoEnabled = false
+ }
+
+ lto.Properties.LtoDefault = ltoDefault
+ lto.Properties.LtoEnabled = ltoEnabled
}
func (lto *lto) flags(ctx BaseModuleContext, flags Flags) Flags {
@@ -118,34 +146,6 @@
return flags
}
-// Determine which LTO mode to use for the given module.
-func (lto *lto) LTO(ctx BaseModuleContext) bool {
- if lto.Never() {
- return false
- }
- if ctx.Config().IsEnvTrue("DISABLE_LTO") {
- return false
- }
- // Module explicitly requests for LTO.
- if lto.ThinLTO() {
- return true
- }
- // LP32 has many subtle issues and less test coverage.
- if ctx.Arch().ArchType.Multilib == "lib32" {
- return false
- }
- // Performance and binary size are less important for host binaries and tests.
- if ctx.Host() || ctx.testBinary() || ctx.testLibrary() {
- return false
- }
- // FIXME: ThinLTO for VNDK produces different output.
- // b/169217596
- if ctx.isVndk() {
- return false
- }
- return GlobalThinLTO(ctx)
-}
-
func (lto *lto) ThinLTO() bool {
return lto != nil && proptools.Bool(lto.Properties.Lto.Thin)
}
@@ -155,15 +155,13 @@
}
func GlobalThinLTO(ctx android.BaseModuleContext) bool {
- return ctx.Config().IsEnvTrue("GLOBAL_THINLTO")
+ return !ctx.Config().IsEnvFalse("GLOBAL_THINLTO")
}
// Propagate lto requirements down from binaries
func ltoDepsMutator(mctx android.TopDownMutatorContext) {
- defaultLTOMode := GlobalThinLTO(mctx)
-
if m, ok := mctx.Module().(*Module); ok {
- if m.lto == nil || m.lto.Properties.LtoEnabled == defaultLTOMode {
+ if m.lto == nil || m.lto.Properties.LtoEnabled == m.lto.Properties.LtoDefault {
return
}
@@ -238,6 +236,7 @@
}
variation.Properties.PreventInstall = true
variation.Properties.HideFromMake = true
+ variation.lto.Properties.LtoDefault = m.lto.Properties.LtoDefault
variation.lto.Properties.LtoDep = false
variation.lto.Properties.NoLtoDep = false
}
diff --git a/genrule/allowlists.go b/genrule/allowlists.go
index c767685..012c59c 100644
--- a/genrule/allowlists.go
+++ b/genrule/allowlists.go
@@ -56,7 +56,6 @@
"RSTest-rscript",
"BluetoothGeneratedDumpsysBinarySchema_bfbs",
"TracingVMProtoStub_h",
- "FrontendStub_h",
"VehicleServerProtoStub_cc",
"AudioFocusControlProtoStub_cc",
"AudioFocusControlProtoStub_h",
@@ -98,7 +97,6 @@
"BlueberryFacadeGeneratedStub_cc",
"BlueberryFacadeGeneratedStub_h",
"BluetoothGeneratedDumpsysDataSchema_h",
- "FrontendStub_cc",
"OpenwrtControlServerProto_cc",
"OpenwrtControlServerProto_h",
"c2hal_test_genc++",
@@ -117,6 +115,11 @@
"nos_app_weaver_service_genc++_headers",
"nos_app_weaver_service_genc++_mock",
"nos_generator_test_service_genc++",
+ "framework-cppstream-protos",
+ "framework-javastream-protos",
+ "aidl_camera_build_version",
+ "cronet_aml_base_android_runtime_unchecked_jni_headers",
+ "cronet_aml_base_android_runtime_jni_headers",
}
SandboxingDenyPathList = []string{
diff --git a/java/app.go b/java/app.go
index d9272e4..fd626e1 100755
--- a/java/app.go
+++ b/java/app.go
@@ -1571,7 +1571,9 @@
}
type manifestValueAttribute struct {
- MinSdkVersion *string
+ MinSdkVersion *string
+ MaxSdkVersion *string
+ TargetSdkVersion *string
}
type bazelAndroidAppAttributes struct {
@@ -1601,12 +1603,25 @@
// MinSdkVersion(ctx) calls SdkVersion(ctx) if no value for min_sdk_version is set
minSdkVersion := a.MinSdkVersion(ctx)
if !minSdkVersion.IsPreview() && !minSdkVersion.IsInvalid() {
- minSdkStr, err := minSdkVersion.EffectiveVersionString(ctx)
- if err == nil {
+ if minSdkStr, err := minSdkVersion.EffectiveVersionString(ctx); err == nil {
manifestValues.MinSdkVersion = &minSdkStr
}
}
+ maxSdkVersion := a.MaxSdkVersion(ctx)
+ if !maxSdkVersion.IsPreview() && !maxSdkVersion.IsInvalid() {
+ if maxSdkStr, err := maxSdkVersion.EffectiveVersionString(ctx); err == nil {
+ manifestValues.MaxSdkVersion = &maxSdkStr
+ }
+ }
+
+ targetSdkVersion := a.TargetSdkVersion(ctx)
+ if !targetSdkVersion.IsPreview() && !targetSdkVersion.IsInvalid() {
+ if targetSdkStr, err := targetSdkVersion.EffectiveVersionString(ctx); err == nil {
+ manifestValues.TargetSdkVersion = &targetSdkStr
+ }
+ }
+
appAttrs := &bazelAndroidAppAttributes{
// TODO(b/209576404): handle package name override by product variable PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
Custom_package: a.overridableAppProperties.Package_name,
diff --git a/java/app_import.go b/java/app_import.go
index 9c01960..e25bcd1 100644
--- a/java/app_import.go
+++ b/java/app_import.go
@@ -17,6 +17,7 @@
// This file contains the module implementations for android_app_import and android_test_import.
import (
+ "fmt"
"reflect"
"github.com/google/blueprint"
@@ -334,11 +335,19 @@
// Sign or align the package if package has not been preprocessed
if proptools.Bool(a.properties.Preprocessed) {
- output := srcApk
+ var output android.WritablePath
if !proptools.Bool(a.properties.Skip_preprocessed_apk_checks) {
- writableOutput := android.PathForModuleOut(ctx, "validated-prebuilt", apkFilename)
- a.validatePreprocessedApk(ctx, srcApk, writableOutput)
- output = writableOutput
+ output = android.PathForModuleOut(ctx, "validated-prebuilt", apkFilename)
+ a.validatePreprocessedApk(ctx, srcApk, output)
+ } else {
+ // If using the input APK unmodified, still make a copy of it so that the output filename has the
+ // right basename.
+ output = android.PathForModuleOut(ctx, apkFilename)
+ ctx.Build(pctx, android.BuildParams{
+ Rule: android.Cp,
+ Input: srcApk,
+ Output: output,
+ })
}
a.outputFile = output
a.certificate = PresignedCertificate
@@ -410,6 +419,15 @@
return a.outputFile
}
+func (a *AndroidAppImport) OutputFiles(tag string) (android.Paths, error) {
+ switch tag {
+ case "":
+ return []android.Path{a.outputFile}, nil
+ default:
+ return nil, fmt.Errorf("unsupported module reference tag %q", tag)
+ }
+}
+
func (a *AndroidAppImport) JacocoReportClassesFile() android.Path {
return nil
}
diff --git a/rust/bindgen.go b/rust/bindgen.go
index 96645b0..7dc1b4b 100644
--- a/rust/bindgen.go
+++ b/rust/bindgen.go
@@ -247,7 +247,7 @@
var cmd, cmdDesc string
if b.Properties.Custom_bindgen != "" {
- cmd = ctx.GetDirectDepWithTag(b.Properties.Custom_bindgen, customBindgenDepTag).(*Module).HostToolPath().String()
+ cmd = ctx.GetDirectDepWithTag(b.Properties.Custom_bindgen, customBindgenDepTag).(android.HostToolProvider).HostToolPath().String()
cmdDesc = b.Properties.Custom_bindgen
} else {
cmd = "$bindgenCmd"
diff --git a/tests/sbom_test.sh b/tests/sbom_test.sh
index 19987f2..30a1d37 100755
--- a/tests/sbom_test.sh
+++ b/tests/sbom_test.sh
@@ -223,4 +223,65 @@
cleanup "${out_dir}"
}
-test_sbom_aosp_cf_x86_64_phone
\ No newline at end of file
+function test_sbom_unbundled_apex {
+ # Setup
+ out_dir="$(setup)"
+
+ # run_soong to build com.android.adbd.apex
+ run_soong "module_arm64" "${out_dir}" "sbom deapexer" "com.android.adbd"
+
+ deapexer=${out_dir}/host/linux-x86/bin/deapexer
+ debugfs=${out_dir}/host/linux-x86/bin/debugfs_static
+ apex_file=${out_dir}/target/product/module_arm64/system/apex/com.android.adbd.apex
+ echo "============ Diffing files in $apex_file and SBOM"
+ set +e
+ # deapexer prints the list of all files and directories
+ # sed extracts the file/directory names
+ # grep removes directories
+ # sed removes leading ./ in file names
+ diff -I /system/apex/com.android.adbd.apex -I apex_manifest.pb \
+ <($deapexer --debugfs_path=$debugfs list --extents ${apex_file} | sed -E 's#(.*) \[.*\]$#\1#' | grep -v "/$" | sed -E 's#^\./(.*)#\1#' | sort -n) \
+ <(grep '"fileName": ' ${apex_file}.spdx.json | sed -E 's/.*"fileName": "(.*)",/\1/' | sort -n )
+
+ if [ $? != "0" ]; then
+ echo "Diffs found in $apex_file and SBOM"
+ exit 1
+ else
+ echo "No diffs."
+ fi
+ set -e
+
+ # Teardown
+ cleanup "${out_dir}"
+}
+
+function test_sbom_unbundled_apk {
+ # Setup
+ out_dir="$(setup)"
+
+ # run_soong to build Browser2.apk
+ run_soong "module_arm64" "${out_dir}" "sbom" "Browser2"
+
+ sbom_file=${out_dir}/target/product/module_arm64/system/product/app/Browser2/Browser2.apk.spdx.json
+ echo "============ Diffing files in Browser2.apk and SBOM"
+ set +e
+ # There is only one file in SBOM of APKs
+ diff \
+ <(echo "/system/product/app/Browser2/Browser2.apk" ) \
+ <(grep '"fileName": ' ${sbom_file} | sed -E 's/.*"fileName": "(.*)",/\1/' )
+
+ if [ $? != "0" ]; then
+ echo "Diffs found in $sbom_file"
+ exit 1
+ else
+ echo "No diffs."
+ fi
+ set -e
+
+ # Teardown
+ cleanup "${out_dir}"
+}
+
+test_sbom_aosp_cf_x86_64_phone
+test_sbom_unbundled_apex
+test_sbom_unbundled_apk
\ No newline at end of file