Android soong/ui/build/finder.go FindSources源码分析

// 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")
	}
}

你可能感兴趣的:(android,ui,golang)