Merge "Revert "Revert "[soong] Add memtag-stack sanitizer, switch to li...""
diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go
index 0cdf792..7a62bae 100644
--- a/android/allowlists/allowlists.go
+++ b/android/allowlists/allowlists.go
@@ -139,6 +139,7 @@
 		"external/lzma/C":                        Bp2BuildDefaultTrueRecursively,
 		"external/mdnsresponder":                 Bp2BuildDefaultTrueRecursively,
 		"external/minijail":                      Bp2BuildDefaultTrueRecursively,
+		"external/openscreen":                    Bp2BuildDefaultTrueRecursively,
 		"external/pcre":                          Bp2BuildDefaultTrueRecursively,
 		"external/protobuf":                      Bp2BuildDefaultTrueRecursively,
 		"external/python/six":                    Bp2BuildDefaultTrueRecursively,
@@ -225,6 +226,8 @@
 		"prebuilts/sdk/current/support":            Bp2BuildDefaultTrue,
 		"prebuilts/tools/common/m2":                Bp2BuildDefaultTrue,
 
+		"platform_testing/tests/example": Bp2BuildDefaultTrueRecursively,
+
 		"system/apex":                                            Bp2BuildDefaultFalse, // TODO(b/207466993): flaky failures
 		"system/apex/apexer":                                     Bp2BuildDefaultTrue,
 		"system/apex/libs":                                       Bp2BuildDefaultTrueRecursively,
@@ -240,6 +243,7 @@
 		"system/core/libprocessgroup/cgrouprc":                   Bp2BuildDefaultTrue,
 		"system/core/libprocessgroup/cgrouprc_format":            Bp2BuildDefaultTrue,
 		"system/core/libsystem":                                  Bp2BuildDefaultTrueRecursively,
+		"system/core/libsysutils":                                Bp2BuildDefaultTrueRecursively,
 		"system/core/libutils":                                   Bp2BuildDefaultTrueRecursively,
 		"system/core/libvndksupport":                             Bp2BuildDefaultTrueRecursively,
 		"system/core/property_service/libpropertyinfoparser":     Bp2BuildDefaultTrueRecursively,
@@ -262,12 +266,13 @@
 		"system/libhwbinder":                                     Bp2BuildDefaultTrueRecursively,
 		"system/libprocinfo":                                     Bp2BuildDefaultTrue,
 		"system/libziparchive":                                   Bp2BuildDefaultTrueRecursively,
-		"system/logging/liblog":                                  Bp2BuildDefaultTrueRecursively,
+		"system/logging":                                         Bp2BuildDefaultTrueRecursively,
 		"system/media/audio":                                     Bp2BuildDefaultTrueRecursively,
 		"system/media/audio_utils":                               Bp2BuildDefaultTrueRecursively,
 		"system/memory/libion":                                   Bp2BuildDefaultTrueRecursively,
 		"system/memory/libmemunreachable":                        Bp2BuildDefaultTrueRecursively,
 		"system/sepolicy/apex":                                   Bp2BuildDefaultTrueRecursively,
+		"system/testing/gtest_extras":                            Bp2BuildDefaultTrueRecursively,
 		"system/timezone/apex":                                   Bp2BuildDefaultTrueRecursively,
 		"system/timezone/output_data":                            Bp2BuildDefaultTrueRecursively,
 		"system/tools/sysprop":                                   Bp2BuildDefaultTrue,
@@ -295,6 +300,7 @@
 		"external/bazel-skylib":/* recursive = */ true,
 		"external/guava":/* recursive = */ true,
 		"external/jsr305":/* recursive = */ true,
+		"external/protobuf":/* recursive = */ false,
 		"frameworks/ex/common":/* recursive = */ true,
 
 		"packages/apps/Music":/* recursive = */ true,
@@ -302,6 +308,7 @@
 
 		"prebuilts/bazel":/* recursive = */ true,
 		"prebuilts/bundletool":/* recursive = */ true,
+		"prebuilts/clang/host/linux-x86":/* recursive = */ false,
 		"prebuilts/gcc":/* recursive = */ true,
 		"prebuilts/build-tools":/* recursive = */ true,
 		"prebuilts/jdk/jdk11":/* recursive = */ false,
@@ -430,6 +437,13 @@
 
 		// needed for aidl_interface's ndk backend
 		"libbinder_ndk",
+
+		"libusb",
+
+		// needed by liblogd
+		"ILogcatManagerService_aidl",
+		"libincremental_aidl-cpp",
+		"incremental_aidl",
 	}
 
 	Bp2buildModuleTypeAlwaysConvertList = []string{
@@ -441,10 +455,20 @@
 
 	Bp2buildModuleDoNotConvertList = []string{
 		// cc bugs
-		"libactivitymanager_aidl",                   // TODO(b/207426160): Unsupported use of aidl sources (via Dactivity_manager_procstate_aidl) in a cc_library
-		"gen-kotlin-build-file.py",                  // TODO(b/198619163) module has same name as source
+		"libactivitymanager_aidl", // TODO(b/207426160): Unsupported use of aidl sources (via Dactivity_manager_procstate_aidl) in a cc_library
+
+		// TODO(b/198619163) module has same name as source
+		"gen-kotlin-build-file.py",
+		"logtagd.rc",
+
 		"libgtest_ndk_c++", "libgtest_main_ndk_c++", // TODO(b/201816222): Requires sdk_version support.
-		"linkerconfig", "mdnsd", // TODO(b/202876379): has arch-variant static_executable
+
+		// TODO(b/202876379): has arch-variant static_executable
+		"linkerconfig",
+		"mdnsd",
+		"libcutils_test_static",
+		"KernelLibcutilsTest",
+
 		"linker",                 // TODO(b/228316882): cc_binary uses link_crt
 		"libdebuggerd",           // TODO(b/228314770): support product variable-specific header_libs
 		"versioner",              // TODO(b/228313961):  depends on prebuilt shared library libclang-cpp_host as a shared library, which does not supply expected providers for a shared library
@@ -514,7 +538,6 @@
 		"generated_android_icu4j_resources",                          // depends on unconverted modules: android_icu4j_srcgen_binary, soong_zip
 		"generated_android_icu4j_test_resources",                     // depends on unconverted modules: android_icu4j_srcgen_binary, soong_zip
 		"host-libprotobuf-java-nano",                                 // b/220869005, depends on libprotobuf-java-nano
-		"libadb_host",                                                // depends on unconverted modules: AdbWinApi, libopenscreen-discovery, libopenscreen-platform-impl, libusb
 		"libapexutil",                                                // depends on unconverted modules: apex-info-list-tinyxml
 		"libart",                                                     // depends on unconverted modules: apex-info-list-tinyxml, libtinyxml2, libnativeloader-headers, heapprofd_client_api, art_operator_srcs, libcpu_features, libodrstatslog, libelffile, art_cmdlineparser_headers, cpp-define-generator-definitions, libdexfile, libnativebridge, libnativeloader, libsigchain, libartbase, libprofile, cpp-define-generator-asm-support
 		"libart-runtime-gtest",                                       // depends on unconverted modules: libgtest_isolated, libart-compiler, libdexfile, libprofile, libartbase, libartbase-art-gtest
@@ -546,30 +569,468 @@
 		"truth-host-prebuilt", // depends on unconverted modules: truth-prebuilt
 		"truth-prebuilt",      // depends on unconverted modules: asm-7.0, guava
 
-		// b/215723302; awaiting tz{data,_version} to then rename targets conflicting with srcs
-		"tzdata",
-		"tz_version",
-
 		// '//bionic/libc:libc_bp2build_cc_library_static' is duplicated in the 'deps' attribute of rule
 		"toybox-static",
 
-		// Do not convert the following modules because of duplicate labels checking in Bazel.
-		// See b/241283350. They should be removed from this list once the bug is fixed.
-		"libartpalette",
-		"libartbase",
-		"libdexfile",
-		"libartbased",
-		"libdexfile_static",
-		"libartbase-testing",
-		"libartbased-testing",
-		"libdexfile_support",
-		"libunwindstack",
-		"libunwindstack_local",
-		"libfdtrack",
-		"libc_malloc_debug",
-		"libutilscallstack",
-		"libunwindstack_utils",
-		"unwind_for_offline",
+		// cc_test related.
+		// Failing host cc_tests
+		"memunreachable_unit_test",
+		"libprocinfo_test",
+		"ziparchive-tests",
+		"gtest_isolated_tests",
+		"libunwindstack_unit_test",
+		"task_profiles_test",
+		"power_tests", // failing test on server, but not on host
+
+		// reflect: call of reflect.Value.NumField on interface Value
+		// affects all cc_tests that depend on art_defaults
+		"libnativebridge-tests",
+		"libnativeloader_test",
+		"art_libnativebridge_cts_tests",
+		"art_standalone_libdexfile_external_tests",
+		"art_standalone_libdexfile_support_tests",
+		"libnativebridge-lazy-tests",
+		"libnativebridge-test-case",
+		"libnativebridge2-test-case",
+		"libnativebridge3-test-case",
+		"libnativebridge6-test-case",
+		"libnativebridge6prezygotefork",
+
+		// cc_test with unconverted deps, or are device-only (and not verified to pass yet)
+		"AMRWBEncTest",
+		"AmrnbDecoderTest",     // depends on unconverted modules: libaudioutils, libsndfile
+		"AmrnbEncoderTest",     // depends on unconverted modules: libaudioutils, libsndfile
+		"AmrwbDecoderTest",     // depends on unconverted modules: libsndfile, libaudioutils
+		"AmrwbEncoderTest",     // depends on unconverted modules: libaudioutils, libsndfile
+		"Mp3DecoderTest",       // depends on unconverted modules: libsndfile, libaudioutils
+		"Mpeg4H263DecoderTest", // depends on unconverted modules: libstagefright_foundation
+		"Mpeg4H263EncoderTest",
+		"adb_crypto_test",
+		"adb_pairing_auth_test",
+		"adb_pairing_connection_test",
+		"adb_tls_connection_test",
+		"adbd_test", // depends on unconverted modules: libusb
+		"avcdec",
+		"avcenc",
+		"bionic-benchmarks-tests",
+		"bionic-fortify-runtime-asan-test",
+		"bionic-stress-tests",
+		"bionic-unit-tests",
+		"bionic-unit-tests-glibc",
+		"bionic-unit-tests-static",
+		"boringssl_crypto_test",
+		"boringssl_ssl_test",
+		"cfi_test_helper",
+		"cfi_test_helper2",
+		"cintltst32",
+		"cintltst64",
+		"compare",
+		"cpuid",
+		"debuggerd_test", // depends on unconverted modules: libdebuggerd
+		"elftls_dlopen_ie_error_helper",
+		"exec_linker_helper",
+		"fastdeploy_test", // depends on unconverted modules: AdbWinApi, libadb_host, libandroidfw, libfastdeploy_host, libopenscreen-discovery, libopenscreen-platform-impl, libusb
+		"fdtrack_test",
+		"google-benchmark-test",
+		"googletest-param-test-test_ndk", // depends on unconverted modules: libgtest_ndk_c++
+		"gtest-typed-test_test",
+		"gtest-typed-test_test_ndk", // depends on unconverted modules: libgtest_ndk_c++, libgtest_main_ndk_c++
+		"gtest_ndk_tests",           // depends on unconverted modules: libgtest_ndk_c++, libgtest_main_ndk_c++
+		"gtest_ndk_tests_no_main",   // depends on unconverted modules: libgtest_ndk_c++
+		"gtest_prod_test_ndk",       // depends on unconverted modules: libgtest_ndk_c++, libgtest_main_ndk_c++
+		"gtest_tests",
+		"gtest_tests_no_main",
+		"gwp_asan_unittest",
+		"half_test",
+		"hashcombine_test",
+		"hevcdec",
+		"hevcenc",
+		"hwbinderThroughputTest", // depends on unconverted modules: android.hardware.tests.libhwbinder@1.0-impl.test, android.hardware.tests.libhwbinder@1.0
+		"i444tonv12_eg",
+		"icu4c_sample_break",
+		"intltest32",
+		"intltest64",
+		"ion-unit-tests",
+		"jemalloc5_integrationtests",
+		"jemalloc5_unittests",
+		"ld_config_test_helper",
+		"ld_preload_test_helper",
+		"libBionicCtsGtestMain", // depends on unconverted modules: libgtest_isolated
+		"libBionicLoaderTests",  // depends on unconverted modules: libmeminfo
+		"libapexutil_tests",     // depends on unconverted modules: apex-info-list-tinyxml, libapexutil
+		"libavservices_minijail_unittest",
+		"libcutils_sockets_test",
+		"libexpectedutils_test",
+		"libhwbinder_latency",
+		"liblog-host-test", // failing tests
+		"libminijail_test",
+		"libminijail_unittest_gtest",
+		"libpackagelistparser_test",
+		"libprotobuf_vendor_suffix_test",
+		"libstagefright_amrnbdec_test", // depends on unconverted modules: libsndfile, libaudioutils
+		"libstagefright_amrnbenc_test",
+		"libstagefright_amrwbdec_test", // depends on unconverted modules: libsndfile, libaudioutils
+		"libstagefright_m4vh263enc_test",
+		"libstagefright_mp3dec_test", // depends on unconverted modules: libsndfile, libaudioutils
+		"libstatssocket_test",
+		"libvndksupport-tests",
+		"libyuv_unittest",
+		"linker-unit-tests",
+		"malloc_debug_system_tests",
+		"malloc_debug_unit_tests",
+		"malloc_hooks_system_tests",
+		"mat_test",
+		"mathtest",
+		"memunreachable_binder_test", // depends on unconverted modules: libbinder
+		"memunreachable_test",
+		"metadata_tests",
+		"minijail0_cli_unittest_gtest",
+		"mpeg2dec",
+		"mvcdec",
+		"ns_hidden_child_helper",
+		"pngtest",
+		"preinit_getauxval_test_helper",
+		"preinit_syscall_test_helper",
+		"psnr",
+		"quat_test",
+		"rappor-tests", // depends on unconverted modules: jsr305, guava
+		"scudo_unit_tests",
+		"stats-log-api-gen-test", // depends on unconverted modules: libstats_proto_host
+		"syscall_filter_unittest_gtest",
+		"sysprop_test", // depends on unconverted modules: libcom.android.sysprop.tests
+		"thread_exit_cb_helper",
+		"tls_properties_helper",
+		"ulp",
+		"vec_test",
+		"yuvconstants",
+		"yuvconvert",
+		"zipalign_tests",
+		// "zlib_tests",
+
+		// cc_test_library
+		"clang_diagnostic_tests",
+		"exec_linker_helper_lib",
+		"fortify_disabled_for_tidy",
+		"ld_config_test_helper_lib1",
+		"ld_config_test_helper_lib2",
+		"ld_config_test_helper_lib3",
+		"ld_preload_test_helper_lib1",
+		"ld_preload_test_helper_lib2",
+		"libBionicElfTlsLoaderTests",
+		"libBionicElfTlsTests",
+		"libBionicElfTlsTests",
+		"libBionicFramePointerTests",
+		"libBionicFramePointerTests",
+		"libBionicStandardTests",
+		"libBionicStandardTests",
+		"libBionicTests",
+		"libart-broken",
+		"libatest_simple_zip",
+		"libcfi-test",
+		"libcfi-test-bad",
+		"libcrash_test",
+		// "libcrypto_fuzz_unsafe",
+		"libdl_preempt_test_1",
+		"libdl_preempt_test_2",
+		"libdl_test_df_1_global",
+		"libdlext_test",
+		"libdlext_test_different_soname",
+		"libdlext_test_fd",
+		"libdlext_test_norelro",
+		"libdlext_test_recursive",
+		"libdlext_test_zip",
+		"libfortify1-new-tests-clang",
+		"libfortify1-new-tests-clang",
+		"libfortify1-tests-clang",
+		"libfortify1-tests-clang",
+		"libfortify2-new-tests-clang",
+		"libfortify2-new-tests-clang",
+		"libfortify2-tests-clang",
+		"libfortify2-tests-clang",
+		"libgnu-hash-table-library",
+		"libicutest_static",
+		"liblinker_reloc_bench_000",
+		"liblinker_reloc_bench_001",
+		"liblinker_reloc_bench_002",
+		"liblinker_reloc_bench_003",
+		"liblinker_reloc_bench_004",
+		"liblinker_reloc_bench_005",
+		"liblinker_reloc_bench_006",
+		"liblinker_reloc_bench_007",
+		"liblinker_reloc_bench_008",
+		"liblinker_reloc_bench_009",
+		"liblinker_reloc_bench_010",
+		"liblinker_reloc_bench_011",
+		"liblinker_reloc_bench_012",
+		"liblinker_reloc_bench_013",
+		"liblinker_reloc_bench_014",
+		"liblinker_reloc_bench_015",
+		"liblinker_reloc_bench_016",
+		"liblinker_reloc_bench_017",
+		"liblinker_reloc_bench_018",
+		"liblinker_reloc_bench_019",
+		"liblinker_reloc_bench_020",
+		"liblinker_reloc_bench_021",
+		"liblinker_reloc_bench_022",
+		"liblinker_reloc_bench_023",
+		"liblinker_reloc_bench_024",
+		"liblinker_reloc_bench_025",
+		"liblinker_reloc_bench_026",
+		"liblinker_reloc_bench_027",
+		"liblinker_reloc_bench_028",
+		"liblinker_reloc_bench_029",
+		"liblinker_reloc_bench_030",
+		"liblinker_reloc_bench_031",
+		"liblinker_reloc_bench_032",
+		"liblinker_reloc_bench_033",
+		"liblinker_reloc_bench_034",
+		"liblinker_reloc_bench_035",
+		"liblinker_reloc_bench_036",
+		"liblinker_reloc_bench_037",
+		"liblinker_reloc_bench_038",
+		"liblinker_reloc_bench_039",
+		"liblinker_reloc_bench_040",
+		"liblinker_reloc_bench_041",
+		"liblinker_reloc_bench_042",
+		"liblinker_reloc_bench_043",
+		"liblinker_reloc_bench_044",
+		"liblinker_reloc_bench_045",
+		"liblinker_reloc_bench_046",
+		"liblinker_reloc_bench_047",
+		"liblinker_reloc_bench_048",
+		"liblinker_reloc_bench_049",
+		"liblinker_reloc_bench_050",
+		"liblinker_reloc_bench_051",
+		"liblinker_reloc_bench_052",
+		"liblinker_reloc_bench_053",
+		"liblinker_reloc_bench_054",
+		"liblinker_reloc_bench_055",
+		"liblinker_reloc_bench_056",
+		"liblinker_reloc_bench_057",
+		"liblinker_reloc_bench_058",
+		"liblinker_reloc_bench_059",
+		"liblinker_reloc_bench_060",
+		"liblinker_reloc_bench_061",
+		"liblinker_reloc_bench_062",
+		"liblinker_reloc_bench_063",
+		"liblinker_reloc_bench_064",
+		"liblinker_reloc_bench_065",
+		"liblinker_reloc_bench_066",
+		"liblinker_reloc_bench_067",
+		"liblinker_reloc_bench_068",
+		"liblinker_reloc_bench_069",
+		"liblinker_reloc_bench_070",
+		"liblinker_reloc_bench_071",
+		"liblinker_reloc_bench_072",
+		"liblinker_reloc_bench_073",
+		"liblinker_reloc_bench_074",
+		"liblinker_reloc_bench_075",
+		"liblinker_reloc_bench_076",
+		"liblinker_reloc_bench_077",
+		"liblinker_reloc_bench_078",
+		"liblinker_reloc_bench_079",
+		"liblinker_reloc_bench_080",
+		"liblinker_reloc_bench_081",
+		"liblinker_reloc_bench_082",
+		"liblinker_reloc_bench_083",
+		"liblinker_reloc_bench_084",
+		"liblinker_reloc_bench_085",
+		"liblinker_reloc_bench_086",
+		"liblinker_reloc_bench_087",
+		"liblinker_reloc_bench_088",
+		"liblinker_reloc_bench_089",
+		"liblinker_reloc_bench_090",
+		"liblinker_reloc_bench_091",
+		"liblinker_reloc_bench_092",
+		"liblinker_reloc_bench_093",
+		"liblinker_reloc_bench_094",
+		"liblinker_reloc_bench_095",
+		"liblinker_reloc_bench_096",
+		"liblinker_reloc_bench_097",
+		"liblinker_reloc_bench_098",
+		"liblinker_reloc_bench_099",
+		"liblinker_reloc_bench_100",
+		"liblinker_reloc_bench_101",
+		"liblinker_reloc_bench_102",
+		"liblinker_reloc_bench_103",
+		"liblinker_reloc_bench_104",
+		"liblinker_reloc_bench_105",
+		"liblinker_reloc_bench_106",
+		"liblinker_reloc_bench_107",
+		"liblinker_reloc_bench_108",
+		"liblinker_reloc_bench_109",
+		"liblinker_reloc_bench_110",
+		"liblinker_reloc_bench_111",
+		"liblinker_reloc_bench_112",
+		"liblinker_reloc_bench_113",
+		"liblinker_reloc_bench_114",
+		"liblinker_reloc_bench_115",
+		"liblinker_reloc_bench_116",
+		"liblinker_reloc_bench_117",
+		"liblinker_reloc_bench_118",
+		"liblinker_reloc_bench_119",
+		"liblinker_reloc_bench_120",
+		"liblinker_reloc_bench_121",
+		"liblinker_reloc_bench_122",
+		"liblinker_reloc_bench_123",
+		"liblinker_reloc_bench_124",
+		"liblinker_reloc_bench_125",
+		"liblinker_reloc_bench_126",
+		"liblinker_reloc_bench_127",
+		"liblinker_reloc_bench_128",
+		"liblinker_reloc_bench_129",
+		"liblinker_reloc_bench_130",
+		"liblinker_reloc_bench_131",
+		"liblinker_reloc_bench_132",
+		"liblinker_reloc_bench_133",
+		"liblinker_reloc_bench_134",
+		"liblinker_reloc_bench_135",
+		"liblinker_reloc_bench_136",
+		"liblinker_reloc_bench_137",
+		"liblinker_reloc_bench_138",
+		"liblinker_reloc_bench_139",
+		"liblinker_reloc_bench_140",
+		"liblinker_reloc_bench_141",
+		"liblinker_reloc_bench_142",
+		"liblinker_reloc_bench_143",
+		"liblinker_reloc_bench_144",
+		"liblinker_reloc_bench_145",
+		"liblinker_reloc_bench_146",
+		"liblinker_reloc_bench_147",
+		"liblinker_reloc_bench_148",
+		"liblinker_reloc_bench_149",
+		"liblinker_reloc_bench_150",
+		"liblinker_reloc_bench_151",
+		"liblinker_reloc_bench_152",
+		"liblinker_reloc_bench_153",
+		"liblinker_reloc_bench_154",
+		"liblinker_reloc_bench_155",
+		"liblinker_reloc_bench_156",
+		"liblinker_reloc_bench_157",
+		"liblinker_reloc_bench_158",
+		"liblinker_reloc_bench_159",
+		"liblinker_reloc_bench_160",
+		"liblinker_reloc_bench_161",
+		"liblinker_reloc_bench_162",
+		"liblinker_reloc_bench_163",
+		"liblinker_reloc_bench_164",
+		"liblinker_reloc_bench_165",
+		"liblinker_reloc_bench_166",
+		"liblinker_reloc_bench_167",
+		"liblinker_reloc_bench_168",
+		"libns_hidden_child_app",
+		"libns_hidden_child_global",
+		"libns_hidden_child_internal",
+		"libns_hidden_child_public",
+		"libnstest_dlopened",
+		"libnstest_ns_a_public1",
+		"libnstest_ns_a_public1_internal",
+		"libnstest_ns_b_public2",
+		"libnstest_ns_b_public3",
+		"libnstest_private",
+		"libnstest_private_external",
+		"libnstest_public",
+		"libnstest_public_internal",
+		"libnstest_root",
+		"libnstest_root_not_isolated",
+		"librelocations-ANDROID_REL",
+		"librelocations-ANDROID_RELR",
+		"librelocations-RELR",
+		"librelocations-fat",
+		"libsegment_gap_inner",
+		"libsegment_gap_outer",
+		// "libssl_fuzz_unsafe",
+		"libstatssocket_private",
+		"libsysv-hash-table-library",
+		"libtest_atexit",
+		"libtest_check_order_dlsym",
+		"libtest_check_order_dlsym_1_left",
+		"libtest_check_order_dlsym_2_right",
+		"libtest_check_order_dlsym_3_c",
+		"libtest_check_order_dlsym_a",
+		"libtest_check_order_dlsym_b",
+		"libtest_check_order_dlsym_d",
+		"libtest_check_order_reloc_root",
+		"libtest_check_order_reloc_root_1",
+		"libtest_check_order_reloc_root_2",
+		"libtest_check_order_reloc_siblings",
+		"libtest_check_order_reloc_siblings_1",
+		"libtest_check_order_reloc_siblings_2",
+		"libtest_check_order_reloc_siblings_3",
+		"libtest_check_order_reloc_siblings_a",
+		"libtest_check_order_reloc_siblings_b",
+		"libtest_check_order_reloc_siblings_c",
+		"libtest_check_order_reloc_siblings_c_1",
+		"libtest_check_order_reloc_siblings_c_2",
+		"libtest_check_order_reloc_siblings_d",
+		"libtest_check_order_reloc_siblings_e",
+		"libtest_check_order_reloc_siblings_f",
+		"libtest_check_rtld_next_from_library",
+		"libtest_dlopen_df_1_global",
+		"libtest_dlopen_from_ctor",
+		"libtest_dlopen_from_ctor_main",
+		"libtest_dlopen_weak_undefined_func",
+		"libtest_dlsym_df_1_global",
+		"libtest_dlsym_from_this",
+		"libtest_dlsym_from_this_child",
+		"libtest_dlsym_from_this_grandchild",
+		"libtest_dlsym_weak_func",
+		"libtest_dt_runpath_a",
+		"libtest_dt_runpath_b",
+		"libtest_dt_runpath_c",
+		"libtest_dt_runpath_d",
+		"libtest_dt_runpath_d_zip",
+		"libtest_dt_runpath_x",
+		"libtest_dt_runpath_y",
+		"libtest_elftls_dynamic",
+		"libtest_elftls_dynamic_filler_1",
+		"libtest_elftls_dynamic_filler_2",
+		"libtest_elftls_dynamic_filler_3",
+		"libtest_elftls_shared_var",
+		"libtest_elftls_shared_var_ie",
+		"libtest_elftls_tprel",
+		"libtest_empty",
+		"libtest_ifunc",
+		"libtest_ifunc_variable",
+		"libtest_ifunc_variable_impl",
+		"libtest_indirect_thread_local_dtor",
+		"libtest_init_fini_order_child",
+		"libtest_init_fini_order_grand_child",
+		"libtest_init_fini_order_root",
+		"libtest_init_fini_order_root2",
+		"libtest_missing_symbol",
+		"libtest_missing_symbol_child_private",
+		"libtest_missing_symbol_child_public",
+		"libtest_missing_symbol_root",
+		"libtest_nodelete_1",
+		"libtest_nodelete_2",
+		"libtest_nodelete_dt_flags_1",
+		"libtest_pthread_atfork",
+		"libtest_relo_check_dt_needed_order",
+		"libtest_relo_check_dt_needed_order_1",
+		"libtest_relo_check_dt_needed_order_2",
+		"libtest_simple",
+		"libtest_thread_local_dtor",
+		"libtest_thread_local_dtor2",
+		"libtest_two_parents_child",
+		"libtest_two_parents_parent1",
+		"libtest_two_parents_parent2",
+		"libtest_versioned_lib",
+		"libtest_versioned_libv1",
+		"libtest_versioned_libv2",
+		"libtest_versioned_otherlib",
+		"libtest_versioned_otherlib_empty",
+		"libtest_versioned_uselibv1",
+		"libtest_versioned_uselibv2",
+		"libtest_versioned_uselibv2_other",
+		"libtest_versioned_uselibv3_other",
+		"libtest_with_dependency",
+		"libtest_with_dependency_loop",
+		"libtest_with_dependency_loop_a",
+		"libtest_with_dependency_loop_b",
+		"libtest_with_dependency_loop_b_tmp",
+		"libtest_with_dependency_loop_c",
+		"libtestshared",
 	}
 
 	Bp2buildCcLibraryStaticOnlyList = []string{}
diff --git a/android/bazel.go b/android/bazel.go
index 15729c1..27ec92b 100644
--- a/android/bazel.go
+++ b/android/bazel.go
@@ -17,9 +17,6 @@
 import (
 	"bufio"
 	"errors"
-	"fmt"
-	"io/ioutil"
-	"path/filepath"
 	"strings"
 
 	"github.com/google/blueprint"
@@ -117,7 +114,6 @@
 	GetBazelLabel(ctx BazelConversionPathContext, module blueprint.Module) string
 	ShouldConvertWithBp2build(ctx BazelConversionContext) bool
 	shouldConvertWithBp2build(ctx bazelOtherModuleContext, module blueprint.Module) bool
-	GetBazelBuildFileContents(c Config, path, name string) (string, error)
 	ConvertWithBp2build(ctx TopDownMutatorContext)
 
 	// namespacedVariableProps is a map from a soong config variable namespace
@@ -498,28 +494,6 @@
 	return false, packagePath
 }
 
-// GetBazelBuildFileContents returns the file contents of a hand-crafted BUILD file if available or
-// an error if there are errors reading the file.
-// TODO(b/181575318): currently we append the whole BUILD file, let's change that to do
-// something more targeted based on the rule type and target.
-func (b *BazelModuleBase) GetBazelBuildFileContents(c Config, path, name string) (string, error) {
-	if !strings.Contains(b.HandcraftedLabel(), path) {
-		return "", fmt.Errorf("%q not found in bazel_module.label %q", path, b.HandcraftedLabel())
-	}
-	name = filepath.Join(path, name)
-	f, err := c.fs.Open(name)
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	data, err := ioutil.ReadAll(f)
-	if err != nil {
-		return "", err
-	}
-	return string(data[:]), nil
-}
-
 func registerBp2buildConversionMutator(ctx RegisterMutatorsContext) {
 	ctx.TopDown("bp2build_conversion", convertWithBp2build).Parallel()
 }
diff --git a/android/paths.go b/android/paths.go
index 1f69125..27f4bf5 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -1474,41 +1474,6 @@
 	return PathForOutput(ctx, ".intermediates", ctx.ModuleDir(), ctx.ModuleName(), ctx.ModuleSubDir())
 }
 
-// PathForVndkRefAbiDump returns an OptionalPath representing the path of the
-// reference abi dump for the given module. This is not guaranteed to be valid.
-func PathForVndkRefAbiDump(ctx ModuleInstallPathContext, version, fileName string,
-	isNdk, isVndk, isGzip bool) OptionalPath {
-
-	currentArchType := ctx.Arch().ArchType
-	primaryArchType := ctx.Config().DevicePrimaryArchType()
-	archName := currentArchType.String()
-	if currentArchType != primaryArchType {
-		archName += "_" + primaryArchType.String()
-	}
-
-	var dirName string
-	if isNdk {
-		dirName = "ndk"
-	} else if isVndk {
-		dirName = "vndk"
-	} else {
-		dirName = "platform" // opt-in libs
-	}
-
-	binderBitness := ctx.DeviceConfig().BinderBitness()
-
-	var ext string
-	if isGzip {
-		ext = ".lsdump.gz"
-	} else {
-		ext = ".lsdump"
-	}
-
-	return ExistentPathForSource(ctx, "prebuilts", "abi-dumps", dirName,
-		version, binderBitness, archName, "source-based",
-		fileName+ext)
-}
-
 // PathForModuleOut returns a Path representing the paths... under the module's
 // output directory.
 func PathForModuleOut(ctx ModuleOutPathContext, paths ...string) ModuleOutPath {
diff --git a/bp2build/Android.bp b/bp2build/Android.bp
index cb25627..3d9fc5a 100644
--- a/bp2build/Android.bp
+++ b/bp2build/Android.bp
@@ -51,6 +51,7 @@
         "cc_prebuilt_library_conversion_test.go",
         "cc_prebuilt_library_shared_test.go",
         "cc_prebuilt_library_static_test.go",
+        "cc_test_conversion_test.go",
         "cc_yasm_conversion_test.go",
         "conversion_test.go",
         "filegroup_conversion_test.go",
@@ -63,6 +64,7 @@
         "java_plugin_conversion_test.go",
         "java_proto_conversion_test.go",
         "linker_config_conversion_test.go",
+        "ndk_headers_conversion_test.go",
         "performance_test.go",
         "prebuilt_etc_conversion_test.go",
         "python_binary_conversion_test.go",
diff --git a/bp2build/aar_conversion_test.go b/bp2build/aar_conversion_test.go
index 8e7c2b5..ff82694 100644
--- a/bp2build/aar_conversion_test.go
+++ b/bp2build/aar_conversion_test.go
@@ -53,7 +53,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget(
+			MakeBazelTarget(
 				"android_library",
 				"TestLib",
 				AttrNameToString{
@@ -120,7 +120,7 @@
 }
 `,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget(
+				MakeBazelTarget(
 					"aar_import",
 					"TestImport",
 					AttrNameToString{
diff --git a/bp2build/android_app_conversion_test.go b/bp2build/android_app_conversion_test.go
index a37af12..e112be3 100644
--- a/bp2build/android_app_conversion_test.go
+++ b/bp2build/android_app_conversion_test.go
@@ -47,7 +47,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("android_binary", "TestApp", AttrNameToString{
+			MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
 				"srcs":           `["app.java"]`,
 				"manifest":       `"AndroidManifest.xml"`,
 				"resource_files": `["res/res.png"]`,
@@ -79,7 +79,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("android_binary", "TestApp", AttrNameToString{
+			MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
 				"srcs":     `["app.java"]`,
 				"manifest": `"manifest/AndroidManifest.xml"`,
 				"resource_files": `[
@@ -119,7 +119,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("android_binary", "TestApp", AttrNameToString{
+			MakeBazelTarget("android_binary", "TestApp", AttrNameToString{
 				"srcs": `select({
         "//build/bazel/platforms/arch:arm": ["arm.java"],
         "//build/bazel/platforms/arch:x86": ["x86.java"],
diff --git a/bp2build/apex_conversion_test.go b/bp2build/apex_conversion_test.go
index 415e695..b0a2966 100644
--- a/bp2build/apex_conversion_test.go
+++ b/bp2build/apex_conversion_test.go
@@ -141,7 +141,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"android_manifest": `"ApogeeAndroidManifest.xml"`,
 				"binaries": `[
         ":cc_binary_1",
@@ -203,7 +203,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"file_contexts": `"//a/b:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 			}),
@@ -223,7 +223,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"file_contexts": `"file_contexts_file"`,
 				"manifest":      `"apex_manifest.json"`,
 			}),
@@ -252,7 +252,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 			}),
@@ -275,7 +275,7 @@
 		},
 		Blueprint: createMultilibBlueprint("both"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"native_shared_libs_32": `[
         ":native_shared_lib_1",
         ":native_shared_lib_3",
@@ -319,7 +319,7 @@
 		},
 		Blueprint: createMultilibBlueprint("first"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"native_shared_libs_32": `select({
         "//build/bazel/platforms/arch:arm": [
             ":native_shared_lib_1",
@@ -368,7 +368,7 @@
 		},
 		Blueprint: createMultilibBlueprint("32"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"native_shared_libs_32": `[
         ":native_shared_lib_1",
         ":native_shared_lib_3",
@@ -399,7 +399,7 @@
 		},
 		Blueprint: createMultilibBlueprint("64"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 				"native_shared_libs_64": `select({
         "//build/bazel/platforms/arch:arm64": [
             ":native_shared_lib_1",
@@ -439,7 +439,7 @@
 	manifest: "apogee_manifest.json",
 }
 `,
-		ExpectedBazelTargets: []string{makeBazelTarget("apex", "com.android.apogee", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("apex", "com.android.apogee", AttrNameToString{
 			"manifest":      `"apogee_manifest.json"`,
 			"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 		}),
@@ -467,7 +467,7 @@
 	bazel_module: { bp2build_available: true },
 }
 `,
-		ExpectedBazelTargets: []string{makeBazelTarget("apex", "apogee", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("apex", "apogee", AttrNameToString{
 			"manifest":      `"manifest.json"`,
 			"file_contexts": `"//system/sepolicy/apex:apogee-file_contexts"`,
 		}),
@@ -624,7 +624,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"android_manifest": `"ApogeeAndroidManifest.xml"`,
 				"binaries": `[
         ":cc_binary_1",
@@ -684,7 +684,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"//a/b:apex_manifest.json"`,
 			}),
@@ -718,7 +718,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"//a/b:apogee_manifest.json"`,
 			}),
@@ -750,7 +750,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 			}),
@@ -783,7 +783,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apogee_manifest.json"`,
 			}),
@@ -816,7 +816,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 				"package_name":  `"com.google.android.apogee"`,
@@ -855,7 +855,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 				"prebuilts":     `[":prebuilt_file"]`,
@@ -900,7 +900,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 				"prebuilts":     `[":prebuilt_file2"]`,
@@ -940,7 +940,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts": `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":      `"apex_manifest.json"`,
 				"prebuilts":     `[]`,
@@ -974,7 +974,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts":  `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":       `"apex_manifest.json"`,
 				"logging_parent": `"foo.bar.baz"`,
@@ -1009,7 +1009,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
+			MakeBazelTarget("apex", "com.google.android.apogee", AttrNameToString{
 				"file_contexts":  `"//system/sepolicy/apex:com.android.apogee-file_contexts"`,
 				"manifest":       `"apex_manifest.json"`,
 				"logging_parent": `"foo.bar.baz.override"`,
diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go
index 8de6d18..cf46533 100644
--- a/bp2build/build_conversion.go
+++ b/bp2build/build_conversion.go
@@ -43,7 +43,6 @@
 	content         string
 	ruleClass       string
 	bzlLoadLocation string
-	handcrafted     bool
 }
 
 // IsLoadedFromStarlark determines if the BazelTarget's rule class is loaded from a .bzl file,
@@ -65,25 +64,9 @@
 // BazelTargets is a typedef for a slice of BazelTarget objects.
 type BazelTargets []BazelTarget
 
-// HasHandcraftedTargetsreturns true if a set of bazel targets contain
-// handcrafted ones.
-func (targets BazelTargets) hasHandcraftedTargets() bool {
-	for _, target := range targets {
-		if target.handcrafted {
-			return true
-		}
-	}
-	return false
-}
-
-// sort a list of BazelTargets in-place, by name, and by generated/handcrafted types.
+// sort a list of BazelTargets in-place by name
 func (targets BazelTargets) sort() {
 	sort.Slice(targets, func(i, j int) bool {
-		if targets[i].handcrafted != targets[j].handcrafted {
-			// Handcrafted targets will be generated after the bp2build generated targets.
-			return targets[j].handcrafted
-		}
-		// This will cover all bp2build generated targets.
 		return targets[i].name < targets[j].name
 	})
 }
@@ -94,18 +77,6 @@
 func (targets BazelTargets) String() string {
 	var res string
 	for i, target := range targets {
-		// There is only at most 1 handcrafted "target", because its contents
-		// represent the entire BUILD file content from the tree. See
-		// build_conversion.go#getHandcraftedBuildContent for more information.
-		//
-		// Add a header to make it easy to debug where the handcrafted targets
-		// are in a generated BUILD file.
-		if target.handcrafted {
-			res += "# -----------------------------\n"
-			res += "# Section: Handcrafted targets. \n"
-			res += "# -----------------------------\n\n"
-		}
-
 		res += target.content
 		if i != len(targets)-1 {
 			res += "\n\n"
@@ -256,7 +227,6 @@
 
 func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (conversionResults, []error) {
 	buildFileToTargets := make(map[string]BazelTargets)
-	buildFileToAppend := make(map[string]bool)
 
 	// Simple metrics tracking for bp2build
 	metrics := CodegenMetrics{
@@ -288,30 +258,10 @@
 				// Handle modules converted to handcrafted targets.
 				//
 				// Since these modules are associated with some handcrafted
-				// target in a BUILD file, we simply append the entire contents
-				// of that BUILD file to the generated BUILD file.
-				//
-				// The append operation is only done once, even if there are
-				// multiple modules from the same directory associated to
-				// targets in the same BUILD file (or package).
+				// target in a BUILD file, we don't autoconvert them.
 
 				// Log the module.
 				metrics.AddConvertedModule(m, moduleType, Handcrafted)
-
-				pathToBuildFile := getBazelPackagePath(b)
-				if _, exists := buildFileToAppend[pathToBuildFile]; exists {
-					// Append the BUILD file content once per package, at most.
-					return
-				}
-				t, err := getHandcraftedBuildContent(ctx, b, pathToBuildFile)
-				if err != nil {
-					errs = append(errs, fmt.Errorf("Error converting %s: %s", bpCtx.ModuleName(m), err))
-					return
-				}
-				targets = append(targets, t)
-				// TODO(b/181575318): currently we append the whole BUILD file, let's change that to do
-				// something more targeted based on the rule type and target
-				buildFileToAppend[pathToBuildFile] = true
 			} else if aModule, ok := m.(android.Module); ok && aModule.IsConvertedByBp2build() {
 				// Handle modules converted to generated targets.
 
@@ -397,29 +347,6 @@
 	}, errs
 }
 
-func getBazelPackagePath(b android.Bazelable) string {
-	label := b.HandcraftedLabel()
-	pathToBuildFile := strings.TrimPrefix(label, "//")
-	pathToBuildFile = strings.Split(pathToBuildFile, ":")[0]
-	return pathToBuildFile
-}
-
-func getHandcraftedBuildContent(ctx *CodegenContext, b android.Bazelable, pathToBuildFile string) (BazelTarget, error) {
-	p := android.ExistentPathForSource(ctx, pathToBuildFile, HandcraftedBuildFileName)
-	if !p.Valid() {
-		return BazelTarget{}, fmt.Errorf("Could not find file %q for handcrafted target.", pathToBuildFile)
-	}
-	c, err := b.GetBazelBuildFileContents(ctx.Config(), pathToBuildFile, HandcraftedBuildFileName)
-	if err != nil {
-		return BazelTarget{}, err
-	}
-	// TODO(b/181575318): once this is more targeted, we need to include name, rule class, etc
-	return BazelTarget{
-		content:     c,
-		handcrafted: true,
-	}, nil
-}
-
 func generateBazelTargets(ctx bpToBuildContext, m android.Module) []BazelTarget {
 	var targets []BazelTarget
 	for _, m := range m.Bp2buildTargets() {
@@ -462,7 +389,6 @@
 			targetName,
 			attributes,
 		),
-		handcrafted: false,
 	}
 }
 
diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go
index 1ac7518..587b8d9 100644
--- a/bp2build/build_conversion_test.go
+++ b/bp2build/build_conversion_test.go
@@ -238,7 +238,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_literal_prop": `""`,
 				}),
 			},
@@ -251,7 +251,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_literal_prop": `"PROP"`,
 				}),
 			},
@@ -267,7 +267,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_literal_prop": `select({
         "//build/bazel/platforms/arch:arm": "ARM",
         "//build/bazel/platforms/arch:arm64": "ARM64",
@@ -284,7 +284,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_ptr_prop": `""`,
 				}),
 			},
@@ -298,7 +298,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_list_prop": `[
         "a",
         "b",
@@ -316,7 +316,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "foo", AttrNameToString{
+				MakeBazelTarget("custom", "foo", AttrNameToString{
 					"string_list_prop": `[
         "\t",
         "\n",
@@ -339,10 +339,10 @@
   bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "dep", AttrNameToString{
+				MakeBazelTarget("custom", "dep", AttrNameToString{
 					"arch_paths": `["abc"]`,
 				}),
-				makeBazelTarget("custom", "has_dep", AttrNameToString{
+				MakeBazelTarget("custom", "has_dep", AttrNameToString{
 					"arch_paths": `[":dep"]`,
 				}),
 			},
@@ -355,7 +355,7 @@
   bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "has_dep", AttrNameToString{
+				MakeBazelTarget("custom", "has_dep", AttrNameToString{
 					"arch_paths": `[":dep__BP2BUILD__MISSING__DEP"]`,
 				}),
 			},
@@ -391,7 +391,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "arch_paths", AttrNameToString{
+				MakeBazelTarget("custom", "arch_paths", AttrNameToString{
 					"arch_paths": `select({
         "//build/bazel/platforms/arch:arm": [
             "arm.txt",
@@ -469,10 +469,10 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "dep", AttrNameToString{
+				MakeBazelTarget("custom", "dep", AttrNameToString{
 					"arch_paths": `["abc"]`,
 				}),
-				makeBazelTarget("custom", "has_dep", AttrNameToString{
+				MakeBazelTarget("custom", "has_dep", AttrNameToString{
 					"arch_paths": `select({
         "//build/bazel/platforms/arch:x86": [":dep"],
         "//conditions:default": [],
@@ -488,7 +488,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "embedded_props", AttrNameToString{
+				MakeBazelTarget("custom", "embedded_props", AttrNameToString{
 					"embedded_attr": `"abc"`,
 				}),
 			},
@@ -501,7 +501,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("custom", "ptr_to_embedded_props", AttrNameToString{
+				MakeBazelTarget("custom", "ptr_to_embedded_props", AttrNameToString{
 					"other_embedded_attr": `"abc"`,
 				}),
 			},
@@ -1299,9 +1299,7 @@
     name: "fg_foo",
     bazel_module: { label: "//other:fg_foo" },
 }`,
-			ExpectedBazelTargets: []string{
-				`// BUILD file`,
-			},
+			ExpectedBazelTargets: []string{},
 			Filesystem: map[string]string{
 				"other/BUILD.bazel": `// BUILD file`,
 			},
@@ -1319,9 +1317,7 @@
         name: "foo",
         bazel_module: { label: "//other:foo" },
     }`,
-			ExpectedBazelTargets: []string{
-				`// BUILD file`,
-			},
+			ExpectedBazelTargets: []string{},
 			Filesystem: map[string]string{
 				"other/BUILD.bazel": `// BUILD file`,
 			},
@@ -1349,7 +1345,6 @@
 			},
 			ExpectedBazelTargets: []string{
 				MakeBazelTargetNoRestrictions("filegroup", "fg_foo", map[string]string{}),
-				`// definition for fg_bar`,
 			},
 		},
 		{
@@ -1375,7 +1370,6 @@
     }`,
 			ExpectedBazelTargets: []string{
 				MakeBazelTargetNoRestrictions("filegroup", "fg_bar", map[string]string{}),
-				`// BUILD file`,
 			},
 		},
 	}
@@ -1420,9 +1414,6 @@
 			if actualCount != expectedCount {
 				t.Errorf("Expected %d bazel target, got %d\n%s", expectedCount, actualCount, bazelTargets)
 			}
-			if !strings.Contains(bazelTargets.String(), "Section: Handcrafted targets. ") {
-				t.Errorf("Expected string representation of bazelTargets to contain handcrafted section header.")
-			}
 			for i, target := range bazelTargets {
 				actualContent := target.content
 				expectedContent := testCase.ExpectedBazelTargets[i]
@@ -1545,7 +1536,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("py_library", "fg_foo", map[string]string{
+				MakeBazelTarget("py_library", "fg_foo", map[string]string{
 					"data": `select({
         "//build/bazel/platforms/arch:arm": [":reqdarm"],
         "//build/bazel/platforms/arch:x86": [":reqdx86"],
@@ -1572,7 +1563,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("py_library", "fg_foo", map[string]string{
+				MakeBazelTarget("py_library", "fg_foo", map[string]string{
 					"data": `[
         "data.bin",
         ":reqd",
diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go
index c1b4cd0..45f15bf 100644
--- a/bp2build/cc_library_conversion_test.go
+++ b/bp2build/cc_library_conversion_test.go
@@ -355,7 +355,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"copts": `[
         "bothflag",
         "staticflag",
@@ -377,7 +377,7 @@
         ":whole_and_static_lib_for_both",
         ":whole_static_lib_for_static",
     ]`}),
-			makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"copts": `[
         "bothflag",
         "sharedflag",
@@ -463,7 +463,7 @@
 			simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
 			simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"copts": `[
         "bothflag",
         "staticflag",
@@ -495,7 +495,7 @@
         ":whole_static_dep_for_static",
     ]`,
 			}),
-			makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"copts": `[
         "bothflag",
         "sharedflag",
@@ -560,13 +560,13 @@
 		},
 		Blueprint: soongCcLibraryPreamble,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"whole_archive_deps": `[
         ":whole_static_lib_for_both_alwayslink",
         ":whole_static_lib_for_static_alwayslink",
     ]`,
 			}),
-			makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"whole_archive_deps": `[
         ":whole_static_lib_for_both_alwayslink",
         ":whole_static_lib_for_shared_alwayslink",
@@ -654,7 +654,7 @@
 		},
 		Blueprint: soongCcLibraryPreamble,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"copts": `[
         "bothflag",
         "staticflag",
@@ -678,7 +678,7 @@
         "//conditions:default": [],
     })`,
 			}),
-			makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"copts": `[
         "bothflag",
         "sharedflag",
@@ -807,7 +807,7 @@
 		},
 		Blueprint: soongCcLibraryPreamble,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"local_includes": `["."]`,
 				"srcs": `[
         "both_source.cpp",
@@ -832,7 +832,7 @@
         ":static_filegroup_c_srcs",
     ]`,
 			}),
-			makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"local_includes": `["."]`,
 				"srcs": `[
         "both_source.cpp",
@@ -1315,8 +1315,8 @@
 			staticAttrs[key] = val
 		}
 	}
-	sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
-	staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
+	sharedTarget := MakeBazelTarget("cc_library_shared", name, sharedAttrs)
+	staticTarget := MakeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
 
 	return []string{staticTarget, sharedTarget}
 }
@@ -1338,7 +1338,7 @@
 			stubSuiteAttrs[STUB_SUITE_ATTRS[key]] = attrs[key]
 		}
 	}
-	return makeBazelTarget("cc_stub_suite", name+"_stub_libs", stubSuiteAttrs)
+	return MakeBazelTarget("cc_stub_suite", name+"_stub_libs", stubSuiteAttrs)
 }
 
 func TestCCLibraryNoLibCrtFalse(t *testing.T) {
@@ -1649,10 +1649,10 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", AttrNameToString{
 				"system_dynamic_deps": "[]",
 			}),
-			makeBazelTarget("cc_library_shared", "static_empty", AttrNameToString{}),
+			MakeBazelTarget("cc_library_shared", "static_empty", AttrNameToString{}),
 		},
 	})
 }
@@ -1672,8 +1672,8 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", AttrNameToString{}),
-			makeBazelTarget("cc_library_shared", "shared_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", AttrNameToString{}),
+			MakeBazelTarget("cc_library_shared", "shared_empty", AttrNameToString{
 				"system_dynamic_deps": "[]",
 			}),
 		},
@@ -1699,8 +1699,8 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", AttrNameToString{}),
-			makeBazelTarget("cc_library_shared", "shared_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", AttrNameToString{}),
+			MakeBazelTarget("cc_library_shared", "shared_empty", AttrNameToString{
 				"system_dynamic_deps": "[]",
 			}),
 		},
@@ -1782,10 +1782,10 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"system_dynamic_deps": `[":libc"]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"system_dynamic_deps": `[
         ":libc",
         ":libm",
@@ -2000,7 +2000,7 @@
 }
 `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
 				ExpectedBazelTargets: []string{
-					makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
+					MakeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
 				},
 			})
 
@@ -2019,7 +2019,7 @@
 }
 `, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
 				ExpectedBazelTargets: []string{
-					makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
+					MakeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
 				},
 			})
 		})
@@ -2036,14 +2036,14 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
 				"deps":                              `[":libprotobuf-cpp-lite"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
 			}),
 		},
@@ -2061,15 +2061,15 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs":                `["foo.proto"]`,
 				"strip_import_prefix": `""`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
 				"deps":                              `[":libprotobuf-cpp-lite"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
 			}),
 		},
@@ -2087,14 +2087,14 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
 				"deps":                              `[":libprotobuf-cpp-lite"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
 			}),
 		},
@@ -2114,14 +2114,14 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_proto_library", "foo_cc_proto", AttrNameToString{
+			}), MakeBazelTarget("cc_proto_library", "foo_cc_proto", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"implementation_whole_archive_deps": `[":foo_cc_proto"]`,
 				"deps":                              `[":libprotobuf-cpp-full"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps": `[":libprotobuf-cpp-full"]`,
 			}),
 		},
@@ -2141,14 +2141,14 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
 				"deps":                              `[":libprotobuf-cpp-lite"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps": `[":libprotobuf-cpp-lite"]`,
 			}),
 		},
@@ -2168,14 +2168,14 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":foo_cc_proto_lite"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":foo_cc_proto_lite"]`,
 			}),
@@ -2228,65 +2228,65 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "a_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "a_proto", AttrNameToString{
 				"srcs": `[":a_fg_proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", AttrNameToString{
 				"deps": `[":a_proto"]`,
-			}), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":a_cc_proto_lite"]`,
 				"srcs":               `[":a_fg_proto_cpp_srcs"]`,
 				"srcs_as":            `[":a_fg_proto_as_srcs"]`,
 				"srcs_c":             `[":a_fg_proto_c_srcs"]`,
-			}), makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":a_cc_proto_lite"]`,
 				"srcs":               `[":a_fg_proto_cpp_srcs"]`,
 				"srcs_as":            `[":a_fg_proto_as_srcs"]`,
 				"srcs_c":             `[":a_fg_proto_c_srcs"]`,
-			}), makeBazelTarget("proto_library", "b_proto", AttrNameToString{
+			}), MakeBazelTarget("proto_library", "b_proto", AttrNameToString{
 				"srcs": `[":b_protos"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", AttrNameToString{
 				"deps": `[":b_proto"]`,
-			}), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":b_cc_proto_lite"]`,
 				"srcs":               `[":b_protos_cpp_srcs"]`,
 				"srcs_as":            `[":b_protos_as_srcs"]`,
 				"srcs_c":             `[":b_protos_c_srcs"]`,
-			}), makeBazelTarget("cc_library_shared", "b", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "b", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":b_cc_proto_lite"]`,
 				"srcs":               `[":b_protos_cpp_srcs"]`,
 				"srcs_as":            `[":b_protos_as_srcs"]`,
 				"srcs_c":             `[":b_protos_c_srcs"]`,
-			}), makeBazelTarget("proto_library", "c_proto", AttrNameToString{
+			}), MakeBazelTarget("proto_library", "c_proto", AttrNameToString{
 				"srcs": `[":c-proto-srcs"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", AttrNameToString{
 				"deps": `[":c_proto"]`,
-			}), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":c_cc_proto_lite"]`,
 				"srcs":               `[":c-proto-srcs_cpp_srcs"]`,
 				"srcs_as":            `[":c-proto-srcs_as_srcs"]`,
 				"srcs_c":             `[":c-proto-srcs_c_srcs"]`,
-			}), makeBazelTarget("cc_library_shared", "c", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "c", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":c_cc_proto_lite"]`,
 				"srcs":               `[":c-proto-srcs_cpp_srcs"]`,
 				"srcs_as":            `[":c-proto-srcs_as_srcs"]`,
 				"srcs_c":             `[":c-proto-srcs_c_srcs"]`,
-			}), makeBazelTarget("proto_library", "d_proto", AttrNameToString{
+			}), MakeBazelTarget("proto_library", "d_proto", AttrNameToString{
 				"srcs": `[":proto-srcs-d"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", AttrNameToString{
 				"deps": `[":d_proto"]`,
-			}), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":d_cc_proto_lite"]`,
 				"srcs":               `[":proto-srcs-d_cpp_srcs"]`,
 				"srcs_as":            `[":proto-srcs-d_as_srcs"]`,
 				"srcs_c":             `[":proto-srcs-d_c_srcs"]`,
-			}), makeBazelTarget("cc_library_shared", "d", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "d", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":d_cc_proto_lite"]`,
 				"srcs":               `[":proto-srcs-d_cpp_srcs"]`,
@@ -2385,10 +2385,10 @@
   },
 	include_build_directory: false,
 }`,
-		ExpectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 			"srcs":                   `["foo.cpp"]`,
 			"target_compatible_with": `["@platforms//:incompatible"]`,
-		}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+		}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 			"srcs": `["foo.cpp"]`,
 			"target_compatible_with": `select({
         "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
@@ -2425,13 +2425,13 @@
 	},
 	include_build_directory: false,
 }`,
-		ExpectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 			"srcs": `["foo.cpp"]`,
 			"target_compatible_with": `select({
         "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
         "//conditions:default": [],
     })`,
-		}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+		}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 			"srcs": `["foo.cpp"]`,
 			"target_compatible_with": `select({
         "//build/bazel/platforms/os_arch:darwin_arm64": [],
@@ -2513,14 +2513,14 @@
 	bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: append([]string{
-			makeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
 				"srcs": `[
         "foo1.l",
         "foo2.l",
     ]`,
 				"lexopts": `["--foo_flags"]`,
 			}),
-			makeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
 				"srcs": `[
         "bar1.ll",
         "bar2.ll",
@@ -2552,14 +2552,14 @@
   runtime_libs: ["foo"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "bar", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "bar", AttrNameToString{
 				"local_includes": `["."]`,
 			}),
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"runtime_deps":   `[":foo"]`,
 				"local_includes": `["."]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"runtime_deps":   `[":foo"]`,
 				"local_includes": `["."]`,
 			}),
@@ -2608,10 +2608,10 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `""`,
 			}),
@@ -2634,10 +2634,10 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `"-suf"`,
 			}),
@@ -2663,10 +2663,10 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `select({
         "//build/bazel/platforms/arch:arm": "-32",
@@ -2701,20 +2701,20 @@
 				"srcs":                `["aidl/A.aidl"]`,
 				"strip_import_prefix": `"aidl"`,
 			}),
-			makeBazelTarget("aidl_library", "foo_aidl_library", AttrNameToString{
+			MakeBazelTarget("aidl_library", "foo_aidl_library", AttrNameToString{
 				"srcs": `["B.aidl"]`,
 			}),
-			makeBazelTarget("cc_aidl_library", "foo_cc_aidl_library", AttrNameToString{
+			MakeBazelTarget("cc_aidl_library", "foo_cc_aidl_library", AttrNameToString{
 				"deps": `[
         ":A_aidl",
         ":foo_aidl_library",
     ]`,
 			}),
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"whole_archive_deps": `[":foo_cc_aidl_library"]`,
 				"local_includes":     `["."]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"whole_archive_deps": `[":foo_cc_aidl_library"]`,
 				"local_includes":     `["."]`,
 			}),
@@ -2743,14 +2743,14 @@
 	],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_aidl_library", "foo_cc_aidl_library", AttrNameToString{
+			MakeBazelTarget("cc_aidl_library", "foo_cc_aidl_library", AttrNameToString{
 				"deps": `["//path/to/A:A_aidl"]`,
 			}),
-			makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", AttrNameToString{
 				"whole_archive_deps": `[":foo_cc_aidl_library"]`,
 				"local_includes":     `["."]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"whole_archive_deps": `[":foo_cc_aidl_library"]`,
 				"local_includes":     `["."]`,
 			}),
diff --git a/bp2build/cc_library_headers_conversion_test.go b/bp2build/cc_library_headers_conversion_test.go
index 5846f83..5fa7cac 100644
--- a/bp2build/cc_library_headers_conversion_test.go
+++ b/bp2build/cc_library_headers_conversion_test.go
@@ -106,7 +106,7 @@
     // TODO: Also support export_header_lib_headers
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"export_includes": `[
         "dir-1",
         "dir-2",
@@ -183,7 +183,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `[":base-lib"] + select({
         "//build/bazel/platforms/os:android": [":android-lib"],
         "//build/bazel/platforms/os:darwin": [":darwin-lib"],
@@ -223,7 +223,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `select({
         "//build/bazel/platforms/os:android": [":exported-lib"],
         "//conditions:default": [],
@@ -276,7 +276,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"export_system_includes": `["shared_include_dir"] + select({
         "//build/bazel/platforms/arch:arm": ["arm_include_dir"],
         "//build/bazel/platforms/arch:x86_64": ["x86_64_include_dir"],
@@ -318,7 +318,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "lib-1", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "lib-1", AttrNameToString{
 				"export_includes": `["lib-1"]`,
 			}),
 		},
@@ -340,7 +340,7 @@
 }
 ` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `[":foo_export"]`,
 			}),
 		},
@@ -362,7 +362,7 @@
 }
 ` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `[":foo_export"]`,
 			}),
 		},
@@ -384,7 +384,7 @@
 }
 ` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `[":foo_export"]`,
 			}),
 		},
@@ -405,7 +405,7 @@
 }
 ` + simpleModuleDoNotConvertBp2build("cc_library_headers", "foo_export"),
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
+			MakeBazelTarget("cc_library_headers", "foo_headers", AttrNameToString{
 				"deps": `[":foo_export"]`,
 			}),
 		},
diff --git a/bp2build/cc_library_shared_conversion_test.go b/bp2build/cc_library_shared_conversion_test.go
index ed983bf..4d8e59b 100644
--- a/bp2build/cc_library_shared_conversion_test.go
+++ b/bp2build/cc_library_shared_conversion_test.go
@@ -142,7 +142,7 @@
     // TODO: Also support export_header_lib_headers
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"absolute_includes": `[
         "include_dir_1",
         "include_dir_2",
@@ -202,7 +202,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"implementation_dynamic_deps": `select({
         "//build/bazel/platforms/arch:arm64": [":shared_dep"],
         "//conditions:default": [],
@@ -231,7 +231,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"implementation_dynamic_deps": `select({
         "//build/bazel/platforms/os:android": [":shared_dep"],
         "//conditions:default": [],
@@ -266,7 +266,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"implementation_dynamic_deps": `[":shared_dep"] + select({
         "//build/bazel/platforms/arch:arm64": [":shared_dep3"],
         "//conditions:default": [],
@@ -295,7 +295,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"srcs_c": `[
         "common.c",
         "foo-a.c",
@@ -322,7 +322,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"strip": `{
         "all": True,
         "keep_symbols": False,
@@ -351,7 +351,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"additional_linker_inputs": `["version_script"]`,
 				"linkopts":                 `["-Wl,--version-script,$(location version_script)"]`,
 			}),
@@ -374,7 +374,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"link_crt": `False`,
 				"srcs":     `["impl.cpp"]`,
 			}),
@@ -397,7 +397,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"srcs": `["impl.cpp"]`,
 			}),
 		},
@@ -440,11 +440,11 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"dynamic_deps":       `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":foo_cc_proto_lite"]`,
 			}),
@@ -460,7 +460,7 @@
         include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"use_version_lib": "True",
 			}),
 		},
@@ -484,7 +484,7 @@
 `,
 		},
 		Blueprint: soongCcLibraryPreamble,
-		ExpectedBazelTargets: []string{makeBazelTarget("cc_library_shared", "a", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
 			"has_stubs": `True`,
 		}),
 		},
@@ -510,7 +510,7 @@
     defaults: ["empty_defaults"],
 }
 `,
-		ExpectedBazelTargets: []string{makeBazelTarget("cc_library_shared", "empty", AttrNameToString{
+		ExpectedBazelTargets: []string{MakeBazelTarget("cc_library_shared", "empty", AttrNameToString{
 			"system_dynamic_deps": "[]",
 		})},
 	})
@@ -537,21 +537,21 @@
 	bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
 				"srcs": `[
         "foo1.l",
         "foo2.l",
     ]`,
 				"lexopts": `["--foo_flags"]`,
 			}),
-			makeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
 				"srcs": `[
         "bar1.ll",
         "bar2.ll",
     ]`,
 				"lexopts": `["--foo_flags"]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo_lib", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_lib", AttrNameToString{
 				"srcs": `[
         "bar.cc",
         ":foo_lib_genlex_ll",
@@ -576,7 +576,7 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"conlyflags": `["-a"]`,
 				"copts":      `["-b"]`,
 				"cppflags":   `["-c"]`,
@@ -600,7 +600,7 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"additional_linker_inputs": `["version_script"]`,
 				"conlyflags": `[
         "-include",
@@ -631,10 +631,10 @@
   runtime_libs: ["foo"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "bar", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "bar", AttrNameToString{
 				"local_includes": `["."]`,
 			}),
-			makeBazelTarget("cc_library_shared", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo", AttrNameToString{
 				"runtime_deps":   `[":foo"]`,
 				"local_includes": `["."]`,
 			}),
@@ -656,7 +656,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `""`,
 			}),
@@ -678,7 +678,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `"-suf"`,
 			}),
@@ -703,7 +703,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "foo_shared", AttrNameToString{
 				"srcs_c": `["foo.c"]`,
 				"suffix": `select({
         "//build/bazel/platforms/arch:arm": "-32",
diff --git a/bp2build/cc_library_static_conversion_test.go b/bp2build/cc_library_static_conversion_test.go
index 1c160ec..0e47ee8 100644
--- a/bp2build/cc_library_static_conversion_test.go
+++ b/bp2build/cc_library_static_conversion_test.go
@@ -173,7 +173,7 @@
     // TODO: Also support export_header_lib_headers
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"absolute_includes": `[
         "include_dir_1",
         "include_dir_2",
@@ -238,7 +238,7 @@
     ],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"absolute_includes": `["subpackage"]`,
 				"local_includes":    `["."]`,
 			}),
@@ -262,7 +262,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"export_includes": `["subpackage"]`,
 			}),
 		},
@@ -285,7 +285,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"export_system_includes": `["subpackage"]`,
 			}),
 		},
@@ -320,7 +320,7 @@
 		},
 		Blueprint: soongCcLibraryStaticPreamble,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"absolute_includes": `[
         "subpackage/subsubpackage",
         "subpackage2",
@@ -352,7 +352,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"absolute_includes": `["subpackage"]`,
 				"local_includes":    `["subpackage2"]`,
 			}),
@@ -379,7 +379,7 @@
     include_build_directory: true,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"absolute_includes": `["subpackage"]`,
 				"local_includes": `[
         "subpackage2",
@@ -409,7 +409,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"implementation_deps": `select({
         "//build/bazel/platforms/arch:arm64": [":static_dep"],
         "//conditions:default": [],
@@ -442,7 +442,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"implementation_deps": `select({
         "//build/bazel/platforms/os:android": [":static_dep"],
         "//conditions:default": [],
@@ -486,7 +486,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"implementation_deps": `[":static_dep"] + select({
         "//build/bazel/platforms/arch:arm64": [":static_dep4"],
         "//conditions:default": [],
@@ -516,7 +516,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `[
         "common.c",
         "foo-a.c",
@@ -541,7 +541,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": ["foo-arm.c"],
         "//conditions:default": [],
@@ -571,7 +571,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": ["for-arm.c"],
         "//conditions:default": ["not-for-arm.c"],
@@ -603,7 +603,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": [
             "not-for-x86.c",
@@ -652,7 +652,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": [
             "not-for-arm64.c",
@@ -709,7 +709,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs": `["common.cc"] + select({
         "//build/bazel/platforms/arch:arm": [],
         "//conditions:default": ["foo-no-arm.cc"],
@@ -740,7 +740,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs": `["common.cc"] + select({
         "//build/bazel/platforms/arch:arm": [],
         "//build/bazel/platforms/arch:x86": [
@@ -769,7 +769,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"implementation_deps": `[":static_dep"]`,
 			}),
 		},
@@ -794,7 +794,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": ["for-lib32.c"],
         "//build/bazel/platforms/arch:x86": ["for-lib32.c"],
@@ -826,7 +826,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": [
             "not-for-lib64.c",
@@ -891,7 +891,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `["common.c"] + select({
         "//build/bazel/platforms/arch:arm": [
             "not-for-arm64.c",
@@ -962,7 +962,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"export_includes": `["."]`,
 				"local_includes":  `["."]`,
 				"hdrs":            `[":export_generated_hdr"]`,
@@ -1030,7 +1030,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs": `[
         "common.cpp",
         ":generated_src",
@@ -1093,7 +1093,7 @@
     include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"srcs_c": `select({
         "//build/bazel/platforms/os:android": ["android_src.c"],
         "//conditions:default": [],
@@ -1132,7 +1132,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"copts": `select({
         "//build/bazel/product_variables:binder32bit": ["-Wbinder32bit"],
         "//conditions:default": [],
@@ -1192,7 +1192,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"copts": `select({
         "//build/bazel/product_variables:malloc_not_svelte": ["-Wmalloc_not_svelte"],
         "//conditions:default": [],
@@ -1231,7 +1231,7 @@
     include_build_directory: false,
 } `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_static", AttrNameToString{
 				"asflags": `select({
         "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
         "//conditions:default": [],
@@ -1253,7 +1253,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "root_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "root_empty", AttrNameToString{
 				"system_dynamic_deps": `[]`,
 			}),
 		},
@@ -1277,7 +1277,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "static_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "static_empty", AttrNameToString{
 				"system_dynamic_deps": `[]`,
 			}),
 		},
@@ -1299,7 +1299,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "target_bionic_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "target_bionic_empty", AttrNameToString{
 				"system_dynamic_deps": `[]`,
 			}),
 		},
@@ -1325,7 +1325,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "target_linux_bionic_empty", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "target_linux_bionic_empty", AttrNameToString{
 				"system_dynamic_deps": `[]`,
 			}),
 		},
@@ -1348,7 +1348,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "target_bionic", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "target_bionic", AttrNameToString{
 				"system_dynamic_deps": `select({
         "//build/bazel/platforms/os:android": [":libc"],
         "//build/bazel/platforms/os:linux_bionic": [":libc"],
@@ -1377,7 +1377,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "target_linux_bionic", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "target_linux_bionic", AttrNameToString{
 				"system_dynamic_deps": `[":libc"] + select({
         "//build/bazel/platforms/os:linux_bionic": [":libm"],
         "//conditions:default": [],
@@ -1419,18 +1419,18 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "all", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "all", AttrNameToString{
 				"implementation_dynamic_deps": `select({
         "//build/bazel/platforms/os:android": [],
         "//build/bazel/platforms/os:linux_bionic": [],
         "//conditions:default": [":libc"],
     })`,
 			}),
-			makeBazelTarget("cc_library_static", "keep_for_empty_system_shared_libs", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "keep_for_empty_system_shared_libs", AttrNameToString{
 				"implementation_dynamic_deps": `[":libc"]`,
 				"system_dynamic_deps":         `[]`,
 			}),
-			makeBazelTarget("cc_library_static", "used_in_bionic_oses", AttrNameToString{}),
+			MakeBazelTarget("cc_library_static", "used_in_bionic_oses", AttrNameToString{}),
 		},
 	})
 }
@@ -1446,11 +1446,11 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "foo_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
 				"srcs": `["foo.proto"]`,
-			}), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
+			}), MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
 				"deps": `[":foo_proto"]`,
-			}), makeBazelTarget("cc_library_static", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
 				"deps":               `[":libprotobuf-cpp-lite"]`,
 				"whole_archive_deps": `[":foo_cc_proto_lite"]`,
 			}),
@@ -1466,7 +1466,7 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
 				"use_version_lib": "True",
 			}),
 		},
@@ -1483,7 +1483,7 @@
 	include_build_directory: false,
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_static", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
 				"conlyflags": `["-std=conly"]`,
 				"cppflags":   `["-std=cpp"]`,
 			}),
@@ -1553,7 +1553,7 @@
 	%s
 }`, tc.prop),
 				ExpectedBazelTargets: []string{
-					makeBazelTarget("cc_library_static", "foo", tc.attr),
+					MakeBazelTarget("cc_library_static", "foo", tc.attr),
 				},
 			})
 		})
@@ -1571,10 +1571,10 @@
   runtime_libs: ["foo"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_library_shared", "bar", AttrNameToString{
+			MakeBazelTarget("cc_library_shared", "bar", AttrNameToString{
 				"local_includes": `["."]`,
 			}),
-			makeBazelTarget("cc_library_static", "foo", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo", AttrNameToString{
 				"runtime_deps":   `[":foo"]`,
 				"local_includes": `["."]`,
 			}),
diff --git a/bp2build/cc_object_conversion_test.go b/bp2build/cc_object_conversion_test.go
index 37d5580..b8dc690 100644
--- a/bp2build/cc_object_conversion_test.go
+++ b/bp2build/cc_object_conversion_test.go
@@ -60,7 +60,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `[
         "-fno-addrsig",
         "-Wno-gcc-compat",
@@ -106,7 +106,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `[
         "-Werror",
         "-fno-addrsig",
@@ -141,11 +141,11 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "bar", AttrNameToString{
+			MakeBazelTarget("cc_object", "bar", AttrNameToString{
 				"copts":               `["-fno-addrsig"]`,
 				"srcs":                `["x/y/z.c"]`,
 				"system_dynamic_deps": `[]`,
-			}), makeBazelTarget("cc_object", "foo", AttrNameToString{
+			}), MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts":               `["-fno-addrsig"]`,
 				"deps":                `[":bar"]`,
 				"srcs":                `["a/b/c.c"]`,
@@ -170,7 +170,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts":               `["-fno-addrsig"]`,
 				"srcs":                `["a/b/c.c"]`,
 				"system_dynamic_deps": `[]`,
@@ -195,7 +195,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"asflags": `select({
         "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
         "//conditions:default": [],
@@ -227,7 +227,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `["-fno-addrsig"] + select({
         "//build/bazel/platforms/arch:x86": ["-fPIC"],
         "//conditions:default": [],
@@ -271,7 +271,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `["-fno-addrsig"] + select({
         "//build/bazel/platforms/arch:arm": ["-Wall"],
         "//build/bazel/platforms/arch:arm64": ["-Wall"],
@@ -303,7 +303,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts":         `["-fno-addrsig"]`,
 				"linker_script": `"bunny.lds"`,
 				"srcs":          `["base.cpp"]`,
@@ -360,7 +360,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `["-fno-addrsig"]`,
 				"deps": `select({
         "//build/bazel/platforms/arch:arm": [":arm_obj"],
@@ -401,7 +401,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("cc_object", "foo", AttrNameToString{
+			MakeBazelTarget("cc_object", "foo", AttrNameToString{
 				"copts": `["-fno-addrsig"]`,
 				"srcs": `["base.cpp"] + select({
         "//build/bazel/platforms/os_arch:android_arm64": [
diff --git a/bp2build/cc_prebuilt_library_conversion_test.go b/bp2build/cc_prebuilt_library_conversion_test.go
index 32c3f4d..9d91e40 100644
--- a/bp2build/cc_prebuilt_library_conversion_test.go
+++ b/bp2build/cc_prebuilt_library_conversion_test.go
@@ -36,10 +36,10 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
 					"static_library": `"libf.so"`,
 				}),
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `"libf.so"`,
 				}),
 			},
@@ -66,14 +66,14 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
 					"static_library": `select({
         "//build/bazel/platforms/arch:arm": "libg.so",
         "//build/bazel/platforms/arch:arm64": "libf.so",
         "//conditions:default": None,
     })`,
 				}),
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `select({
         "//build/bazel/platforms/arch:arm": "libg.so",
         "//build/bazel/platforms/arch:arm64": "libf.so",
@@ -104,13 +104,13 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
 					"static_library":         `"libf.so"`,
 					"export_includes":        `["testdir/1/"]`,
 					"export_system_includes": `["testdir/2/"]`,
 				}),
 				// TODO(b/229374533): When fixed, update this test
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `"libf.so"`,
 				}),
 			},
@@ -185,10 +185,10 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest_bp2build_cc_library_static", AttrNameToString{
 					"static_library": `"libf.so"`,
 				}),
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `"libg.so"`,
 				}),
 			},
diff --git a/bp2build/cc_prebuilt_library_shared_test.go b/bp2build/cc_prebuilt_library_shared_test.go
index bcf0ce2..9cee2dd 100644
--- a/bp2build/cc_prebuilt_library_shared_test.go
+++ b/bp2build/cc_prebuilt_library_shared_test.go
@@ -23,7 +23,7 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `"libf.so"`,
 				}),
 			},
@@ -50,7 +50,7 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_shared", "libtest", AttrNameToString{
 					"shared_library": `select({
         "//build/bazel/platforms/arch:arm": "libg.so",
         "//build/bazel/platforms/arch:arm64": "libf.so",
diff --git a/bp2build/cc_prebuilt_library_static_test.go b/bp2build/cc_prebuilt_library_static_test.go
index 489a53d..7c224f1 100644
--- a/bp2build/cc_prebuilt_library_static_test.go
+++ b/bp2build/cc_prebuilt_library_static_test.go
@@ -36,7 +36,7 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest", AttrNameToString{
 					"static_library": `"libf.so"`,
 				}),
 			},
@@ -63,7 +63,7 @@
 	bazel_module: { bp2build_available: true },
 }`,
 			ExpectedBazelTargets: []string{
-				makeBazelTarget("prebuilt_library_static", "libtest", AttrNameToString{
+				MakeBazelTarget("prebuilt_library_static", "libtest", AttrNameToString{
 					"static_library": `select({
         "//build/bazel/platforms/arch:arm": "libg.so",
         "//build/bazel/platforms/arch:arm64": "libf.so",
@@ -118,21 +118,21 @@
 	bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_l", AttrNameToString{
 				"srcs": `[
         "foo1.l",
         "foo2.l",
     ]`,
 				"lexopts": `["--foo_flags"]`,
 			}),
-			makeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
+			MakeBazelTarget("genlex", "foo_lib_genlex_ll", AttrNameToString{
 				"srcs": `[
         "bar1.ll",
         "bar2.ll",
     ]`,
 				"lexopts": `["--foo_flags"]`,
 			}),
-			makeBazelTarget("cc_library_static", "foo_lib", AttrNameToString{
+			MakeBazelTarget("cc_library_static", "foo_lib", AttrNameToString{
 				"srcs": `[
         "bar.cc",
         ":foo_lib_genlex_ll",
diff --git a/bp2build/cc_test_conversion_test.go b/bp2build/cc_test_conversion_test.go
new file mode 100644
index 0000000..9b7748f
--- /dev/null
+++ b/bp2build/cc_test_conversion_test.go
@@ -0,0 +1,150 @@
+// Copyright 2022 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 (
+	"fmt"
+	"testing"
+
+	"android/soong/android"
+	"android/soong/cc"
+	"android/soong/genrule"
+)
+
+type ccTestBp2buildTestCase struct {
+	description string
+	blueprint   string
+	targets     []testBazelTarget
+}
+
+func registerCcTestModuleTypes(ctx android.RegistrationContext) {
+	cc.RegisterCCBuildComponents(ctx)
+	ctx.RegisterModuleType("cc_binary", cc.BinaryFactory)
+	ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
+	ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
+	ctx.RegisterModuleType("cc_test_library", cc.TestLibraryFactory)
+	ctx.RegisterModuleType("genrule", genrule.GenRuleFactory)
+}
+
+func runCcTestTestCase(t *testing.T, testCase ccTestBp2buildTestCase) {
+	t.Helper()
+	moduleTypeUnderTest := "cc_test"
+
+	description := fmt.Sprintf("%s %s", moduleTypeUnderTest, testCase.description)
+	t.Run(description, func(t *testing.T) {
+		t.Helper()
+		RunBp2BuildTestCase(t, registerCcTestModuleTypes, Bp2buildTestCase{
+			ExpectedBazelTargets:       generateBazelTargetsForTest(testCase.targets, android.HostAndDeviceSupported),
+			ModuleTypeUnderTest:        moduleTypeUnderTest,
+			ModuleTypeUnderTestFactory: cc.TestFactory,
+			Description:                description,
+			Blueprint:                  testCase.blueprint,
+		})
+	})
+}
+
+func TestBasicCcTest(t *testing.T) {
+	runCcTestTestCase(t, ccTestBp2buildTestCase{
+		description: "basic cc_test with commonly used attributes",
+		blueprint: `
+cc_test {
+    name: "mytest",
+    host_supported: true,
+    srcs: ["test.cpp"],
+    target: {
+        android: {
+            srcs: ["android.cpp"],
+            shared_libs: ["foolib"],
+        },
+        linux: {
+            srcs: ["linux.cpp"],
+        },
+        host: {
+            static_libs: ["hostlib"],
+        },
+    },
+    data: [":data_mod", "file.txt"],
+    data_bins: [":cc_bin"],
+    data_libs: [":cc_lib"],
+    cflags: ["-Wall"],
+}
+` + simpleModuleDoNotConvertBp2build("cc_library", "foolib") +
+			simpleModuleDoNotConvertBp2build("cc_library_static", "hostlib") +
+			simpleModuleDoNotConvertBp2build("genrule", "data_mod") +
+			simpleModuleDoNotConvertBp2build("cc_binary", "cc_bin") +
+			simpleModuleDoNotConvertBp2build("cc_test_library", "cc_lib"),
+		targets: []testBazelTarget{
+			{"cc_test", "mytest", AttrNameToString{
+				"copts": `["-Wall"]`,
+				"data": `[
+        ":data_mod",
+        "file.txt",
+        ":cc_bin",
+        ":cc_lib",
+    ]`,
+				"deps": `select({
+        "//build/bazel/platforms/os:darwin": [":hostlib"],
+        "//build/bazel/platforms/os:linux": [":hostlib"],
+        "//build/bazel/platforms/os:linux_bionic": [":hostlib"],
+        "//build/bazel/platforms/os:linux_musl": [":hostlib"],
+        "//build/bazel/platforms/os:windows": [":hostlib"],
+        "//conditions:default": [],
+    })`,
+				"gtest":          "True",
+				"isolated":       "True",
+				"local_includes": `["."]`,
+				"dynamic_deps": `select({
+        "//build/bazel/platforms/os:android": [":foolib"],
+        "//conditions:default": [],
+    })`,
+				"srcs": `["test.cpp"] + select({
+        "//build/bazel/platforms/os:android": [
+            "linux.cpp",
+            "android.cpp",
+        ],
+        "//build/bazel/platforms/os:linux": ["linux.cpp"],
+        "//build/bazel/platforms/os:linux_bionic": ["linux.cpp"],
+        "//build/bazel/platforms/os:linux_musl": ["linux.cpp"],
+        "//conditions:default": [],
+    })`,
+			},
+			},
+		},
+	})
+}
+
+func TestBasicCcTestGtestIsolatedDisabled(t *testing.T) {
+	runCcTestTestCase(t, ccTestBp2buildTestCase{
+		description: "cc test with disabled gtest and isolated props",
+		blueprint: `
+cc_test {
+    name: "mytest",
+    host_supported: true,
+    srcs: ["test.cpp"],
+    gtest: false,
+    isolated: false,
+}
+`,
+		targets: []testBazelTarget{
+			{"cc_test", "mytest", AttrNameToString{
+				"gtest":          "False",
+				"isolated":       "False",
+				"local_includes": `["."]`,
+				"srcs":           `["test.cpp"]`,
+			},
+			},
+		},
+	})
+}
diff --git a/bp2build/cc_yasm_conversion_test.go b/bp2build/cc_yasm_conversion_test.go
index 2a71834..55d4feb 100644
--- a/bp2build/cc_yasm_conversion_test.go
+++ b/bp2build/cc_yasm_conversion_test.go
@@ -48,7 +48,7 @@
   srcs: ["main.cpp", "myfile.asm"],
 }`,
 		ExpectedBazelTargets: append([]string{
-			makeBazelTarget("yasm", "foo_yasm", map[string]string{
+			MakeBazelTarget("yasm", "foo_yasm", map[string]string{
 				"include_dirs": `["."]`,
 				"srcs":         `["myfile.asm"]`,
 			}),
@@ -81,7 +81,7 @@
   srcs: ["main.cpp", "myfile.asm"],
 }`,
 		ExpectedBazelTargets: append([]string{
-			makeBazelTarget("yasm", "foo_yasm", map[string]string{
+			MakeBazelTarget("yasm", "foo_yasm", map[string]string{
 				"include_dirs": `[
         "include1/foo",
         ".",
@@ -123,7 +123,7 @@
   },
 }`,
 		ExpectedBazelTargets: append([]string{
-			makeBazelTarget("yasm", "foo_yasm", map[string]string{
+			MakeBazelTarget("yasm", "foo_yasm", map[string]string{
 				"include_dirs": `["."]`,
 				"srcs": `select({
         "//build/bazel/platforms/arch:x86": ["myfile.asm"],
@@ -161,7 +161,7 @@
   },
 }`,
 		ExpectedBazelTargets: append([]string{
-			makeBazelTarget("yasm", "foo_yasm", map[string]string{
+			MakeBazelTarget("yasm", "foo_yasm", map[string]string{
 				"include_dirs": `["."]`,
 				"srcs": `["myfile.asm"] + select({
         "//build/bazel/platforms/arch:x86": ["mysecondfile.asm"],
diff --git a/bp2build/conversion.go b/bp2build/conversion.go
index d98b6a3..6fb2823 100644
--- a/bp2build/conversion.go
+++ b/bp2build/conversion.go
@@ -96,17 +96,9 @@
 # This file was automatically generated by bp2build for the Bazel migration project.
 # Feel free to edit or test it, but do *not* check it into your version control system.
 `
-			if targets.hasHandcraftedTargets() {
-				// For BUILD files with both handcrafted and generated targets,
-				// don't hardcode actual content, like package() declarations.
-				// Leave that responsibility to the checked-in BUILD file
-				// instead.
-				content += `# This file contains generated targets and handcrafted targets that are manually managed in the source tree.`
-			} else {
-				// For fully-generated BUILD files, hardcode the default visibility.
-				content += "package(default_visibility = [\"//visibility:public\"])"
-			}
-			content += "\n"
+
+			// Hardcode the default visibility.
+			content += "package(default_visibility = [\"//visibility:public\"])\n"
 			content += targets.LoadStatements()
 		} else if mode == QueryView {
 			content = soongModuleLoad
diff --git a/bp2build/java_binary_host_conversion_test.go b/bp2build/java_binary_host_conversion_test.go
index 50ea542..86f3d42 100644
--- a/bp2build/java_binary_host_conversion_test.go
+++ b/bp2build/java_binary_host_conversion_test.go
@@ -55,7 +55,7 @@
     java_version: "8",
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
+			MakeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
 				"srcs":       `["a.java"]`,
 				"main_class": `"com.android.test.MainClass"`,
 				"deps":       `["//other:jni-lib-1"]`,
@@ -91,7 +91,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
+			MakeBazelTarget("java_binary", "java-binary-host-1", AttrNameToString{
 				"main_class":   `"com.android.test.MainClass"`,
 				"runtime_deps": `[":java-dep-1"]`,
 				"target_compatible_with": `select({
diff --git a/bp2build/java_import_conversion_test.go b/bp2build/java_import_conversion_test.go
index 707ecce..05d7142 100644
--- a/bp2build/java_import_conversion_test.go
+++ b/bp2build/java_import_conversion_test.go
@@ -45,7 +45,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_import", "example_import", AttrNameToString{
+			MakeBazelTarget("java_import", "example_import", AttrNameToString{
 				"jars": `["import.jar"]`,
 			}),
 		}})
@@ -74,7 +74,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_import", "example_import", AttrNameToString{
+			MakeBazelTarget("java_import", "example_import", AttrNameToString{
 				"jars": `select({
         "//build/bazel/platforms/os:android": ["android.jar"],
         "//build/bazel/platforms/os:linux": ["linux.jar"],
diff --git a/bp2build/java_library_conversion_test.go b/bp2build/java_library_conversion_test.go
index b57cf35..4a4da18 100644
--- a/bp2build/java_library_conversion_test.go
+++ b/bp2build/java_library_conversion_test.go
@@ -51,11 +51,11 @@
     bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"srcs": `["a.java"]`,
 				"deps": `[":java-lib-2"]`,
 			}),
-			makeBazelTarget("java_library", "java-lib-2", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-2", AttrNameToString{
 				"srcs": `["b.java"]`,
 			}),
 		},
@@ -84,7 +84,7 @@
     bazel_module: { bp2build_available: false },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"srcs": `["a.java"]`,
 				"deps": `[
         ":java-lib-2",
@@ -110,7 +110,7 @@
     bazel_module: { bp2build_available: false },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"exports": `[":java-lib-2"]`,
 			}),
 		},
@@ -149,7 +149,7 @@
     bazel_module: { bp2build_available: false },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"plugins": `[":java-plugin-1"]`,
 			}),
 		},
@@ -166,7 +166,7 @@
     java_version: "11",
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"srcs":      `["a.java"]`,
 				"javacopts": `["-source 11 -target 11"]`,
 			}),
@@ -186,7 +186,7 @@
     },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"javacopts": `[
         "-Xsuper-fast",
         "-Xep:SpeedLimit:OFF",
@@ -208,7 +208,7 @@
     },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"javacopts": `["-Xsuper-fast"]`,
 				"srcs":      `["a.java"]`,
 			}),
@@ -228,7 +228,7 @@
     },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"javacopts": `["-Xsuper-fast"]`,
 				"srcs":      `["a.java"]`,
 			}),
@@ -252,13 +252,13 @@
         bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("event_log_tags", "example_lib_logtags", AttrNameToString{
+			MakeBazelTarget("event_log_tags", "example_lib_logtags", AttrNameToString{
 				"srcs": `[
         "a.logtag",
         "b.logtag",
     ]`,
 			}),
-			makeBazelTarget("java_library", "example_lib", AttrNameToString{
+			MakeBazelTarget("java_library", "example_lib", AttrNameToString{
 				"srcs": `[
         "a.java",
         "b.java",
@@ -280,7 +280,7 @@
 	java_resources: ["res/a.res", "res/b.res"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"resources": `[
         "res/a.res",
         "res/b.res",
@@ -302,7 +302,7 @@
 	java_resource_dirs: ["res"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"resource_strip_prefix": `"res"`,
 				"resources": `[
         "res/a.res",
@@ -326,7 +326,7 @@
 	exclude_java_resource_dirs: ["res/exclude"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"resource_strip_prefix": `"res"`,
 				"resources":             `["res/a.res"]`,
 			}),
@@ -347,7 +347,7 @@
 	exclude_java_resources: ["res/dir1/exclude.res"],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{
 				"resource_strip_prefix": `"res"`,
 				"resources": `[
         "res/a.res",
@@ -389,16 +389,16 @@
         bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{
+			MakeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{
 				"srcs": `[
         "a.aidl",
         "b.aidl",
     ]`,
 			}),
-			makeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
+			MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
 				"deps": `[":example_lib_aidl_library"]`,
 			}),
-			makeBazelTarget("java_library", "example_lib", AttrNameToString{
+			MakeBazelTarget("java_library", "example_lib", AttrNameToString{
 				"deps":    `[":example_lib_java_aidl_library"]`,
 				"exports": `[":example_lib_java_aidl_library"]`,
 				"srcs": `[
@@ -424,13 +424,13 @@
         bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{
+			MakeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{
 				"srcs": `["b.aidl"]`,
 			}),
-			makeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
+			MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
 				"deps": `[":example_lib_aidl_library"]`,
 			}),
-			makeBazelTarget("java_library", "example_lib", AttrNameToString{
+			MakeBazelTarget("java_library", "example_lib", AttrNameToString{
 				"deps":    `[":example_lib_java_aidl_library"]`,
 				"exports": `[":example_lib_java_aidl_library"]`,
 				"srcs":    `["a.java"]`,
@@ -478,10 +478,10 @@
         "b.aidl",
     ]`,
 			}),
-			makeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
+			MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{
 				"deps": `[":aidl_files"]`,
 			}),
-			makeBazelTarget("java_library", "example_lib", AttrNameToString{
+			MakeBazelTarget("java_library", "example_lib", AttrNameToString{
 				"deps":    `[":example_lib_java_aidl_library"]`,
 				"exports": `[":example_lib_java_aidl_library"]`,
 				"srcs": `[
@@ -523,10 +523,10 @@
 	],
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_aidl_library", "foo_java_aidl_library", AttrNameToString{
+			MakeBazelTarget("java_aidl_library", "foo_java_aidl_library", AttrNameToString{
 				"deps": `["//path/to/A:A_aidl"]`,
 			}),
-			makeBazelTarget("java_library", "foo", AttrNameToString{
+			MakeBazelTarget("java_library", "foo", AttrNameToString{
 				"exports": `[":foo_java_aidl_library"]`,
 			}),
 		},
diff --git a/bp2build/java_library_host_conversion_test.go b/bp2build/java_library_host_conversion_test.go
index 1dcf163..edd8690 100644
--- a/bp2build/java_library_host_conversion_test.go
+++ b/bp2build/java_library_host_conversion_test.go
@@ -46,7 +46,7 @@
     java_version: "9",
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_library", "java-lib-host-1", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-host-1", AttrNameToString{
 				"srcs": `["a.java"]`,
 				"deps": `[":java-lib-host-2"]`,
 				"target_compatible_with": `select({
@@ -54,7 +54,7 @@
         "//conditions:default": [],
     })`,
 			}),
-			makeBazelTarget("java_library", "java-lib-host-2", AttrNameToString{
+			MakeBazelTarget("java_library", "java-lib-host-2", AttrNameToString{
 				"javacopts": `["-source 1.9 -target 1.9"]`,
 				"srcs":      `["c.java"]`,
 				"target_compatible_with": `select({
diff --git a/bp2build/java_plugin_conversion_test.go b/bp2build/java_plugin_conversion_test.go
index 2d2e5ff..d9049d4 100644
--- a/bp2build/java_plugin_conversion_test.go
+++ b/bp2build/java_plugin_conversion_test.go
@@ -54,7 +54,7 @@
     bazel_module: { bp2build_available: false },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_plugin", "java-plug-1", AttrNameToString{
+			MakeBazelTarget("java_plugin", "java-plug-1", AttrNameToString{
 				"target_compatible_with": `select({
         "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
         "//conditions:default": [],
@@ -95,7 +95,7 @@
     bazel_module: { bp2build_available: false },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("java_plugin", "java-plug-1", AttrNameToString{
+			MakeBazelTarget("java_plugin", "java-plug-1", AttrNameToString{
 				"target_compatible_with": `select({
         "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
         "//conditions:default": [],
diff --git a/bp2build/java_proto_conversion_test.go b/bp2build/java_proto_conversion_test.go
index 6465641..df0df2f 100644
--- a/bp2build/java_proto_conversion_test.go
+++ b/bp2build/java_proto_conversion_test.go
@@ -70,7 +70,7 @@
     srcs: ["a.proto"],
 }`
 
-	protoLibrary := makeBazelTarget("proto_library", "java-protos_proto", AttrNameToString{
+	protoLibrary := MakeBazelTarget("proto_library", "java-protos_proto", AttrNameToString{
 		"srcs": `["a.proto"]`,
 	})
 
@@ -82,13 +82,13 @@
 			Blueprint:   fmt.Sprintf(bp, tc.protoType),
 			ExpectedBazelTargets: []string{
 				protoLibrary,
-				makeBazelTarget(
+				MakeBazelTarget(
 					tc.javaLibraryType,
 					javaLibraryName,
 					AttrNameToString{
 						"deps": `[":java-protos_proto"]`,
 					}),
-				makeBazelTarget("java_library", "java-protos", AttrNameToString{
+				MakeBazelTarget("java_library", "java-protos", AttrNameToString{
 					"exports": fmt.Sprintf(`[":%s"]`, javaLibraryName),
 				}),
 			},
@@ -106,16 +106,16 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("proto_library", "java-protos_proto", AttrNameToString{
+			MakeBazelTarget("proto_library", "java-protos_proto", AttrNameToString{
 				"srcs": `["a.proto"]`,
 			}),
-			makeBazelTarget(
+			MakeBazelTarget(
 				"java_lite_proto_library",
 				"java-protos_java_proto_lite",
 				AttrNameToString{
 					"deps": `[":java-protos_proto"]`,
 				}),
-			makeBazelTarget("java_library", "java-protos", AttrNameToString{
+			MakeBazelTarget("java_library", "java-protos", AttrNameToString{
 				"exports":   `[":java-protos_java_proto_lite"]`,
 				"javacopts": `["-source 1.7 -target 1.7"]`,
 			}),
diff --git a/bp2build/linker_config_conversion_test.go b/bp2build/linker_config_conversion_test.go
index 3b8a363..c4c4d87 100644
--- a/bp2build/linker_config_conversion_test.go
+++ b/bp2build/linker_config_conversion_test.go
@@ -37,7 +37,7 @@
 	src: "a.json",
 }
 `,
-			ExpectedBazelTargets: []string{makeBazelTarget("linker_config", "foo", AttrNameToString{
+			ExpectedBazelTargets: []string{MakeBazelTarget("linker_config", "foo", AttrNameToString{
 				"src": `"a.json"`,
 			})},
 		})
diff --git a/bp2build/ndk_headers_conversion_test.go b/bp2build/ndk_headers_conversion_test.go
new file mode 100644
index 0000000..c7cc6b2
--- /dev/null
+++ b/bp2build/ndk_headers_conversion_test.go
@@ -0,0 +1,164 @@
+// Copyright 2022 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 (
+	"fmt"
+	"testing"
+
+	"android/soong/cc"
+)
+
+func TestNdkHeaderFilepaths(t *testing.T) {
+	bpTemplate := `
+	ndk_headers {
+		name: "foo",
+		srcs: %v,
+		exclude_srcs: %v,
+	}
+	`
+	testCases := []struct {
+		desc         string
+		srcs         string
+		excludeSrcs  string
+		expectedHdrs string
+	}{
+		{
+			desc:         "Single header file",
+			srcs:         `["foo.h"]`,
+			excludeSrcs:  `[]`,
+			expectedHdrs: `["foo.h"]`,
+		},
+		{
+			desc:        "Multiple header files",
+			srcs:        `["foo.h", "foo_other.h"]`,
+			excludeSrcs: `[]`,
+			expectedHdrs: `[
+        "foo.h",
+        "foo_other.h",
+    ]`,
+		},
+		{
+			desc:         "Multiple header files with excludes",
+			srcs:         `["foo.h", "foo_other.h"]`,
+			excludeSrcs:  `["foo_other.h"]`,
+			expectedHdrs: `["foo.h"]`,
+		},
+		{
+			desc:        "Multiple header files via Soong-supported globs",
+			srcs:        `["*.h"]`,
+			excludeSrcs: `[]`,
+			expectedHdrs: `[
+        "foo.h",
+        "foo_other.h",
+    ]`,
+		},
+	}
+	for _, testCase := range testCases {
+		fs := map[string]string{
+			"foo.h":       "",
+			"foo_other.h": "",
+		}
+		expectedApiContributionTargetName := "foo.contribution"
+		expectedBazelTarget := MakeBazelTargetNoRestrictions(
+			"cc_api_headers",
+			expectedApiContributionTargetName,
+			AttrNameToString{
+				"hdrs": testCase.expectedHdrs,
+			},
+		)
+		RunBp2BuildTestCase(t, cc.RegisterNdkModuleTypes, Bp2buildTestCase{
+			Description:          testCase.desc,
+			Blueprint:            fmt.Sprintf(bpTemplate, testCase.srcs, testCase.excludeSrcs),
+			ExpectedBazelTargets: []string{expectedBazelTarget},
+			Filesystem:           fs,
+		})
+	}
+}
+
+func TestNdkHeaderIncludeDir(t *testing.T) {
+	bpTemplate := `
+	ndk_headers {
+		name: "foo",
+		from: %v,
+		to: "this/value/is/ignored",
+	}
+	`
+	testCases := []struct {
+		desc               string
+		from               string
+		expectedIncludeDir string
+	}{
+		{
+			desc:               "Empty `from` value",
+			from:               `""`,
+			expectedIncludeDir: `""`,
+		},
+		{
+			desc:               "Non-Empty `from` value",
+			from:               `"include"`,
+			expectedIncludeDir: `"include"`,
+		},
+	}
+	for _, testCase := range testCases {
+		expectedApiContributionTargetName := "foo.contribution"
+		expectedBazelTarget := MakeBazelTargetNoRestrictions(
+			"cc_api_headers",
+			expectedApiContributionTargetName,
+			AttrNameToString{
+				"include_dir": testCase.expectedIncludeDir,
+			},
+		)
+		RunBp2BuildTestCase(t, cc.RegisterNdkModuleTypes, Bp2buildTestCase{
+			Description:          testCase.desc,
+			Blueprint:            fmt.Sprintf(bpTemplate, testCase.from),
+			ExpectedBazelTargets: []string{expectedBazelTarget},
+		})
+	}
+}
+
+func TestVersionedNdkHeaderFilepaths(t *testing.T) {
+	bp := `
+	versioned_ndk_headers {
+		name: "common_libc",
+		from: "include"
+	}
+	`
+	fs := map[string]string{
+		"include/math.h":    "",
+		"include/stdio.h":   "",
+		"include/arm/arm.h": "",
+		"include/x86/x86.h": "",
+	}
+	expectedApiContributionTargetName := "common_libc.contribution"
+	expectedBazelTarget := MakeBazelTargetNoRestrictions(
+		"cc_api_headers",
+		expectedApiContributionTargetName,
+		AttrNameToString{
+			"include_dir": `"include"`,
+			"hdrs": `[
+        "include/math.h",
+        "include/stdio.h",
+        "include/arm/arm.h",
+        "include/x86/x86.h",
+    ]`,
+		},
+	)
+	RunBp2BuildTestCase(t, cc.RegisterNdkModuleTypes, Bp2buildTestCase{
+		Blueprint:            bp,
+		Filesystem:           fs,
+		ExpectedBazelTargets: []string{expectedBazelTarget},
+	})
+}
diff --git a/bp2build/prebuilt_etc_conversion_test.go b/bp2build/prebuilt_etc_conversion_test.go
index fce4c74..6738b4b 100644
--- a/bp2build/prebuilt_etc_conversion_test.go
+++ b/bp2build/prebuilt_etc_conversion_test.go
@@ -45,7 +45,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
+			MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
 				"filename":    `"tz_version"`,
 				"installable": `False`,
 				"src":         `"version/tz_version"`,
@@ -75,7 +75,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
+			MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
 				"filename":    `"tz_version"`,
 				"installable": `False`,
 				"src": `select({
@@ -114,7 +114,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
+			MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
 				"filename":    `"tz_version"`,
 				"installable": `False`,
 				"src": `select({
@@ -153,7 +153,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
+			MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
 				"filename":    `"tz_version"`,
 				"installable": `False`,
 				"src":         `"version/tz_version"`,
@@ -174,7 +174,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
+			MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{
 				"filename":    `"tz_version"`,
 				"installable": `False`,
 				"src":         `"version/tz_version"`,
diff --git a/bp2build/python_binary_conversion_test.go b/bp2build/python_binary_conversion_test.go
index 79da5d5..59055aa 100644
--- a/bp2build/python_binary_conversion_test.go
+++ b/bp2build/python_binary_conversion_test.go
@@ -42,7 +42,7 @@
       bazel_module: { bp2build_available: false },
     }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("py_binary", "foo", AttrNameToString{
+			MakeBazelTarget("py_binary", "foo", AttrNameToString{
 				"data":    `["files/data.txt"]`,
 				"deps":    `[":bar"]`,
 				"main":    `"a.py"`,
@@ -82,7 +82,7 @@
 }
 `,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("py_binary", "foo", AttrNameToString{
+			MakeBazelTarget("py_binary", "foo", AttrNameToString{
 				"python_version": `"PY2"`,
 				"imports":        `["."]`,
 				"srcs":           `["a.py"]`,
@@ -117,7 +117,7 @@
 `,
 		ExpectedBazelTargets: []string{
 			// python_version is PY3 by default.
-			makeBazelTarget("py_binary", "foo", AttrNameToString{
+			MakeBazelTarget("py_binary", "foo", AttrNameToString{
 				"imports": `["."]`,
 				"srcs":    `["a.py"]`,
 				"target_compatible_with": `select({
@@ -150,7 +150,7 @@
 					},
 				 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("py_binary", "foo-arm", AttrNameToString{
+			MakeBazelTarget("py_binary", "foo-arm", AttrNameToString{
 				"imports": `["."]`,
 				"srcs": `select({
         "//build/bazel/platforms/arch:arm": ["arm.py"],
diff --git a/bp2build/python_library_conversion_test.go b/bp2build/python_library_conversion_test.go
index 1d6061b..58587a6 100644
--- a/bp2build/python_library_conversion_test.go
+++ b/bp2build/python_library_conversion_test.go
@@ -35,7 +35,7 @@
 func convertPythonLibTestCaseToBp2build(tc pythonLibBp2BuildTestCase) Bp2buildTestCase {
 	var bp2BuildTargets []string
 	for _, t := range tc.expectedBazelTargets {
-		bp2BuildTargets = append(bp2BuildTargets, makeBazelTarget(t.typ, t.name, t.attrs))
+		bp2BuildTargets = append(bp2BuildTargets, MakeBazelTarget(t.typ, t.name, t.attrs))
 	}
 	// Copy the filesystem so that we can change stuff in it later without it
 	// affecting the original pythonLibBp2BuildTestCase
diff --git a/bp2build/sh_conversion_test.go b/bp2build/sh_conversion_test.go
index d8f701d..92b3a65 100644
--- a/bp2build/sh_conversion_test.go
+++ b/bp2build/sh_conversion_test.go
@@ -66,7 +66,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("sh_binary", "foo", AttrNameToString{
+			MakeBazelTarget("sh_binary", "foo", AttrNameToString{
 				"srcs":     `["foo.sh"]`,
 				"filename": `"foo.exe"`,
 				"sub_dir":  `"sub"`,
@@ -85,7 +85,7 @@
     bazel_module: { bp2build_available: true },
 }`,
 		ExpectedBazelTargets: []string{
-			makeBazelTarget("sh_binary", "foo", AttrNameToString{
+			MakeBazelTarget("sh_binary", "foo", AttrNameToString{
 				"srcs": `["foo.sh"]`,
 			})},
 	})
diff --git a/bp2build/testing.go b/bp2build/testing.go
index 0f321de..b64678d 100644
--- a/bp2build/testing.go
+++ b/bp2build/testing.go
@@ -444,6 +444,6 @@
 
 // makeBazelTargetNoRestrictions returns bazel target build file definition that is device specific
 // as this is the most common default in Soong.
-func makeBazelTarget(typ, name string, attrs AttrNameToString) string {
+func MakeBazelTarget(typ, name string, attrs AttrNameToString) string {
 	return makeBazelTargetHostOrDevice(typ, name, attrs, android.DeviceSupported)
 }
diff --git a/cc/Android.bp b/cc/Android.bp
index ce94467..2963c77 100644
--- a/cc/Android.bp
+++ b/cc/Android.bp
@@ -99,10 +99,12 @@
         "library_headers_test.go",
         "library_stub_test.go",
         "library_test.go",
+        "ndk_test.go",
         "object_test.go",
         "prebuilt_test.go",
         "proto_test.go",
         "sanitize_test.go",
+        "sdk_test.go",
         "test_data_test.go",
         "tidy_test.go",
         "vendor_public_library_test.go",
diff --git a/cc/androidmk.go b/cc/androidmk.go
index a957246..a9ba1a9 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -644,6 +644,16 @@
 	})
 }
 
+func (a *apiHeadersDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
+	entries.Class = "HEADER_LIBRARIES"
+	entries.SubName += multitree.GetApiImportSuffix()
+
+	entries.ExtraEntries = append(entries.ExtraEntries, func(_ android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) {
+		a.libraryDecorator.androidMkWriteExportedFlags(entries)
+		entries.SetBool("LOCAL_UNINSTALLABLE_MODULE", true)
+	})
+}
+
 func androidMkWriteAllowUndefinedSymbols(linker *baseLinker, entries *android.AndroidMkEntries) {
 	allow := linker.Properties.Allow_undefined_symbols
 	if allow != nil {
diff --git a/cc/binary.go b/cc/binary.go
index 849aafa..3351fd7 100644
--- a/cc/binary.go
+++ b/cc/binary.go
@@ -18,6 +18,7 @@
 	"path/filepath"
 
 	"android/soong/bazel/cquery"
+
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/proptools"
 
@@ -591,7 +592,7 @@
 	handler.module.linker.(*binaryDecorator).unstrippedOutputFile = outputFilePath
 }
 
-func binaryBp2build(ctx android.TopDownMutatorContext, m *Module, typ string) {
+func binaryBp2buildAttrs(ctx android.TopDownMutatorContext, m *Module) binaryAttributes {
 	baseAttrs := bp2BuildParseBaseProps(ctx, m)
 	binaryLinkerAttrs := bp2buildBinaryLinkerProps(ctx, m)
 
@@ -601,7 +602,7 @@
 		baseAttrs.implementationDeps.Add(baseAttrs.protoDependency)
 	}
 
-	attrs := &binaryAttributes{
+	attrs := binaryAttributes{
 		binaryLinkerAttrs: binaryLinkerAttrs,
 
 		Srcs:    baseAttrs.srcs,
@@ -644,12 +645,19 @@
 		sdkAttributes: bp2BuildParseSdkAttributes(m),
 	}
 
+	return attrs
+}
+
+func binaryBp2build(ctx android.TopDownMutatorContext, m *Module) {
+	// shared with cc_test
+	binaryAttrs := binaryBp2buildAttrs(ctx, m)
+
 	ctx.CreateBazelTargetModule(bazel.BazelTargetModuleProperties{
 		Rule_class:        "cc_binary",
 		Bzl_load_location: "//build/bazel/rules/cc:cc_binary.bzl",
 	},
 		android.CommonAttributes{Name: m.Name()},
-		attrs)
+		&binaryAttrs)
 }
 
 // binaryAttributes contains Bazel attributes corresponding to a cc binary
diff --git a/cc/builder.go b/cc/builder.go
index 35ae69b..cb21b1f 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -920,14 +920,14 @@
 
 // sourceAbiDiff registers a build statement to compare linked sAbi dump files (.lsdump).
 func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
-	baseName, prevVersion, exportedHeaderFlags string, diffFlags []string,
+	baseName, exportedHeaderFlags string, diffFlags []string, prevVersion int,
 	checkAllApis, isLlndk, isNdk, isVndkExt, previousVersionDiff bool) android.OptionalPath {
 
 	var outputFile android.ModuleOutPath
-	if prevVersion == "" {
-		outputFile = android.PathForModuleOut(ctx, baseName+".abidiff")
+	if previousVersionDiff {
+		outputFile = android.PathForModuleOut(ctx, baseName+"."+strconv.Itoa(prevVersion)+".abidiff")
 	} else {
-		outputFile = android.PathForModuleOut(ctx, baseName+"."+prevVersion+".abidiff")
+		outputFile = android.PathForModuleOut(ctx, baseName+".abidiff")
 	}
 	libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
 
@@ -946,14 +946,11 @@
 	if previousVersionDiff {
 		// TODO(b/241496591): Remove -advice-only after b/239792343 and b/239790286 are reolved.
 		extraFlags = append(extraFlags, "-advice-only")
-		errorMessage = "error: Please follow development/vndk/tools/header-checker/README.md to ensure the ABI compatibility between your source code and version " + prevVersion + "."
-		// The prevVersion is expected as a string of int, skip it if not.
-		if prevVersionInt, err := strconv.Atoi(prevVersion); err == nil {
-			sourceVersion := strconv.Itoa(prevVersionInt + 1)
-			extraFlags = append(extraFlags, "-target-version", sourceVersion)
-		}
+		errorMessage = "error: Please follow development/vndk/tools/header-checker/README.md to ensure the ABI compatibility between your source code and version " + strconv.Itoa(prevVersion) + "."
+		sourceVersion := prevVersion + 1
+		extraFlags = append(extraFlags, "-target-version", strconv.Itoa(sourceVersion))
 	} else {
-		errorMessage = "error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName
+		errorMessage = "error: Please update ABI references with: $$ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py -l " + libName
 		extraFlags = append(extraFlags, "-target-version", "current")
 	}
 
diff --git a/cc/cc.go b/cc/cc.go
index f1e9bf6..0ed9bb6 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -2302,9 +2302,14 @@
 		deps.RuntimeLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
 	}
 
-	for idx, lib := range deps.HeaderLibs {
-		deps.HeaderLibs[idx] = GetReplaceModuleName(lib, apiImports.HeaderLibs)
+	for idx, lib := range deps.SystemSharedLibs {
+		deps.SystemSharedLibs[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
 	}
+
+	for idx, lib := range deps.ReexportSharedLibHeaders {
+		deps.ReexportSharedLibHeaders[idx] = GetReplaceModuleName(lib, apiImports.SharedLibs)
+	}
+
 	return deps
 }
 
@@ -2348,9 +2353,14 @@
 			depTag.reexportFlags = true
 		}
 
+		// Check header lib replacement from API surface first, and then check again with VSDK
+		lib = GetReplaceModuleName(lib, apiImportInfo.HeaderLibs)
 		lib = GetReplaceModuleName(lib, GetSnapshot(c, &snapshotInfo, actx).HeaderLibs)
 
-		if c.IsStubs() {
+		if c.isNDKStubLibrary() {
+			// ndk_headers do not have any variations
+			actx.AddFarVariationDependencies([]blueprint.Variation{}, depTag, lib)
+		} else if c.IsStubs() && !c.isImportedApiLibrary() {
 			actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()),
 				depTag, lib)
 		} else {
@@ -3255,11 +3265,6 @@
 
 			return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix()
 		}
-
-		// Remove API import suffix if exists
-		if _, ok := ccDepModule.linker.(*apiLibraryDecorator); ok {
-			libName = strings.TrimSuffix(libName, multitree.GetApiImportSuffix())
-		}
 	}
 
 	if ctx.DeviceConfig().VndkUseCoreVariant() && ccDep.IsVndk() && !ccDep.MustUseVendorVariant() &&
@@ -3371,6 +3376,15 @@
 	return false
 }
 
+func (c *Module) testLibrary() bool {
+	if test, ok := c.linker.(interface {
+		testLibrary() bool
+	}); ok {
+		return test.testLibrary()
+	}
+	return false
+}
+
 func (c *Module) benchmarkBinary() bool {
 	if b, ok := c.linker.(interface {
 		benchmarkBinary() bool
@@ -3595,9 +3609,6 @@
 	if _, ok := c.linker.(prebuiltLinkerInterface); ok {
 		return nil
 	}
-	if _, ok := c.linker.(*apiLibraryDecorator); ok {
-		return nil
-	}
 
 	minSdkVersion := c.MinSdkVersion()
 	if minSdkVersion == "apex_inherit" {
@@ -3652,13 +3663,25 @@
 	staticLibrary
 	sharedLibrary
 	headerLibrary
+	testBin // testBinary already declared
 )
 
 func (c *Module) typ() moduleType {
-	if c.Binary() {
+	if c.testBinary() {
+		// testBinary is also a binary, so this comes before the c.Binary()
+		// conditional. A testBinary has additional implicit dependencies and
+		// other test-only semantics.
+		return testBin
+	} else if c.Binary() {
 		return binary
 	} else if c.Object() {
 		return object
+	} else if c.testLibrary() {
+		// TODO(b/244431896) properly convert cc_test_library to its own macro. This
+		// will let them add implicit compile deps on gtest, for example.
+		//
+		// For now, treat them as regular shared libraries.
+		return sharedLibrary
 	} else if c.CcLibrary() {
 		static := false
 		shared := false
@@ -3687,7 +3710,11 @@
 	switch c.typ() {
 	case binary:
 		if !prebuilt {
-			binaryBp2build(ctx, c, ctx.ModuleType())
+			binaryBp2build(ctx, c)
+		}
+	case testBin:
+		if !prebuilt {
+			testBinaryBp2build(ctx, c)
 		}
 	case object:
 		if !prebuilt {
@@ -3778,6 +3805,11 @@
 	return c.Properties.IsSdkVariant
 }
 
+func (c *Module) isImportedApiLibrary() bool {
+	_, ok := c.linker.(*apiLibraryDecorator)
+	return ok
+}
+
 func kytheExtractAllFactory() android.Singleton {
 	return &kytheExtractAllSingleton{}
 }
diff --git a/cc/library.go b/cc/library.go
index c97970e..8804bbb 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -1632,13 +1632,48 @@
 	return library.coverageOutputFile
 }
 
+// pathForVndkRefAbiDump returns an OptionalPath representing the path of the
+// reference abi dump for the given module. This is not guaranteed to be valid.
+func pathForVndkRefAbiDump(ctx android.ModuleInstallPathContext, version, fileName string,
+	isNdk, isVndk, isGzip bool) android.OptionalPath {
+
+	currentArchType := ctx.Arch().ArchType
+	primaryArchType := ctx.Config().DevicePrimaryArchType()
+	archName := currentArchType.String()
+	if currentArchType != primaryArchType {
+		archName += "_" + primaryArchType.String()
+	}
+
+	var dirName string
+	if isNdk {
+		dirName = "ndk"
+	} else if isVndk {
+		dirName = "vndk"
+	} else {
+		dirName = "platform" // opt-in libs
+	}
+
+	binderBitness := ctx.DeviceConfig().BinderBitness()
+
+	var ext string
+	if isGzip {
+		ext = ".lsdump.gz"
+	} else {
+		ext = ".lsdump"
+	}
+
+	return android.ExistentPathForSource(ctx, "prebuilts", "abi-dumps", dirName,
+		version, binderBitness, archName, "source-based",
+		fileName+ext)
+}
+
 func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path {
 	// The logic must be consistent with classifySourceAbiDump.
 	isNdk := ctx.isNdk(ctx.Config())
 	isVndk := ctx.useVndk() && ctx.isVndk()
 
-	refAbiDumpTextFile := android.PathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isVndk, false)
-	refAbiDumpGzipFile := android.PathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isVndk, true)
+	refAbiDumpTextFile := pathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isVndk, false)
+	refAbiDumpGzipFile := pathForVndkRefAbiDump(ctx, vndkVersion, fileName, isNdk, isVndk, true)
 
 	if refAbiDumpTextFile.Valid() {
 		if refAbiDumpGzipFile.Valid() {
@@ -1655,12 +1690,12 @@
 	return nil
 }
 
-func prevDumpRefVersion(ctx ModuleContext) string {
+func prevDumpRefVersion(ctx ModuleContext) int {
 	sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt()
 	sdkVersionStr := ctx.Config().PlatformSdkVersion().String()
 
 	if ctx.Config().PlatformSdkFinal() {
-		return strconv.Itoa(sdkVersionInt - 1)
+		return sdkVersionInt - 1
 	} else {
 		var dirName string
 
@@ -1676,9 +1711,9 @@
 		// This situation could be identified by checking the existence of the PLATFORM_SDK_VERION dump directory.
 		refDumpDir := android.ExistentPathForSource(ctx, "prebuilts", "abi-dumps", dirName, sdkVersionStr)
 		if refDumpDir.Valid() {
-			return sdkVersionStr
+			return sdkVersionInt
 		} else {
-			return strconv.Itoa(sdkVersionInt - 1)
+			return sdkVersionInt - 1
 		}
 	}
 }
@@ -1686,7 +1721,7 @@
 func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) {
 	if library.sabi.shouldCreateSourceAbiDump() {
 		var version string
-		var prevVersion string
+		var prevVersion int
 
 		if ctx.useVndk() {
 			// For modules linking against vndk, follow its vndk version
@@ -1718,12 +1753,13 @@
 
 		addLsdumpPath(classifySourceAbiDump(ctx) + ":" + library.sAbiOutputFile.String())
 
-		if prevVersion != "" {
-			prevRefAbiDumpFile := getRefAbiDumpFile(ctx, prevVersion, fileName)
+		// If NDK or PLATFORM library, check against previous version ABI.
+		if !ctx.useVndk() {
+			prevRefAbiDumpFile := getRefAbiDumpFile(ctx, strconv.Itoa(prevVersion), fileName)
 			if prevRefAbiDumpFile != nil {
 				library.prevSAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
-					prevRefAbiDumpFile, fileName, prevVersion, exportedHeaderFlags,
-					library.Properties.Header_abi_checker.Diff_flags,
+					prevRefAbiDumpFile, fileName, exportedHeaderFlags,
+					library.Properties.Header_abi_checker.Diff_flags, prevVersion,
 					Bool(library.Properties.Header_abi_checker.Check_all_apis),
 					ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), true)
 			}
@@ -1732,8 +1768,9 @@
 		refAbiDumpFile := getRefAbiDumpFile(ctx, version, fileName)
 		if refAbiDumpFile != nil {
 			library.sAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
-				refAbiDumpFile, fileName, "", exportedHeaderFlags,
+				refAbiDumpFile, fileName, exportedHeaderFlags,
 				library.Properties.Header_abi_checker.Diff_flags,
+				/* unused if not previousVersionDiff */ 0,
 				Bool(library.Properties.Header_abi_checker.Check_all_apis),
 				ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), false)
 		}
diff --git a/cc/library_stub.go b/cc/library_stub.go
index fa6c279..2ebb6ef 100644
--- a/cc/library_stub.go
+++ b/cc/library_stub.go
@@ -17,7 +17,6 @@
 import (
 	"android/soong/android"
 	"android/soong/multitree"
-	"strings"
 )
 
 func init() {
@@ -25,8 +24,10 @@
 }
 
 func RegisterLibraryStubBuildComponents(ctx android.RegistrationContext) {
-	// cc_api_stub_library shares a lot of ndk_library, and this will be refactored later
 	ctx.RegisterModuleType("cc_api_library", CcApiLibraryFactory)
+	ctx.RegisterModuleType("cc_api_headers", CcApiHeadersFactory)
+
+	// cc_api_stub_library shares a lot of ndk_library, and this will be refactored later
 	ctx.RegisterModuleType("cc_api_stub_library", CcApiStubLibraryFactory)
 	ctx.RegisterModuleType("cc_api_contribution", CcApiContributionFactory)
 }
@@ -81,6 +82,14 @@
 }
 
 func (d *apiLibraryDecorator) link(ctx ModuleContext, flags Flags, deps PathDeps, objects Objects) android.Path {
+	// Export headers as system include dirs if specified. Mostly for libc
+	if Bool(d.libraryDecorator.Properties.Llndk.Export_headers_as_system) {
+		d.libraryDecorator.flagExporter.Properties.Export_system_include_dirs = append(
+			d.libraryDecorator.flagExporter.Properties.Export_system_include_dirs,
+			d.libraryDecorator.flagExporter.Properties.Export_include_dirs...)
+		d.libraryDecorator.flagExporter.Properties.Export_include_dirs = nil
+	}
+
 	// Flags reexported from dependencies. (e.g. vndk_prebuilt_shared)
 	d.libraryDecorator.flagExporter.exportIncludes(ctx)
 	d.libraryDecorator.reexportDirs(deps.ReexportedDirs...)
@@ -114,9 +123,51 @@
 	return true
 }
 
-func (d *apiLibraryDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
-	d.libraryDecorator.libName = strings.TrimSuffix(ctx.ModuleName(), multitree.GetApiImportSuffix())
-	return d.libraryDecorator.linkerFlags(ctx, flags)
+// 'cc_api_headers' is similar with 'cc_api_library', but which replaces
+// header libraries. The module will replace any dependencies to existing
+// original header libraries.
+type apiHeadersDecorator struct {
+	*libraryDecorator
+}
+
+func CcApiHeadersFactory() android.Module {
+	module, decorator := NewLibrary(android.DeviceSupported)
+	apiHeadersDecorator := &apiHeadersDecorator{
+		libraryDecorator: decorator,
+	}
+	apiHeadersDecorator.HeaderOnly()
+
+	module.stl = nil
+	module.sanitize = nil
+	decorator.disableStripping()
+
+	module.compiler = nil
+	module.linker = apiHeadersDecorator
+	module.installer = nil
+
+	// Mark module as stub, so APEX would not include this stub in the package.
+	module.library.setBuildStubs(true)
+
+	// Prevent default system libs (libc, libm, and libdl) from being linked
+	if apiHeadersDecorator.baseLinker.Properties.System_shared_libs == nil {
+		apiHeadersDecorator.baseLinker.Properties.System_shared_libs = []string{}
+	}
+
+	apiHeadersDecorator.baseLinker.Properties.No_libcrt = BoolPtr(true)
+	apiHeadersDecorator.baseLinker.Properties.Nocrt = BoolPtr(true)
+
+	module.Init()
+
+	return module
+}
+
+func (d *apiHeadersDecorator) Name(basename string) string {
+	return basename + multitree.GetApiImportSuffix()
+}
+
+func (d *apiHeadersDecorator) availableFor(what string) bool {
+	// Stub from API surface should be available for any APEX.
+	return true
 }
 
 func CcApiStubLibraryFactory() android.Module {
diff --git a/cc/library_stub_test.go b/cc/library_stub_test.go
index c2ac941..cd06172 100644
--- a/cc/library_stub_test.go
+++ b/cc/library_stub_test.go
@@ -216,3 +216,112 @@
 	android.AssertBoolEquals(t, "original library should be linked", true, hasDirectDependency(t, ctx, libfoo, libbar))
 	android.AssertBoolEquals(t, "Stub library from API surface should not be linked", false, hasDirectDependency(t, ctx, libfoo, libbarApiImport))
 }
+
+func TestApiHeaderReplacesExistingModule(t *testing.T) {
+	bp := `
+		cc_library {
+			name: "libfoo",
+			header_libs: ["libfoo_headers"],
+		}
+
+		cc_api_library {
+			name: "libfoo",
+			header_libs: ["libfoo_headers"],
+			src: "libfoo.so",
+		}
+
+		cc_library_headers {
+			name: "libfoo_headers",
+		}
+
+		cc_api_headers {
+			name: "libfoo_headers",
+		}
+
+		api_imports {
+			name: "api_imports",
+			shared_libs: [
+				"libfoo",
+			],
+			header_libs: [
+				"libfoo_headers",
+			],
+		}
+	`
+
+	ctx := prepareForCcTest.RunTestWithBp(t, bp)
+
+	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
+	libfooApiImport := ctx.ModuleForTests("libfoo.apiimport", "android_arm64_armv8-a_shared").Module()
+	libfooHeader := ctx.ModuleForTests("libfoo_headers", "android_arm64_armv8-a").Module()
+	libfooHeaderApiImport := ctx.ModuleForTests("libfoo_headers.apiimport", "android_arm64_armv8-a").Module()
+
+	android.AssertBoolEquals(t, "original header should not be used for original library", false, hasDirectDependency(t, ctx, libfoo, libfooHeader))
+	android.AssertBoolEquals(t, "Header from API surface should be used for original library", true, hasDirectDependency(t, ctx, libfoo, libfooHeaderApiImport))
+	android.AssertBoolEquals(t, "original header should not be used for library imported from API surface", false, hasDirectDependency(t, ctx, libfooApiImport, libfooHeader))
+	android.AssertBoolEquals(t, "Header from API surface should be used for library imported from API surface", true, hasDirectDependency(t, ctx, libfooApiImport, libfooHeaderApiImport))
+}
+
+func TestApiHeadersDoNotRequireOriginalModule(t *testing.T) {
+	bp := `
+	cc_library {
+		name: "libfoo",
+		header_libs: ["libfoo_headers"],
+	}
+
+	cc_api_headers {
+		name: "libfoo_headers",
+	}
+
+	api_imports {
+		name: "api_imports",
+		shared_libs: [
+			"libfoo",
+		],
+		header_libs: [
+			"libfoo_headers",
+		],
+	}
+	`
+
+	ctx := prepareForCcTest.RunTestWithBp(t, bp)
+
+	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
+	libfooHeaderApiImport := ctx.ModuleForTests("libfoo_headers.apiimport", "android_arm64_armv8-a").Module()
+
+	android.AssertBoolEquals(t, "Header from API surface should be used for original library", true, hasDirectDependency(t, ctx, libfoo, libfooHeaderApiImport))
+}
+
+func TestApiHeadersShouldNotReplaceWithoutApiImport(t *testing.T) {
+	bp := `
+		cc_library {
+			name: "libfoo",
+			header_libs: ["libfoo_headers"],
+		}
+
+		cc_library_headers {
+			name: "libfoo_headers",
+		}
+
+		cc_api_headers {
+			name: "libfoo_headers",
+		}
+
+		api_imports {
+			name: "api_imports",
+			shared_libs: [
+				"libfoo",
+			],
+			header_libs: [],
+		}
+	`
+
+	ctx := prepareForCcTest.RunTestWithBp(t, bp)
+
+	libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_shared").Module()
+	libfooHeader := ctx.ModuleForTests("libfoo_headers", "android_arm64_armv8-a").Module()
+	libfooHeaderApiImport := ctx.ModuleForTests("libfoo_headers.apiimport", "android_arm64_armv8-a").Module()
+
+	android.AssertBoolEquals(t, "original header should be used for original library", true, hasDirectDependency(t, ctx, libfoo, libfooHeader))
+	android.AssertBoolEquals(t, "Header from API surface should not be used for original library", false, hasDirectDependency(t, ctx, libfoo, libfooHeaderApiImport))
+}
diff --git a/cc/ndk_headers.go b/cc/ndk_headers.go
index ef38a06..5e06948 100644
--- a/cc/ndk_headers.go
+++ b/cc/ndk_headers.go
@@ -19,8 +19,10 @@
 	"path/filepath"
 
 	"github.com/google/blueprint"
+	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
+	"android/soong/bazel"
 )
 
 var (
@@ -79,6 +81,7 @@
 
 type headerModule struct {
 	android.ModuleBase
+	android.BazelModuleBase
 
 	properties headerProperties
 
@@ -144,6 +147,47 @@
 	}
 }
 
+const (
+	apiContributionSuffix = ".contribution"
+)
+
+// apiContributionTargetName returns the name of the cc_api(headers|contribution) bp2build target of ndk modules
+// A suffix is necessary to prevent a name collision with the base ndk_(library|header) target in the same bp2build bazel package
+func apiContributionTargetName(moduleName string) string {
+	return moduleName + apiContributionSuffix
+}
+
+// TODO(b/243196151): Populate `system` and `arch` metadata
+type bazelCcApiHeadersAttributes struct {
+	Hdrs        bazel.LabelListAttribute
+	Include_dir *string
+}
+
+func createCcApiHeadersTarget(ctx android.TopDownMutatorContext, includes []string, excludes []string, include_dir *string) {
+	props := bazel.BazelTargetModuleProperties{
+		Rule_class:        "cc_api_headers",
+		Bzl_load_location: "//build/bazel/rules/apis:cc_api_contribution.bzl",
+	}
+	attrs := &bazelCcApiHeadersAttributes{
+		Hdrs: bazel.MakeLabelListAttribute(
+			android.BazelLabelForModuleSrcExcludes(
+				ctx,
+				includes,
+				excludes,
+			),
+		),
+		Include_dir: include_dir,
+	}
+	ctx.CreateBazelTargetModule(props, android.CommonAttributes{
+		Name: apiContributionTargetName(ctx.ModuleName()),
+	}, attrs)
+}
+
+func (h *headerModule) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
+	// Generate `cc_api_headers` target for Multi-tree API export
+	createCcApiHeadersTarget(ctx, h.properties.Srcs, h.properties.Exclude_srcs, h.properties.From)
+}
+
 // ndk_headers installs the sets of ndk headers defined in the srcs property
 // to the sysroot base + "usr/include" + to directory + directory component.
 // ndk_headers requires the license file to be specified. Example:
@@ -158,6 +202,7 @@
 	module := &headerModule{}
 	module.AddProperties(&module.properties)
 	android.InitAndroidModule(module)
+	android.InitBazelModule(module)
 	return module
 }
 
@@ -190,6 +235,7 @@
 // Note that this is really only built to handle bionic/libc/include.
 type versionedHeaderModule struct {
 	android.ModuleBase
+	android.BazelModuleBase
 
 	properties versionedHeaderProperties
 
@@ -197,6 +243,11 @@
 	licensePath  android.Path
 }
 
+// Return the glob pattern to find all .h files beneath `dir`
+func headerGlobPattern(dir string) string {
+	return filepath.Join(dir, "**", "*.h")
+}
+
 func (m *versionedHeaderModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
 	if String(m.properties.License) == "" {
 		ctx.PropertyErrorf("license", "field is required")
@@ -206,7 +257,7 @@
 
 	fromSrcPath := android.PathForModuleSrc(ctx, String(m.properties.From))
 	toOutputPath := getCurrentIncludePath(ctx).Join(ctx, String(m.properties.To))
-	srcFiles := ctx.GlobFiles(filepath.Join(fromSrcPath.String(), "**/*.h"), nil)
+	srcFiles := ctx.GlobFiles(headerGlobPattern(fromSrcPath.String()), nil)
 	var installPaths []android.WritablePath
 	for _, header := range srcFiles {
 		installDir := getHeaderInstallDir(ctx, header, String(m.properties.From), String(m.properties.To))
@@ -222,6 +273,13 @@
 	processHeadersWithVersioner(ctx, fromSrcPath, toOutputPath, srcFiles, installPaths)
 }
 
+func (h *versionedHeaderModule) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
+	// Glob all .h files under `From`
+	includePattern := headerGlobPattern(proptools.String(h.properties.From))
+	// Generate `cc_api_headers` target for Multi-tree API export
+	createCcApiHeadersTarget(ctx, []string{includePattern}, []string{}, h.properties.From)
+}
+
 func processHeadersWithVersioner(ctx android.ModuleContext, srcDir, outDir android.Path,
 	srcFiles android.Paths, installPaths []android.WritablePath) android.Path {
 	// The versioner depends on a dependencies directory to simplify determining include paths
@@ -271,16 +329,19 @@
 	module.AddProperties(&module.properties)
 
 	android.InitAndroidModule(module)
+	android.InitBazelModule(module)
 
 	return module
 }
 
-//	preprocessed_ndk_header {
-//	    name: "foo",
-//	    preprocessor: "foo.sh",
-//	    srcs: [...],
-//	    to: "android",
-//	}
+// preprocessed_ndk_header {
+//
+//	name: "foo",
+//	preprocessor: "foo.sh",
+//	srcs: [...],
+//	to: "android",
+//
+// }
 //
 // Will invoke the preprocessor as:
 //
diff --git a/cc/ndk_library.go b/cc/ndk_library.go
index 2bbfc4a..e2b9682 100644
--- a/cc/ndk_library.go
+++ b/cc/ndk_library.go
@@ -84,11 +84,13 @@
 //
 // Example:
 //
-//	ndk_library {
-//	    name: "libfoo",
-//	    symbol_file: "libfoo.map.txt",
-//	    first_version: "9",
-//	}
+// ndk_library {
+//
+//	name: "libfoo",
+//	symbol_file: "libfoo.map.txt",
+//	first_version: "9",
+//
+// }
 type libraryProperties struct {
 	// Relative path to the symbol map.
 	// An example file can be seen here: TODO(danalbert): Make an example.
@@ -109,6 +111,9 @@
 	// where it is enabled pending a fix for http://b/190554910 (no debug info
 	// for asm implemented symbols).
 	Allow_untyped_symbols *bool
+
+	// Headers presented by this library to the Public API Surface
+	Export_header_libs []string
 }
 
 type stubDecorator struct {
@@ -483,8 +488,11 @@
 	return objs
 }
 
+// Add a dependency on the header modules of this ndk_library
 func (linker *stubDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
-	return Deps{}
+	return Deps{
+		HeaderLibs: linker.properties.Export_header_libs,
+	}
 }
 
 func (linker *stubDecorator) Name(name string) string {
diff --git a/cc/ndk_sysroot.go b/cc/ndk_sysroot.go
index 6c200f5..622558e 100644
--- a/cc/ndk_sysroot.go
+++ b/cc/ndk_sysroot.go
@@ -57,15 +57,18 @@
 )
 
 func init() {
-	android.RegisterModuleType("ndk_headers", ndkHeadersFactory)
-	android.RegisterModuleType("ndk_library", NdkLibraryFactory)
-	android.RegisterModuleType("versioned_ndk_headers", versionedNdkHeadersFactory)
-	android.RegisterModuleType("preprocessed_ndk_headers", preprocessedNdkHeadersFactory)
-	android.RegisterSingletonType("ndk", NdkSingleton)
-
+	RegisterNdkModuleTypes(android.InitRegistrationContext)
 	pctx.Import("android/soong/android")
 }
 
+func RegisterNdkModuleTypes(ctx android.RegistrationContext) {
+	ctx.RegisterModuleType("ndk_headers", ndkHeadersFactory)
+	ctx.RegisterModuleType("ndk_library", NdkLibraryFactory)
+	ctx.RegisterModuleType("versioned_ndk_headers", versionedNdkHeadersFactory)
+	ctx.RegisterModuleType("preprocessed_ndk_headers", preprocessedNdkHeadersFactory)
+	ctx.RegisterSingletonType("ndk", NdkSingleton)
+}
+
 func getNdkInstallBase(ctx android.PathContext) android.InstallPath {
 	return android.PathForNdkInstall(ctx)
 }
diff --git a/cc/ndk_test.go b/cc/ndk_test.go
new file mode 100644
index 0000000..f20d3c6
--- /dev/null
+++ b/cc/ndk_test.go
@@ -0,0 +1,56 @@
+// Copyright 2022 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 cc
+
+import (
+	"testing"
+
+	"github.com/google/blueprint"
+
+	"android/soong/android"
+)
+
+func TestNdkHeaderDependency(t *testing.T) {
+	isDep := func(ctx *android.TestResult, from, toExpected android.Module) bool {
+		foundDep := false
+		ctx.VisitDirectDeps(from, func(toActual blueprint.Module) {
+			if toExpected.Name() == toActual.Name() {
+				foundDep = true
+			}
+		})
+		return foundDep
+	}
+	bp := `
+	ndk_library {
+		name: "libfoo",
+		first_version: "29",
+		symbol_file: "libfoo.map.txt",
+		export_header_libs: ["libfoo_headers"],
+	}
+	ndk_headers {
+		name: "libfoo_headers",
+		srcs: ["foo.h"],
+		license: "NOTICE",
+	}
+	//This module is needed since Soong creates a dep edge on source
+	cc_library {
+		name: "libfoo",
+	}
+	`
+	ctx := prepareForCcTest.RunTestWithBp(t, bp)
+	libfoo := ctx.ModuleForTests("libfoo.ndk", "android_arm64_armv8-a_sdk_shared")
+	libfoo_headers := ctx.ModuleForTests("libfoo_headers", "")
+	android.AssertBoolEquals(t, "Could not find headers of ndk_library", true, isDep(ctx, libfoo.Module(), libfoo_headers.Module()))
+}
diff --git a/cc/test.go b/cc/test.go
index f5abc45..3e85e2d 100644
--- a/cc/test.go
+++ b/cc/test.go
@@ -22,6 +22,7 @@
 	"github.com/google/blueprint/proptools"
 
 	"android/soong/android"
+	"android/soong/bazel"
 	"android/soong/tradefed"
 )
 
@@ -133,7 +134,7 @@
 // specific functionality on a device. The executable binary gets an implicit
 // static_libs dependency on libgtests unless the gtest flag is set to false.
 func TestFactory() android.Module {
-	module := NewTest(android.HostAndDeviceSupported)
+	module := NewTest(android.HostAndDeviceSupported, true)
 	return module.Init()
 }
 
@@ -156,7 +157,7 @@
 
 // cc_test_host compiles a test host binary.
 func TestHostFactory() android.Module {
-	module := NewTest(android.HostSupported)
+	module := NewTest(android.HostSupported, true)
 	return module.Init()
 }
 
@@ -204,6 +205,10 @@
 	test.binaryDecorator.Properties.Stem = StringPtr("")
 }
 
+func (test *testBinary) testBinary() bool {
+	return true
+}
+
 var _ testPerSrc = (*testBinary)(nil)
 
 func TestPerSrcMutator(mctx android.BottomUpMutatorContext) {
@@ -257,16 +262,10 @@
 }
 
 func (test *testDecorator) isolated(ctx BaseModuleContext) bool {
-	if !ctx.Windows() {
-		return BoolDefault(test.LinkerProperties.Isolated, false)
-	}
 	return BoolDefault(test.LinkerProperties.Isolated, false)
 }
 
-func (test *testDecorator) testBinary() bool {
-	return true
-}
-
+// NOTE: Keep this in sync with cc/cc_test.bzl#gtest_copts
 func (test *testDecorator) linkerFlags(ctx ModuleContext, flags Flags) Flags {
 	if !test.gtest() {
 		return flags
@@ -480,8 +479,8 @@
 	test.binaryDecorator.baseInstaller.install(ctx, file)
 }
 
-func NewTest(hod android.HostOrDeviceSupported) *Module {
-	module, binary := newBinary(hod, false)
+func NewTest(hod android.HostOrDeviceSupported, bazelable bool) *Module {
+	module, binary := newBinary(hod, bazelable)
 	module.multilib = android.MultilibBoth
 	binary.baseInstaller = NewTestInstaller()
 
@@ -504,6 +503,10 @@
 	*libraryDecorator
 }
 
+func (test *testLibrary) testLibrary() bool {
+	return true
+}
+
 func (test *testLibrary) linkerProps() []interface{} {
 	var props []interface{}
 	props = append(props, test.testDecorator.linkerProps()...)
@@ -543,6 +546,7 @@
 	}
 	module.linker = test
 	module.installer = test
+	module.bazelable = true
 	return module
 }
 
@@ -632,3 +636,56 @@
 	module.installer = benchmark
 	return module
 }
+
+// binaryAttributes contains Bazel attributes corresponding to a cc test
+type testBinaryAttributes struct {
+	binaryAttributes
+
+	Gtest    bool
+	Isolated bool
+	Data     bazel.LabelListAttribute
+}
+
+// testBinaryBp2build is the bp2build converter for cc_test modules. A cc_test's
+// dependency graph and compilation/linking steps are functionally similar to a
+// cc_binary, but has additional dependencies on test deps like gtest, and
+// produces additional runfiles like XML plans for Tradefed orchestration
+//
+// TODO(b/244432609): handle `isolated` property.
+// TODO(b/244432134): handle custom runpaths for tests that assume runfile layouts not
+// default to bazel. (see linkerInit function)
+// TODO(b/244432500): handle test.testConfig generation (see install function)
+func testBinaryBp2build(ctx android.TopDownMutatorContext, m *Module) {
+	var testBinaryAttrs testBinaryAttributes
+	testBinaryAttrs.binaryAttributes = binaryBp2buildAttrs(ctx, m)
+
+	testBinaryProps := m.GetArchVariantProperties(ctx, &TestBinaryProperties{})
+	for axis, configToProps := range testBinaryProps {
+		for config, props := range configToProps {
+			if p, ok := props.(*TestBinaryProperties); ok {
+				// Combine data, data_bins and data_libs into a single 'data' attribute.
+				var combinedData bazel.LabelList
+				combinedData.Append(android.BazelLabelForModuleSrc(ctx, p.Data))
+				combinedData.Append(android.BazelLabelForModuleDeps(ctx, p.Data_bins))
+				combinedData.Append(android.BazelLabelForModuleDeps(ctx, p.Data_libs))
+				testBinaryAttrs.Data.SetSelectValue(axis, config, combinedData)
+			}
+		}
+	}
+
+	for _, propIntf := range m.GetProperties() {
+		if testLinkerProps, ok := propIntf.(*TestLinkerProperties); ok {
+			testBinaryAttrs.Gtest = proptools.BoolDefault(testLinkerProps.Gtest, true)
+			testBinaryAttrs.Isolated = proptools.BoolDefault(testLinkerProps.Isolated, true)
+			break
+		}
+	}
+
+	ctx.CreateBazelTargetModule(
+		bazel.BazelTargetModuleProperties{
+			Rule_class:        "cc_test",
+			Bzl_load_location: "//build/bazel/rules/cc:cc_test.bzl",
+		},
+		android.CommonAttributes{Name: m.Name()},
+		&testBinaryAttrs)
+}
diff --git a/cc/testing.go b/cc/testing.go
index 44a865d..e42b9fa 100644
--- a/cc/testing.go
+++ b/cc/testing.go
@@ -41,6 +41,7 @@
 	ctx.RegisterModuleType("ndk_prebuilt_static_stl", NdkPrebuiltStaticStlFactory)
 	ctx.RegisterModuleType("ndk_prebuilt_object", NdkPrebuiltObjectFactory)
 	ctx.RegisterModuleType("ndk_library", NdkLibraryFactory)
+	ctx.RegisterModuleType("ndk_headers", ndkHeadersFactory)
 }
 
 func GatherRequiredDepsForTest(oses ...android.OsType) string {
diff --git a/cmd/soong_ui/main.go b/cmd/soong_ui/main.go
index cb85634..b06e4fe 100644
--- a/cmd/soong_ui/main.go
+++ b/cmd/soong_ui/main.go
@@ -176,10 +176,6 @@
 
 	build.SetupOutDir(buildCtx, config)
 
-	if config.UseBazel() && config.Dist() {
-		defer populateExternalDistDir(buildCtx, config)
-	}
-
 	// Set up files to be outputted in the log directory.
 	logsDir := config.LogsDir()
 
diff --git a/ui/build/build.go b/ui/build/build.go
index c61baa1..ecf11cc 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -104,10 +104,9 @@
 	// Whether to run ninja on the combined ninja.
 	RunNinja = 1 << iota
 	// Whether to run bazel on the combined ninja.
-	RunBazel        = 1 << iota
-	RunBuildTests   = 1 << iota
-	RunAll          = RunProductConfig | RunSoong | RunKati | RunKatiNinja | RunNinja
-	RunAllWithBazel = RunProductConfig | RunSoong | RunKati | RunKatiNinja | RunBazel
+	RunBazel      = 1 << iota
+	RunBuildTests = 1 << iota
+	RunAll        = RunProductConfig | RunSoong | RunKati | RunKatiNinja | RunNinja
 )
 
 // checkBazelMode fails the build if there are conflicting arguments for which bazel
@@ -256,9 +255,6 @@
 	SetupPath(ctx, config)
 
 	what := RunAll
-	if config.UseBazel() {
-		what = RunAllWithBazel
-	}
 	if config.Checkbuild() {
 		what |= RunBuildTests
 	}
diff --git a/ui/build/config.go b/ui/build/config.go
index 590aeb9..14a99d0 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -99,15 +99,9 @@
 
 	pathReplaced bool
 
-	// TODO(b/243077098): Remove useBazel.
-	useBazel      bool
 	bazelProdMode bool
 	bazelDevMode  bool
 
-	// During Bazel execution, Bazel cannot write outside OUT_DIR.
-	// So if DIST_DIR is set to an external dir (outside of OUT_DIR), we need to rig it temporarily and then migrate files at the end of the build.
-	riggedDistDirForBazel string
-
 	// Set by multiproduct_kati
 	emptyNinjaFile bool
 
@@ -439,21 +433,6 @@
 		ctx.Fatalf("Unable to remove bazel profile directory %q: %v", bpd, err)
 	}
 
-	ret.useBazel = ret.environ.IsEnvTrue("USE_BAZEL")
-
-	if ret.UseBazel() {
-		if err := os.MkdirAll(bpd, 0777); err != nil {
-			ctx.Fatalf("Failed to create bazel profile directory %q: %v", bpd, err)
-		}
-	}
-
-	if ret.UseBazel() {
-		ret.riggedDistDirForBazel = filepath.Join(ret.OutDir(), "dist")
-	} else {
-		// Not rigged
-		ret.riggedDistDirForBazel = ret.distDir
-	}
-
 	c := Config{ret}
 	storeConfigMetrics(ctx, c)
 	return c
@@ -486,7 +465,6 @@
 		ForceUseGoma:    proto.Bool(config.ForceUseGoma()),
 		UseGoma:         proto.Bool(config.UseGoma()),
 		UseRbe:          proto.Bool(config.UseRBE()),
-		BazelAsNinja:    proto.Bool(config.UseBazel()),
 		BazelMixedBuild: proto.Bool(config.BazelBuildEnabled()),
 	}
 	c.Targets = append(c.Targets, config.arguments...)
@@ -877,11 +855,7 @@
 }
 
 func (c *configImpl) DistDir() string {
-	if c.UseBazel() {
-		return c.riggedDistDirForBazel
-	} else {
-		return c.distDir
-	}
+	return c.distDir
 }
 
 func (c *configImpl) RealDistDir() string {
@@ -1129,11 +1103,6 @@
 	return false
 }
 
-// TODO(b/243077098): Remove UseBazel.
-func (c *configImpl) UseBazel() bool {
-	return c.useBazel
-}
-
 func (c *configImpl) BazelBuildEnabled() bool {
 	return c.bazelProdMode || c.bazelDevMode
 }
diff --git a/ui/build/config_test.go b/ui/build/config_test.go
index 63716b0..2887f59 100644
--- a/ui/build/config_test.go
+++ b/ui/build/config_test.go
@@ -1017,7 +1017,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(false),
 			},
 		},
@@ -1028,7 +1027,6 @@
 				ForceUseGoma:    proto.Bool(true),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(false),
 			},
 		},
@@ -1039,7 +1037,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(true),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(false),
 			},
 		},
@@ -1050,7 +1047,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(true),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(false),
 			},
 		},
@@ -1062,7 +1058,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(true),
 				BazelMixedBuild: proto.Bool(false),
 			},
 		},
@@ -1073,7 +1068,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(true),
 			},
 		},
@@ -1085,7 +1079,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(true),
 			},
 		},
@@ -1097,7 +1090,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(false),
 				BazelMixedBuild: proto.Bool(true),
 			},
 		},
@@ -1110,7 +1102,6 @@
 				ForceUseGoma:    proto.Bool(false),
 				UseGoma:         proto.Bool(false),
 				UseRbe:          proto.Bool(false),
-				BazelAsNinja:    proto.Bool(true),
 				BazelMixedBuild: proto.Bool(false),
 				Targets:         []string{"droid", "dist"},
 			},
@@ -1128,7 +1119,6 @@
 				ForceUseGoma:    proto.Bool(true),
 				UseGoma:         proto.Bool(true),
 				UseRbe:          proto.Bool(true),
-				BazelAsNinja:    proto.Bool(true),
 				BazelMixedBuild: proto.Bool(true),
 			},
 		},
@@ -1139,7 +1129,6 @@
 		t.Run(tc.name, func(t *testing.T) {
 			c := &configImpl{
 				environ:       &tc.environ,
-				useBazel:      tc.useBazel,
 				bazelDevMode:  tc.bazelDevMode,
 				bazelProdMode: tc.bazelProdMode,
 				arguments:     tc.arguments,