Initial bp2build converter for android_app.

The only supported attributes at this point are:
- srcs
- manifest
- package_name
- resource_dirs
as they most easily map to bazel's android_binary's srcs, manifest, custom_package, and resource_files respectively.
Allow-listing all apps that use these fields, along with sdk_version and dex_preopt. The latter 2 are ignored by the converter,
- sdk_version because we're currently relying on a single pre-built SDK,
- dex_preopt because,
   1. though it is not supported in Bazel builds yet, it doesn't prevent the apps from building, and
   2. the apps being converted only use the dex_preopt attribute to disable dex_preopt, which is what is happening anyway.

Change-Id: I4a4f771eeb8f60a1cd4844b2ac1ce3df7c070e73
Test: ./build/bazel/scripts/run_presubmits.sh
Bug: 198224074
Bug: 203688791
This commit is contained in:
Romain Jobredeaux 2021-10-29 10:52:59 -04:00
parent fdee90d925
commit 1282c42484
5 changed files with 201 additions and 9 deletions

View file

@ -226,13 +226,48 @@ var (
// Configure modules in these directories to enable bp2build_available: true or false by default. // Configure modules in these directories to enable bp2build_available: true or false by default.
bp2buildDefaultConfig = Bp2BuildConfig{ bp2buildDefaultConfig = Bp2BuildConfig{
"art/libdexfile": Bp2BuildDefaultTrueRecursively, "art/libdexfile": Bp2BuildDefaultTrueRecursively,
"bionic": Bp2BuildDefaultTrueRecursively, "bionic": Bp2BuildDefaultTrueRecursively,
"bootable/recovery/tools/recovery_l10n": Bp2BuildDefaultTrue,
"build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively, "build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively,
"build/bazel/examples/apex/minimal": Bp2BuildDefaultTrueRecursively, "build/bazel/examples/apex/minimal": Bp2BuildDefaultTrueRecursively,
"build/soong": Bp2BuildDefaultTrue, "build/soong": Bp2BuildDefaultTrue,
"build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir "build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir
"cts/common/device-side/nativetesthelper/jni": Bp2BuildDefaultTrueRecursively, "cts/common/device-side/nativetesthelper/jni": Bp2BuildDefaultTrueRecursively,
"development/apps/DevelopmentSettings": Bp2BuildDefaultTrue,
"development/apps/Fallback": Bp2BuildDefaultTrue,
"development/apps/WidgetPreview": Bp2BuildDefaultTrue,
"development/samples/BasicGLSurfaceView": Bp2BuildDefaultTrue,
"development/samples/BluetoothChat": Bp2BuildDefaultTrue,
"development/samples/BrokenKeyDerivation": Bp2BuildDefaultTrue,
"development/samples/Compass": Bp2BuildDefaultTrue,
"development/samples/ContactManager": Bp2BuildDefaultTrue,
"development/samples/FixedGridLayout": Bp2BuildDefaultTrue,
"development/samples/HelloEffects": Bp2BuildDefaultTrue,
"development/samples/Home": Bp2BuildDefaultTrue,
"development/samples/HoneycombGallery": Bp2BuildDefaultTrue,
"development/samples/JetBoy": Bp2BuildDefaultTrue,
"development/samples/KeyChainDemo": Bp2BuildDefaultTrue,
"development/samples/LceDemo": Bp2BuildDefaultTrue,
"development/samples/LunarLander": Bp2BuildDefaultTrue,
"development/samples/MultiResolution": Bp2BuildDefaultTrue,
"development/samples/MultiWindow": Bp2BuildDefaultTrue,
"development/samples/NotePad": Bp2BuildDefaultTrue,
"development/samples/Obb": Bp2BuildDefaultTrue,
"development/samples/RSSReader": Bp2BuildDefaultTrue,
"development/samples/ReceiveShareDemo": Bp2BuildDefaultTrue,
"development/samples/SearchableDictionary": Bp2BuildDefaultTrue,
"development/samples/SipDemo": Bp2BuildDefaultTrue,
"development/samples/SkeletonApp": Bp2BuildDefaultTrue,
"development/samples/Snake": Bp2BuildDefaultTrue,
"development/samples/SpellChecker/": Bp2BuildDefaultTrueRecursively,
"development/samples/ThemedNavBarKeyboard": Bp2BuildDefaultTrue,
"development/samples/ToyVpn": Bp2BuildDefaultTrue,
"development/samples/TtsEngine": Bp2BuildDefaultTrue,
"development/samples/USB/AdbTest": Bp2BuildDefaultTrue,
"development/samples/USB/MissileLauncher": Bp2BuildDefaultTrue,
"development/samples/VoiceRecognitionService": Bp2BuildDefaultTrue,
"development/samples/VoicemailProviderDemo": Bp2BuildDefaultTrue,
"development/sdk": Bp2BuildDefaultTrueRecursively, "development/sdk": Bp2BuildDefaultTrueRecursively,
"external/arm-optimized-routines": Bp2BuildDefaultTrueRecursively, "external/arm-optimized-routines": Bp2BuildDefaultTrueRecursively,
"external/boringssl": Bp2BuildDefaultTrueRecursively, "external/boringssl": Bp2BuildDefaultTrueRecursively,
@ -259,9 +294,19 @@ var (
"external/selinux/libselinux": Bp2BuildDefaultTrueRecursively, "external/selinux/libselinux": Bp2BuildDefaultTrueRecursively,
"external/zlib": Bp2BuildDefaultTrueRecursively, "external/zlib": Bp2BuildDefaultTrueRecursively,
"external/zstd": Bp2BuildDefaultTrueRecursively, "external/zstd": Bp2BuildDefaultTrueRecursively,
"frameworks/base/media/tests/MediaDump": Bp2BuildDefaultTrue,
"frameworks/base/startop/apps/test": Bp2BuildDefaultTrue,
"frameworks/native/libs/adbd_auth": Bp2BuildDefaultTrueRecursively, "frameworks/native/libs/adbd_auth": Bp2BuildDefaultTrueRecursively,
"frameworks/native/opengl/tests/gl2_cameraeye": Bp2BuildDefaultTrue,
"frameworks/native/opengl/tests/gl2_java": Bp2BuildDefaultTrue,
"frameworks/native/opengl/tests/testLatency": Bp2BuildDefaultTrue,
"frameworks/native/opengl/tests/testPauseResume": Bp2BuildDefaultTrue,
"frameworks/native/opengl/tests/testViewport": Bp2BuildDefaultTrue,
"frameworks/proto_logging/stats/stats_log_api_gen": Bp2BuildDefaultTrueRecursively, "frameworks/proto_logging/stats/stats_log_api_gen": Bp2BuildDefaultTrueRecursively,
"libnativehelper": Bp2BuildDefaultTrueRecursively, "libnativehelper": Bp2BuildDefaultTrueRecursively,
"packages/apps/DevCamera": Bp2BuildDefaultTrue,
"packages/apps/HTMLViewer": Bp2BuildDefaultTrue,
"packages/apps/Protips": Bp2BuildDefaultTrue,
"packages/modules/adb": Bp2BuildDefaultTrue, "packages/modules/adb": Bp2BuildDefaultTrue,
"packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively,
"packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively,
@ -269,6 +314,9 @@ var (
"packages/modules/adb/pairing_connection": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/pairing_connection": Bp2BuildDefaultTrueRecursively,
"packages/modules/adb/proto": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/proto": Bp2BuildDefaultTrueRecursively,
"packages/modules/adb/tls": Bp2BuildDefaultTrueRecursively, "packages/modules/adb/tls": Bp2BuildDefaultTrueRecursively,
"packages/providers/MediaProvider/tools/dialogs": Bp2BuildDefaultTrue,
"packages/screensavers/Basic": Bp2BuildDefaultTrue,
"packages/services/Car/tests/SampleRearViewCamera": Bp2BuildDefaultTrue,
"prebuilts/clang/host/linux-x86": Bp2BuildDefaultTrueRecursively, "prebuilts/clang/host/linux-x86": Bp2BuildDefaultTrueRecursively,
"system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures "system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures
"system/core/debuggerd": Bp2BuildDefaultTrue, "system/core/debuggerd": Bp2BuildDefaultTrue,
@ -401,6 +449,7 @@ var (
"mdnsd", // http://b/202876379 has arch-variant static_executable "mdnsd", // http://b/202876379 has arch-variant static_executable
"acvp_modulewrapper", // disabled for android x86/x86_64 "acvp_modulewrapper", // disabled for android x86/x86_64
"CarHTMLViewer", // depends on unconverted modules android.car-stubs, car-ui-lib
} }
// Per-module denylist of cc_library modules to only generate the static // Per-module denylist of cc_library modules to only generate the static

View file

@ -279,6 +279,16 @@ func transformSubpackagePaths(ctx BazelConversionPathContext, paths bazel.LabelL
return newPaths return newPaths
} }
// Converts root-relative Paths to a list of bazel.Label relative to the module in ctx.
func RootToModuleRelativePaths(ctx BazelConversionPathContext, paths Paths) []bazel.Label {
var newPaths []bazel.Label
for _, path := range PathsWithModuleSrcSubDir(ctx, paths, "") {
s := path.Rel()
newPaths = append(newPaths, bazel.Label{Label: s})
}
return newPaths
}
// expandSrcsForBazel returns bazel.LabelList with paths rooted from the module's local source // expandSrcsForBazel returns bazel.LabelList with paths rooted from the module's local source
// directory and Bazel target labels, excluding those included in the excludes argument (which // directory and Bazel target labels, excluding those included in the excludes argument (which
// should already be expanded to resolve references to Soong-modules). Valid elements of paths // should already be expanded to resolve references to Soong-modules). Valid elements of paths
@ -328,12 +338,7 @@ func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes
// e.g. turn "math/*.c" in // e.g. turn "math/*.c" in
// external/arm-optimized-routines to external/arm-optimized-routines/math/*.c // external/arm-optimized-routines to external/arm-optimized-routines/math/*.c
rootRelativeGlobPath := pathForModuleSrc(ctx, p).String() rootRelativeGlobPath := pathForModuleSrc(ctx, p).String()
globbedPaths := GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes) expandedPaths = RootToModuleRelativePaths(ctx, GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes))
globbedPaths = PathsWithModuleSrcSubDir(ctx, globbedPaths, "")
for _, path := range globbedPaths {
s := path.Rel()
expandedPaths = append(expandedPaths, bazel.Label{Label: s})
}
} else { } else {
if !InList(p, expandedExcludes) { if !InList(p, expandedExcludes) {
expandedPaths = append(expandedPaths, bazel.Label{Label: p}) expandedPaths = append(expandedPaths, bazel.Label{Label: p})

View file

@ -0,0 +1,92 @@
// Copyright 2021 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package bp2build
import (
"android/soong/android"
"android/soong/java"
"testing"
)
func runAndroidAppTestCase(t *testing.T, tc bp2buildTestCase) {
t.Helper()
runBp2BuildTestCase(t, registerAndroidAppModuleTypes, tc)
}
func registerAndroidAppModuleTypes(ctx android.RegistrationContext) {
}
func TestMinimalAndroidApp(t *testing.T) {
runAndroidAppTestCase(t, bp2buildTestCase{
description: "Android app - simple example",
moduleTypeUnderTest: "android_app",
moduleTypeUnderTestFactory: java.AndroidAppFactory,
moduleTypeUnderTestBp2BuildMutator: java.AppBp2Build,
filesystem: map[string]string{
"app.java": "",
"res/res.png": "",
"AndroidManifest.xml": "",
},
blueprint: `
android_app {
name: "TestApp",
srcs: ["app.java"],
sdk_version: "current",
}
`,
expectedBazelTargets: []string{
makeBazelTarget("android_binary", "TestApp", attrNameToString{
"srcs": `["app.java"]`,
"manifest": `"AndroidManifest.xml"`,
"resource_files": `["res/res.png"]`,
}),
}})
}
func TestAndroidAppAllSupportedFields(t *testing.T) {
runAndroidAppTestCase(t, bp2buildTestCase{
description: "Android app - all supported fields",
moduleTypeUnderTest: "android_app",
moduleTypeUnderTestFactory: java.AndroidAppFactory,
moduleTypeUnderTestBp2BuildMutator: java.AppBp2Build,
filesystem: map[string]string{
"app.java": "",
"resa/res.png": "",
"resb/res.png": "",
"manifest/AndroidManifest.xml": "",
},
blueprint: `
android_app {
name: "TestApp",
srcs: ["app.java"],
sdk_version: "current",
package_name: "com.google",
resource_dirs: ["resa", "resb"],
manifest: "manifest/AndroidManifest.xml",
}
`,
expectedBazelTargets: []string{
makeBazelTarget("android_binary", "TestApp", attrNameToString{
"srcs": `["app.java"]`,
"manifest": `"manifest/AndroidManifest.xml"`,
"resource_files": `[
"resa/res.png",
"resb/res.png",
]`,
"custom_package": `"com.google"`,
}),
}})
}

View file

@ -43,7 +43,7 @@ var androidResourceIgnoreFilenames = []string{
// androidResourceGlob returns the list of files in the given directory, using the standard // androidResourceGlob returns the list of files in the given directory, using the standard
// exclusion patterns for Android resources. // exclusion patterns for Android resources.
func androidResourceGlob(ctx android.ModuleContext, dir android.Path) android.Paths { func androidResourceGlob(ctx android.EarlyModuleContext, dir android.Path) android.Paths {
return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames) return ctx.GlobFiles(filepath.Join(dir.String(), "**/*"), androidResourceIgnoreFilenames)
} }

View file

@ -45,6 +45,7 @@ func RegisterAppBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory) ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)
android.RegisterBp2BuildMutator("android_app_certificate", AndroidAppCertificateBp2Build) android.RegisterBp2BuildMutator("android_app_certificate", AndroidAppCertificateBp2Build)
android.RegisterBp2BuildMutator("android_app", AppBp2Build)
} }
// AndroidManifest.xml merging // AndroidManifest.xml merging
@ -139,6 +140,7 @@ type overridableAppProperties struct {
} }
type AndroidApp struct { type AndroidApp struct {
android.BazelModuleBase
Library Library
aapt aapt
android.OverridableModuleBase android.OverridableModuleBase
@ -1438,3 +1440,47 @@ func androidAppCertificateBp2BuildInternal(ctx android.TopDownMutatorContext, mo
ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name()}, attrs) ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: module.Name()}, attrs)
} }
type bazelAndroidAppAttributes struct {
Srcs bazel.LabelListAttribute
Manifest bazel.Label
Custom_package *string
Resource_files bazel.LabelListAttribute
}
// AppBp2Build is used for android_app.
func AppBp2Build(ctx android.TopDownMutatorContext) {
a, ok := ctx.Module().(*AndroidApp)
if !ok || !a.ConvertWithBp2build(ctx) {
return
}
if ctx.ModuleType() != "android_app" {
return
}
//TODO(b/209577426): Support multiple arch variants
srcs := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, a.properties.Srcs, a.properties.Exclude_srcs))
manifest := proptools.StringDefault(a.aaptProperties.Manifest, "AndroidManifest.xml")
resourceFiles := bazel.LabelList{
Includes: []bazel.Label{},
}
for _, dir := range android.PathsWithOptionalDefaultForModuleSrc(ctx, a.aaptProperties.Resource_dirs, "res") {
files := android.RootToModuleRelativePaths(ctx, androidResourceGlob(ctx, dir))
resourceFiles.Includes = append(resourceFiles.Includes, files...)
}
attrs := &bazelAndroidAppAttributes{
Srcs: srcs,
Manifest: android.BazelLabelForModuleSrcSingle(ctx, manifest),
// TODO(b/209576404): handle package name override by product variable PRODUCT_MANIFEST_PACKAGE_NAME_OVERRIDES
Custom_package: a.overridableAppProperties.Package_name,
Resource_files: bazel.MakeLabelListAttribute(resourceFiles),
}
props := bazel.BazelTargetModuleProperties{Rule_class: "android_binary",
Bzl_load_location: "@rules_android//rules:rules.bzl"}
ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: a.Name()}, attrs)
}