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:
parent
fdee90d925
commit
1282c42484
5 changed files with 201 additions and 9 deletions
|
@ -226,13 +226,48 @@ var (
|
|||
|
||||
// Configure modules in these directories to enable bp2build_available: true or false by default.
|
||||
bp2buildDefaultConfig = Bp2BuildConfig{
|
||||
"art/libdexfile": Bp2BuildDefaultTrueRecursively,
|
||||
"bionic": Bp2BuildDefaultTrueRecursively,
|
||||
"art/libdexfile": Bp2BuildDefaultTrueRecursively,
|
||||
"bionic": Bp2BuildDefaultTrueRecursively,
|
||||
"bootable/recovery/tools/recovery_l10n": Bp2BuildDefaultTrue,
|
||||
"build/bazel/examples/soong_config_variables": Bp2BuildDefaultTrueRecursively,
|
||||
"build/bazel/examples/apex/minimal": Bp2BuildDefaultTrueRecursively,
|
||||
"build/soong": Bp2BuildDefaultTrue,
|
||||
"build/soong/cc/libbuildversion": Bp2BuildDefaultTrue, // Skip tests subdir
|
||||
"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,
|
||||
"external/arm-optimized-routines": Bp2BuildDefaultTrueRecursively,
|
||||
"external/boringssl": Bp2BuildDefaultTrueRecursively,
|
||||
|
@ -259,9 +294,19 @@ var (
|
|||
"external/selinux/libselinux": Bp2BuildDefaultTrueRecursively,
|
||||
"external/zlib": Bp2BuildDefaultTrueRecursively,
|
||||
"external/zstd": Bp2BuildDefaultTrueRecursively,
|
||||
"frameworks/base/media/tests/MediaDump": Bp2BuildDefaultTrue,
|
||||
"frameworks/base/startop/apps/test": Bp2BuildDefaultTrue,
|
||||
"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,
|
||||
"libnativehelper": Bp2BuildDefaultTrueRecursively,
|
||||
"packages/apps/DevCamera": Bp2BuildDefaultTrue,
|
||||
"packages/apps/HTMLViewer": Bp2BuildDefaultTrue,
|
||||
"packages/apps/Protips": Bp2BuildDefaultTrue,
|
||||
"packages/modules/adb": Bp2BuildDefaultTrue,
|
||||
"packages/modules/adb/crypto": Bp2BuildDefaultTrueRecursively,
|
||||
"packages/modules/adb/libs": Bp2BuildDefaultTrueRecursively,
|
||||
|
@ -269,6 +314,9 @@ var (
|
|||
"packages/modules/adb/pairing_connection": Bp2BuildDefaultTrueRecursively,
|
||||
"packages/modules/adb/proto": 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,
|
||||
"system/apex": Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures
|
||||
"system/core/debuggerd": Bp2BuildDefaultTrue,
|
||||
|
@ -401,6 +449,7 @@ var (
|
|||
"mdnsd", // http://b/202876379 has arch-variant static_executable
|
||||
|
||||
"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
|
||||
|
|
|
@ -279,6 +279,16 @@ func transformSubpackagePaths(ctx BazelConversionPathContext, paths bazel.LabelL
|
|||
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
|
||||
// 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
|
||||
|
@ -328,12 +338,7 @@ func expandSrcsForBazel(ctx BazelConversionPathContext, paths, expandedExcludes
|
|||
// e.g. turn "math/*.c" in
|
||||
// external/arm-optimized-routines to external/arm-optimized-routines/math/*.c
|
||||
rootRelativeGlobPath := pathForModuleSrc(ctx, p).String()
|
||||
globbedPaths := GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes)
|
||||
globbedPaths = PathsWithModuleSrcSubDir(ctx, globbedPaths, "")
|
||||
for _, path := range globbedPaths {
|
||||
s := path.Rel()
|
||||
expandedPaths = append(expandedPaths, bazel.Label{Label: s})
|
||||
}
|
||||
expandedPaths = RootToModuleRelativePaths(ctx, GlobFiles(ctx, rootRelativeGlobPath, rootRelativeExpandedExcludes))
|
||||
} else {
|
||||
if !InList(p, expandedExcludes) {
|
||||
expandedPaths = append(expandedPaths, bazel.Label{Label: p})
|
||||
|
|
92
bp2build/android_app_conversion_test.go
Normal file
92
bp2build/android_app_conversion_test.go
Normal 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"`,
|
||||
}),
|
||||
}})
|
||||
}
|
|
@ -43,7 +43,7 @@ var androidResourceIgnoreFilenames = []string{
|
|||
|
||||
// androidResourceGlob returns the list of files in the given directory, using the standard
|
||||
// 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)
|
||||
}
|
||||
|
||||
|
|
46
java/app.go
46
java/app.go
|
@ -45,6 +45,7 @@ func RegisterAppBuildComponents(ctx android.RegistrationContext) {
|
|||
ctx.RegisterModuleType("override_android_test", OverrideAndroidTestModuleFactory)
|
||||
|
||||
android.RegisterBp2BuildMutator("android_app_certificate", AndroidAppCertificateBp2Build)
|
||||
android.RegisterBp2BuildMutator("android_app", AppBp2Build)
|
||||
}
|
||||
|
||||
// AndroidManifest.xml merging
|
||||
|
@ -139,6 +140,7 @@ type overridableAppProperties struct {
|
|||
}
|
||||
|
||||
type AndroidApp struct {
|
||||
android.BazelModuleBase
|
||||
Library
|
||||
aapt
|
||||
android.OverridableModuleBase
|
||||
|
@ -1438,3 +1440,47 @@ func androidAppCertificateBp2BuildInternal(ctx android.TopDownMutatorContext, mo
|
|||
|
||||
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)
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue