soog_ui程序的源码的位置在:build/soong/cmd/soong_ui目录下,有main.go和Android.bp。
2. Go基础 2.1 变量声明变量名在左,类型在右
var config build.Config
2.2 包引用
在main.go函数中引用build包,build中Config类型的定义。
15 package main
16
17 import (
18 "context"
19 "flag"
20 "fmt"
21 "os"
22 "path/filepath"
23 "strconv"
24 "strings"
25 "time"
26
27 "android/soong/ui/build"
28 "android/soong/ui/logger"
29 "android/soong/ui/tracer"
30 )
78 var config build.Config
79 if os.Args[1] == "--dumpvars-mode" || os.Args[1] == "--dumpvar-mode" {
80 config = build.NewConfig(buildCtx)
81 } else {
82 config = build.NewConfig(buildCtx, os.Args[1:]...)
83 }
在文件build/soong/ui/build/config.go中
15 package build
16
17 import (
18 "io/ioutil"
19 "log"
20 "os"
21 "path/filepath"
22 "runtime"
23 "strconv"
24 "strings"
25 "time"
26
27 "android/soong/shared"
28 )
30 type Config struct{ *configImpl }
31
32 type configImpl struct {
33 // From the environment
34 arguments []string
35 goma bool
36 environ *Environment
37
38 // From the arguments
39 parallel int
40 keepGoing int
41 verbose bool
42 checkbuild bool
43 dist bool
44 skipMake bool
45
46 // From the product config
47 katiArgs []string
48 ninjaArgs []string
49 katiSuffix string
50 targetDevice string
51 }
....
350 func (c *configImpl) Arguments() []string {
351 return c.arguments
352 }
在15行声明了是build包,在30行声明个Config结构,在32行定义这个结构。
如果想访问Config中的arguments成员,通过Arguments()函数,而不是直接访问arguments成员。
打印信息使用fmt.Fprintln函数,在85行中,使用Arguments()函数打印config中的arguments变量。
78 var config build.Config
79 if os.Args[1] == "--dumpvars-mode" || os.Args[1] == "--dumpvar-mode" {
80 config = build.NewConfig(buildCtx)
81 } else {
82 config = build.NewConfig(buildCtx, os.Args[1:]...)
83 }
84
85 fmt.Fprintln(os.Stderr, "tom 4=",config.Arguments());
3. soong_ui生成与运行
在lunch()—>build_build_var_cache()—>soong_ui.bash
574 function lunch()
575 {
576 local answer
....
622 TARGET_BUILD_VARIANT=$variant \
623 TARGET_PLATFORM_VERSION=$version \
624 build_build_var_cache
}
47 function build_build_var_cache()
48 {
49 local T=$(gettop)
50 # Grep out the variable names from the script.
51 cached_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
52 cached_abs_vars=`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`
53 # Call the build system to dump the "=" pairs as a shell script.
54 build_dicts_script=`\builtin cd $T; build/soong/soong_ui.bash --dumpvars-mode \
55 --vars="$cached_vars" \
56 --abs-vars="$cached_abs_vars" \
57 --var-prefix=var_cache_ \
58 --abs-var-prefix=abs_var_cache_`
}
soong_ui.sh的内容如下:
55 soong_build_go soong_ui android/soong/cmd/soong_ui
56
57 cd ${TOP}
58 exec "$(getoutdir)/soong_ui" "$@"
在55行中,编译main.go成soong_ui,在58行中执行soong_ui。
4. 调试方法在main.go添加debug信息,然后执行lunch命令,就可以Debug soong_ui。
5. dumpvars.go调试在dumpvars.go中,想通过mt.Fprintln(os.Stderr, “tom--------11112222”);需要"fmt"和"os"两个包,只需要添加os包就可以了。
17 import (
18 "bytes"
19 "fmt"
20 "strings"
21 "os"
22 )
fmt.Fprintln(os.Stderr, "tom--------11112222");
说明:
1)加入包"os",同时要使用这个包,使用语句fmt.Fprintln(os.Stderr, “tom--------11112222”);.
2)fmt.Printf("")语句,在lunch的终端无法显示。
作者:tom-wei