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.
|
// 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
|
||||||
|
|
|
@ -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})
|
||||||
|
|
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
|
// 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
46
java/app.go
46
java/app.go
|
@ -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)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue