// FindSources searches for source files known to and writes them to the filesystem for
// use later.
// 在一个给定的上下文中,使用配置信息和 finder.Finder 实例来搜索特定类型的源文件,并将这些文件的路径列表写入到文件系统中,以便后续使用
func FindSources(ctx Context, config Config, f *finder.Finder) {
// note that dumpDir in FindSources may be different than dumpDir in NewSourceFinder
// if a caller such as multiproduct_kati wants to share one Finder among several builds
//1.创建目录:函数首先确定一个目录(dumpDir),用于存放后续生成的文件列表。使用 os.MkdirAll 确保该目录存在,并设置权限为 0777。
dumpDir := config.FileListDir()
os.MkdirAll(dumpDir, 0777)
//2.搜索 Android.mk 文件:
//使用 finder.Finder 实例(f)在当前目录(.)下搜索名为 Android.mk 的文件。
//搜索会在找到第一个 Android.mk 文件后停止递归搜索子目录。
//将搜索结果写入到 Android.mk.list 文件中。如果写入过程中发生错误,函数会调用 ctx.Fatalf 终止程序并报告错误。
// Stop searching a subdirectory recursively after finding an Android.mk.
androidMks := f.FindFirstNamedAt(".", "Android.mk")
err := dumpListToFile(ctx, config, androidMks, filepath.Join(dumpDir, "Android.mk.list"))
if err != nil {
ctx.Fatalf("Could not export module list: %v", err)
}
//3.收集和报告 Android.mk 文件指标:
//如果配置中指定了报告 mk 文件指标(config.reportMkMetrics),则计算并报告顶级和总的 Android.mk 文件数量。
//这部分是为了在需要时提供性能数据,但默认情况下不会执行,因为它会增加构建时间。
// Gate collecting/reporting mk metrics on builds that specifically request
// it, as identifying the total number of mk files adds 4-5ms onto null
// builds.
if config.reportMkMetrics {
androidMksTotal := f.FindNamedAt(".", "Android.mk")
ctx.Metrics.SetToplevelMakefiles(len(androidMks))
ctx.Metrics.SetTotalMakefiles(len(androidMksTotal))
ctx.Metrics.DumpMkMetrics(config.MkMetrics())
}
//4.搜索 CleanSpec.mk 文件:
//类似于 Android.mk 的搜索,但针对的是 CleanSpec.mk 文件。
//搜索结果写入到 CleanSpec.mk.list 文件中。
// Stop searching a subdirectory recursively after finding a CleanSpec.mk.
cleanSpecs := f.FindFirstNamedAt(".", "CleanSpec.mk")
err = dumpListToFile(ctx, config, cleanSpecs, filepath.Join(dumpDir, "CleanSpec.mk.list"))
if err != nil {
ctx.Fatalf("Could not export module list: %v", err)
}
//5.搜索 AndroidProducts.mk 文件:
//只在 device/、vendor/ 和 product/ 目录下递归搜索 AndroidProducts.mk 文件。
//搜索结果写入到 AndroidProducts.mk.list 文件中。
// Only consider AndroidProducts.mk in device/, vendor/ and product/, recursively in these directories.
androidProductsMks := f.FindNamedAt("device", "AndroidProducts.mk")
androidProductsMks = append(androidProductsMks, f.FindNamedAt("vendor", "AndroidProducts.mk")...)
androidProductsMks = append(androidProductsMks, f.FindNamedAt("product", "AndroidProducts.mk")...)
err = dumpListToFile(ctx, config, androidProductsMks, filepath.Join(dumpDir, "AndroidProducts.mk.list"))
if err != nil {
ctx.Fatalf("Could not export product list: %v", err)
}
//6.搜索 Bazel 相关文件:
//递归搜索所有与 Bazel 相关的文件(通过 findBazelFiles 函数定义)。
//搜索结果写入到 bazel.list 文件中。
// Recursively look for all Bazel related files.
bazelFiles := f.FindMatching(".", findBazelFiles)
err = dumpListToFile(ctx, config, bazelFiles, filepath.Join(dumpDir, "bazel.list"))
if err != nil {
ctx.Fatalf("Could not export bazel BUILD list: %v", err)
}
//7.搜索 OWNERS 文件:
//递归搜索所有 OWNERS 文件。
//搜索结果写入到 OWNERS.list 文件中。
// Recursively look for all OWNERS files.
owners := f.FindNamedAt(".", "OWNERS")
err = dumpListToFile(ctx, config, owners, filepath.Join(dumpDir, "OWNERS.list"))
if err != nil {
ctx.Fatalf("Could not find OWNERS: %v", err)
}
//8.搜索 TEST_MAPPING 文件:
//递归搜索所有 TEST_MAPPING 文件。
//搜索结果写入到 TEST_MAPPING.list 文件中。
// Recursively look for all TEST_MAPPING files.
testMappings := f.FindNamedAt(".", "TEST_MAPPING")
err = dumpListToFile(ctx, config, testMappings, filepath.Join(dumpDir, "TEST_MAPPING.list"))
if err != nil {
ctx.Fatalf("Could not find TEST_MAPPING: %v", err)
}
//9.搜索 Android.bp 文件:
//递归搜索所有 Android.bp 文件。
//如果没有找到任何 Android.bp 文件,则终止程序并报告错误。
//搜索结果写入到 Android.bp.list 文件中。
// Recursively look for all Android.bp files
androidBps := f.FindNamedAt(".", "Android.bp")
if len(androidBps) == 0 {
ctx.Fatalf("No Android.bp found")
}
err = dumpListToFile(ctx, config, androidBps, filepath.Join(dumpDir, "Android.bp.list"))
if err != nil {
ctx.Fatalf("Could not find modules: %v", err)
}
//10.搜索产品和板配置文件:
//递归搜索所有产品和板配置文件(通过 findProductAndBoardConfigFiles 函数定义)。
//搜索结果写入到 configuration.list 文件中。
// Recursively look for all product/board config files.
configurationFiles := f.FindMatching(".", findProductAndBoardConfigFiles)
err = dumpListToFile(ctx, config, configurationFiles, filepath.Join(dumpDir, "configuration.list"))
if err != nil {
ctx.Fatalf("Could not export product/board configuration list: %v", err)
}
//11.分发文件数据库:
//如果配置中指定了分发(config.Dist()),则等待数据库转储完成,并将 files.db(一个包含模块路径的明文数据库)分发出去。
if config.Dist() {
f.WaitForDbDump()
// Dist the files.db plain text database.
distFile(ctx, config, f.DbPath, "module_paths")
}
}