本文共 8939 字,大约阅读时间需要 29 分钟。
soog_ui程序的源码的位置在:build/soong/cmd/soong_ui目录下,有main.go和Android.bp。
变量名在左,类型在右var config build.Config
在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());
在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。
在main.go添加debug信息,然后执行lunch命令,就可以Debug soong_ui。
在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的终端无法显示。转载地址:http://rafab.baihongyu.com/